resolve
continuous-integration/drone/push Build is failing Details

issue_022_AjoutAmis
David D'ALMEIDA 1 year ago
commit eb625309ce

@ -7,15 +7,17 @@ trigger:
- push
steps:
# Test ✔️
- name: test
image: composer:2.6
commands:
- cd Sources
# Installe les dépendances PHP si nécessaire
- composer install --no-interaction
- ./vendor/bin/phpunit
- ./vendor/bin/phpunit tests
# Sonar static code analisis deployment ✔️
# Sonar static code analisis deployment
# TODO : use an image that already have unzip
- name: code-analysis
image: php:8.1-cli

3
.gitignore vendored

@ -1,11 +1,12 @@
.idea
*.ben
node_modules
dist
.vscode
*.swp
*.swo
.env
.DS_Store
# Cache files for Sublime Text
*.tmlanguage.cache
*.tmPreferences.cache

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

@ -0,0 +1,113 @@
@startuml
skinparam classAttributeIconSize 0
package MLD{
entity "Athlète" as athlete {
{static} idAthlete
nom
prénom
email
sexe
taille
poids
motDePasse
dateNaissance
}
entity "Amitié" as friendship{
{static}# idAthlete1
{static}# idAthlete2
début
}
entity "Notification" as notif {
{static} idNotif
message
date
statut
urgence
#athleteId
}
entity "Coach" as coach {
{static} idCoach
// attributs spécifiques au coach
#athleteId
}
entity "Statistique" as stats {
{static} idStatistique
poids
fcMoyenne
fcMax
caloriesBrûléesMoy
date
#athleteId
}
entity "Entraînement" as training {
{static} idEntrainement
date
description
// Exercices
latitude
longitude
feedback
#coachId
}
entity "Participe" as takepart {
{static} #athleteId
{static} #entrainementId
}
entity "SourceDonnée" as source {
{static} idSource
type
modèle
précision
#athleteId
}
entity "Activité" as activity {
{static} idActivité
type
date
heureDeDébut
heureDeFin
effortRessent
variabilité
variance
ecartType
moyenne
maximum
minimum
temperatureMoyenne
#athleteId
#sourceId
}
entity "FréquenceCardiaque" as fc {
{static} idFc
altitude
temps : time
température
bpm
longitude
latitude
#activitéId
}
}
activity --> athlete
activity --> source
activity <-- fc
coach --> athlete
athlete <-- source
stats --> athlete
takepart --> athlete
takepart --> training
friendship --> athlete
notif --> athlete
coach <-- training
athlete <-- friendship
@enduml

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@ -90,7 +90,7 @@ Pour installer et exécuter le projet HeartTrack, suivez ces étapes :
3. Copiez le fichier de configuration d'exemple et configurez les paramètres de l'application :
cp config/config.example.php config/config.php
[pas encore la pour l'instant]
4. Importez la structure de la base de données à partir du fichier SQL fourni :
mysql -u votre_nom_utilisateur -p < db_schema.sql ou psql comme vous le souhaitez

@ -16,19 +16,30 @@
"src/data/stub/repository"
],
"Shared\\": "src/shared",
"Shared\\Exception\\": "src/shared/exception"
"App\\Router\\": "src/app/router",
"App\\Controller\\": "src/app/controller",
"App\\Router\\Response\\" : "src/app/router/response",
"App\\Router\\Middleware\\" : "src/app/router/middleware",
"App\\Router\\Request\\" : "src/app/router/request",
"Shared\\Exception\\": "src/shared/exception",
"Shared\\Attributes\\": "src/shared/attributes",
"App\\Views\\Directives\\" : "src/app/views/directives",
"Data\\Core\\": "src/data/core/"
}
},
"require": {
"twig/twig": "^3.0",
"vlucas/phpdotenv": "^5.5",
"adriangibbons/php-fit-file-analysis": "^3.2.0"
"adriangibbons/php-fit-file-analysis": "^3.2.0",
"altorouter/altorouter": "1.1.0",
"psr/container": "^2.0"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"scripts": {
"dev": "php -S localhost:8080 -t public -d display_errors=1 -d error_reporting=E_ALL",
"dev:console": "export APP_ENV=console && php public/index.php"
"dev:console": "export APP_ENV=console && php public/index.php",
"dev:html" : "export APP_ENV=html && php -S localhost:8080 -t public -d display_errors=1 -d error_reporting=E_ALL"
}
}

2212
Sources/composer.lock generated

File diff suppressed because it is too large Load Diff

@ -1,17 +0,0 @@
# Activer la réécriture d'URL
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
<Files *>
Order Allow,Deny
Deny from all
</Files>
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

@ -1,4 +1,4 @@
FROM php:8.2-apache
FROM php:8.2-fpm
# Installation de dépendances nécessaires pour Composer
RUN apt-get update && apt-get install -y \
git \
@ -10,10 +10,8 @@ RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local
RUN docker-php-ext-install pdo pdo_mysql
COPY . /var/www/html
COPY . /var/www/
WORKDIR /var/www/html
RUN chown -R www-data:www-data /var/www/html
RUN composer install
EXPOSE 80
WORKDIR /var/www/
RUN composer install

@ -1,19 +1,21 @@
<?php
// use Dotenv\Dotenv;
// $dotenv = Dotenv::createImmutable(__DIR__);
// $dotenv->load();
use Dotenv\Dotenv;
use Shared\Log;
$dotenv = Dotenv::createUnsafeImmutable(__DIR__,'.env');
$dotenv->safeLoad();
// apenrently getEnv is not a good thing cause
// const DB_HOST = $_ENV['DB_HOST'] ?? 'localhost';
// const DB_DATABASE = $_ENV['DB_DATABASE'] ?? 'heartTrack';
// const DB_USER = $_ENV['DB_USER'] ?? 'toto';
// const DB_PASSWORD = $_ENV['DB_PASSWORD'] ?? 'achanger';
// const APP_ENV = $_ENV['APP_ENV'] ?? 'development';
define("APP_ENV", 'development');
const DB_HOST = 'localhost';
const DB_DATABASE = 'heartTrack';
const DB_USER = 'toto';
const DB_PASSWORD = 'achanger';
const APP_ENV = 'console';
const DSN = "mysql:host=" . DB_HOST . ";dbname=" . DB_DATABASE;

@ -1,21 +1,28 @@
server {
listen 80;
server_name localhost;
index index.php;
root /var/www/public;
error_page 404 /index.php;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/public;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000; # service name defined in docker-compose.yml file
fastcgi_pass web:9000; # service name defined in docker-compose.yml file like web
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}

@ -1,15 +1,42 @@
version: '3'
services:
web:
nginx:
image: nginx:latest
ports:
- "8080:80"
- "3000:80"
volumes:
- ./public:/var/www/html
- ./config/nginx.conf:/etc/nginx/conf.d
links:
- php
php:
image: php:7.4-fpm
- ./config/nginx.conf:/etc/nginx/conf.d/default.conf
- .:/var/www
depends_on:
- mysql
- web
web:
build:
context: .
dockerfile: ./config/Dockerfile
ports:
- 9000:9000
volumes:
- ./src:/var/www/html
- .:/var/www
depends_on:
- mysql
environment:
DB_HOST: mysql
DB_PORT: port
DB_DATABASE: test
DB_USER: user
DB_PASSWORD: pass
APP_ENV: development
mysql:
image: mysql:latest
container_name: my-mysql-container
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: test
MYSQL_USER: user
MYSQL_PASSWORD: pass
ports:
- "3307:3306"

@ -0,0 +1,54 @@
// Set new default font family and font color to mimic Bootstrap's default styling
Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif';
Chart.defaults.global.defaultFontColor = '#292b2c';
// Area Chart Example
var ctx = document.getElementById("myAreaChart");
var myLineChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["Mar 1", "Mar 2", "Mar 3", "Mar 4", "Mar 5", "Mar 6", "Mar 7", "Mar 8", "Mar 9", "Mar 10", "Mar 11", "Mar 12", "Mar 13"],
datasets: [{
label: "Sessions",
lineTension: 0.3,
backgroundColor: "rgba(2,117,216,0.2)",
borderColor: "rgba(2,117,216,1)",
pointRadius: 5,
pointBackgroundColor: "rgba(2,117,216,1)",
pointBorderColor: "rgba(255,255,255,0.8)",
pointHoverRadius: 5,
pointHoverBackgroundColor: "rgba(2,117,216,1)",
pointHitRadius: 50,
pointBorderWidth: 2,
data: [10000, 30162, 26263, 18394, 18287, 28682, 31274, 33259, 25849, 24159, 32651, 31984, 38451],
}],
},
options: {
scales: {
xAxes: [{
time: {
unit: 'date'
},
gridLines: {
display: false
},
ticks: {
maxTicksLimit: 7
}
}],
yAxes: [{
ticks: {
min: 0,
max: 40000,
maxTicksLimit: 5
},
gridLines: {
color: "rgba(0, 0, 0, .125)",
}
}],
},
legend: {
display: false
}
}
});

@ -0,0 +1,46 @@
// Set new default font family and font color to mimic Bootstrap's default styling
Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif';
Chart.defaults.global.defaultFontColor = '#292b2c';
// Bar Chart Example
var ctx = document.getElementById("myBarChart");
var myLineChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ["January", "February", "March", "April", "May", "June"],
datasets: [{
label: "Revenue",
backgroundColor: "rgba(2,117,216,1)",
borderColor: "rgba(2,117,216,1)",
data: [4215, 5312, 6251, 7841, 9821, 14984],
}],
},
options: {
scales: {
xAxes: [{
time: {
unit: 'month'
},
gridLines: {
display: false
},
ticks: {
maxTicksLimit: 6
}
}],
yAxes: [{
ticks: {
min: 0,
max: 15000,
maxTicksLimit: 5
},
gridLines: {
display: true
}
}],
},
legend: {
display: false
}
}
});

@ -0,0 +1,16 @@
// Set new default font family and font color to mimic Bootstrap's default styling
Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif';
Chart.defaults.global.defaultFontColor = '#292b2c';
// Pie Chart Example
var ctx = document.getElementById("myPieChart");
var myPieChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ["Blue", "Red", "Yellow", "Green"],
datasets: [{
data: [12.21, 15.58, 11.25, 8.32],
backgroundColor: ['#007bff', '#dc3545', '#ffc107', '#28a745'],
}],
},
});

@ -0,0 +1,4 @@
// Call the dataTables jQuery plugin
$(document).ready(function() {
$('#dataTable').DataTable();
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 972 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

@ -0,0 +1,948 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:i="&amp;ns_ai;"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="upload your files.svg"
xml:space="preserve"
enable-background="new 0 0 600 410"
viewBox="0 0 600 410"
height="410px"
width="600px"
y="0px"
x="0px"
id="Layer_1"
version="1.1"><metadata
id="metadata155"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs153" /><sodipodi:namedview
inkscape:current-layer="g110"
inkscape:window-maximized="0"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="205"
inkscape:cx="300"
inkscape:zoom="1.895"
showgrid="false"
id="namedview151"
inkscape:window-height="1114"
inkscape:window-width="2025"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<switch
id="switch148">
<foreignObject
height="1"
width="1"
y="0"
x="0"
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
<i:aipgfRef
xlink:href="#adobe_illustrator_pgf">
</i:aipgfRef>
</foreignObject>
<g
id="g146"
i:extraneous="self">
<g
id="g110">
<path
id="path2"
d="M240,351.7h103.6c1.9,0,3.5-1.8,3.5-3.8v-66.8c0-2.2-1.6-3.8-3.6-3.8l-61.5,0.2c-1,0-1.8-0.4-2.5-1.1 l-6.3-6.8c-0.6-0.7-1.6-1.1-2.5-1.1H240c-1.9,0-3.5,1.8-3.5,3.8V348C236.5,350,238,351.7,240,351.7z"
fill="#383838" />
<path
id="path4"
d="M341.1,333h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C344.1,331.7,342.8,333,341.1,333z"
fill="#FFFFFF" />
<g
id="g50"
opacity="0.1">
<path
id="path6"
d="M341.2,333.5h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1 c1.6,0,2.9,1.3,2.9,2.9v48C344.1,332.2,342.9,333.5,341.2,333.5z"
fill-opacity="0"
fill="#383838" />
<path
id="path8"
d="M341.4,333.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.2,332.3,342.9,333.6,341.4,333.6z"
enable-background="new "
fill="#383838"
opacity="4.761905e-02" />
<path
id="path10"
d="M341.5,333.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.4,332.4,343,333.6,341.5,333.6z"
enable-background="new "
fill="#383838"
opacity="9.523810e-02" />
<path
id="path12"
d="M341.6,333.8h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.5,332.4,343.2,333.8,341.6,333.8z"
enable-background="new "
fill="#383838"
opacity="0.1429" />
<path
id="path14"
d="M341.6,333.9h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h97.9c1.6,0,2.9,1.3,2.9,2.9v48C344.6,332.6,343.3,333.9,341.6,333.9z"
enable-background="new "
fill="#383838"
opacity="0.1905" />
<path
id="path16"
d="M341.7,333.9h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.6,332.6,343.4,333.9,341.7,333.9z"
enable-background="new "
fill="#383838"
opacity="0.2381" />
<path
id="path18"
d="M341.8,334h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.7,332.7,343.4,334,341.8,334z"
enable-background="new "
fill="#383838"
opacity="0.2857" />
<path
id="path20"
d="M342,334.1h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H342c1.6,0,2.9,1.3,2.9,2.9v48C344.8,332.8,343.5,334.1,342,334.1z"
enable-background="new "
fill="#383838"
opacity="0.3333" />
<path
id="path22"
d="M342,334.1h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345,332.9,343.6,334.1,342,334.1z"
enable-background="new "
fill="#383838"
opacity="0.381" />
<path
id="path24"
d="M342.1,334.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345,332.9,343.6,334.2,342.1,334.2z"
enable-background="new "
fill="#383838"
opacity="0.4286" />
<path
id="path26"
d="M342.2,334.4h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v47.9C345.1,333,343.9,334.4,342.2,334.4z"
enable-background="new "
fill="#383838"
opacity="0.4762" />
<path
id="path28"
d="M342.3,334.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.2,333,343.9,334.4,342.3,334.4z"
enable-background="new "
fill="#383838"
opacity="0.5238" />
<path
id="path30"
d="M342.4,334.5h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.3,333.2,344,334.5,342.4,334.5z"
enable-background="new "
fill="#383838"
opacity="0.5714" />
<path
id="path32"
d="M342.4,334.6h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.4,333.3,344.1,334.6,342.4,334.6z"
enable-background="new "
fill="#383838"
opacity="0.619" />
<path
id="path34"
d="M342.6,334.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.4,333.4,344.1,334.6,342.6,334.6z"
enable-background="new "
fill="#383838"
opacity="0.6667" />
<path
id="path36"
d="M342.7,334.7h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.6,333.4,344.2,334.7,342.7,334.7z"
enable-background="new "
fill="#383838"
opacity="0.7143" />
<path
id="path38"
d="M342.7,334.8h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.7,333.5,344.4,334.8,342.7,334.8z"
enable-background="new "
fill="#383838"
opacity="0.7619" />
<path
id="path40"
d="M342.9,334.8h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H343c1.6,0,2.9,1.3,2.9,2.9v48C345.8,333.5,344.5,334.8,342.9,334.8z"
enable-background="new "
fill="#383838"
opacity="0.8095" />
<path
id="path42"
d="M342.9,335H245c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98c1.6,0,2.9,1.3,2.9,2.9v48C345.8,333.6,344.5,335,342.9,335z"
enable-background="new "
fill="#383838"
opacity="0.8571" />
<path
id="path44"
d="M343,335.1h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98c1.6,0,2.9,1.3,2.9,2.9v48C345.9,333.8,344.6,335.1,343,335.1z"
enable-background="new "
fill="#383838"
opacity="0.9048" />
<path
id="path46"
d="M343.2,335.1h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346,333.8,344.7,335.1,343.2,335.1z"
enable-background="new "
fill="#383838"
opacity="0.9524" />
<path
id="path48"
d="M343.2,335.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C346.1,333.9,344.8,335.2,343.2,335.2z"
fill="#383838" />
</g>
<path
id="path52"
d="M342.8,335.2h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C345.7,333.9,344.4,335.2,342.8,335.2z"
fill="#FFFFFF" />
<g
id="g98"
opacity="0.1">
<path
id="path54"
d="M343,335.7h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1 c1.6,0,2.9,1.3,2.9,2.9v48C345.9,334.4,344.6,335.7,343,335.7z"
fill-opacity="0"
fill="#383838" />
<path
id="path56"
d="M343.2,335.8h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346,334.5,344.8,335.8,343.2,335.8z"
enable-background="new "
fill="#383838"
opacity="4.761905e-02" />
<path
id="path58"
d="M343.3,335.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.1,334.6,344.8,335.9,343.3,335.9z"
enable-background="new "
fill="#383838"
opacity="9.523810e-02" />
<path
id="path60"
d="M343.4,335.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.3,334.6,345,335.9,343.4,335.9z"
enable-background="new "
fill="#383838"
opacity="0.1429" />
<path
id="path62"
d="M343.4,336h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.4,334.7,345.1,336,343.4,336z"
enable-background="new "
fill="#383838"
opacity="0.1905" />
<path
id="path64"
d="M343.5,336h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.4,334.8,345.1,336,343.5,336z"
enable-background="new "
fill="#383838"
opacity="0.2381" />
<path
id="path66"
d="M343.6,336.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.5,334.8,345.2,336.2,343.6,336.2z"
enable-background="new "
fill="#383838"
opacity="0.2857" />
<path
id="path68"
d="M343.6,336.3h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.6,335,345.3,336.3,343.6,336.3z"
enable-background="new "
fill="#383838"
opacity="0.3333" />
<path
id="path70"
d="M343.9,336.4h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.7,335.1,345.4,336.4,343.9,336.4z"
enable-background="new "
fill="#383838"
opacity="0.381" />
<path
id="path72"
d="M343.9,336.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H344c1.6,0,2.9,1.3,2.9,2.9v48C346.7,335.1,345.4,336.4,343.9,336.4z"
enable-background="new "
fill="#383838"
opacity="0.4286" />
<path
id="path74"
d="M344,336.5h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H344c1.6,0,2.9,1.3,2.9,2.9v48C346.9,335.2,345.6,336.5,344,336.5z"
enable-background="new "
fill="#383838"
opacity="0.4762" />
<path
id="path76"
d="M344.1,336.5h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347,335.3,345.7,336.5,344.1,336.5z"
enable-background="new "
fill="#383838"
opacity="0.5238" />
<path
id="path78"
d="M344.1,336.6h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.1,335.3,345.8,336.6,344.1,336.6z"
enable-background="new "
fill="#383838"
opacity="0.5714" />
<path
id="path80"
d="M344.2,336.8h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.2,335.4,345.9,336.8,344.2,336.8z"
enable-background="new "
fill="#383838"
opacity="0.619" />
<path
id="path82"
d="M344.4,336.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48.1 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.2,335.6,345.9,336.9,344.4,336.9z"
enable-background="new "
fill="#383838"
opacity="0.6667" />
<path
id="path84"
d="M344.5,336.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.3,335.6,346,336.9,344.5,336.9z"
enable-background="new "
fill="#383838"
opacity="0.7143" />
<path
id="path86"
d="M344.5,337h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.5,335.7,346.1,337,344.5,337z"
enable-background="new "
fill="#383838"
opacity="0.7619" />
<path
id="path88"
d="M344.6,337h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.5,335.8,346.3,337,344.6,337z"
enable-background="new "
fill="#383838"
opacity="0.8095" />
<path
id="path90"
d="M344.7,337.1h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.6,335.8,346.3,337.1,344.7,337.1z"
enable-background="new "
fill="#383838"
opacity="0.8571" />
<path
id="path92"
d="M344.8,337.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.7,335.9,346.4,337.2,344.8,337.2z"
enable-background="new "
fill="#383838"
opacity="0.9048" />
<path
id="path94"
d="M345,337.2h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H345c1.6,0,2.9,1.3,2.9,2.9v48C347.8,335.9,346.5,337.2,345,337.2z"
enable-background="new "
fill="#383838"
opacity="0.9524" />
<path
id="path96"
d="M345,337.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C347.9,336,346.6,337.4,345,337.4z"
fill="#383838" />
</g>
<path
id="path100"
d="M345,337.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C347.9,336,346.6,337.4,345,337.4z"
fill="#FFFFFF" />
<g
id="g104">
<path
id="path102"
d="M346.4,364.4H236.5c-2,0-3.7-1.7-3.7-3.8v-66c0-2,1.7-3.8,3.8-3.8h55.2c1,0,1.3-0.1,2-0.8l6.7-6.7 c0.7-0.7,1.7-1.1,2.6-1.1h43.2c2,0,3.7,1.7,3.7,3.8v74.6C350.1,362.7,348.4,364.4,346.4,364.4z"
fill="#55ACEE" />
</g>
</g>
<path
id="path112"
d="M382,79.8h-7.1c0.1-0.7,0.1-1.3,0.1-2c0-13.3-10.8-24.2-24.2-24.2c-2,0-3.6,0-5,0 c-5.5-20-23.8-34.7-45.6-34.7c-21.7,0-40,14.7-45.6,34.7c-1.4,0-3.1,0-5,0c-13.3,0-24.2,10.8-24.2,24.2c0,0.7,0,1.3,0.1,2h-7.1 c-15,0-27.2,12.2-27.2,27.2l0,0c0,15,12.2,27.2,27.2,27.2h163.5c15,0,27.2-12.2,27.2-27.2l0,0C409.2,92,397,79.8,382,79.8z"
fill="#58AEF3" />
<rect
id="rect114"
height="80"
width="34.3"
fill="#383838"
y="186.9"
x="278.9" />
<path
id="path116"
d="M269.6,203.7c17.5-3.4,35.3-3.5,52.8-0.3l-27.4-60.2L269.6,203.7z"
fill="#383838" />
<g
id="g120">
<path
id="path118"
d="M296,245.1c-7.2,0-13.1-5.9-13.1-13.1s5.9-13.1,13.1-13.1s13.1,5.9,13.1,13.1S303.3,245.1,296,245.1z M296,219.9c-6.6,0-12,5.4-12,12s5.4,12,12,12s12-5.4,12-12S302.6,219.9,296,219.9z"
fill="#FFFFFF" />
</g>
<g
id="g124">
<path
id="path122"
d="M294.3,238.3c-0.4,0-0.9-0.2-1.3-0.5l-4.3-3.6c-0.8-0.7-0.9-1.9-0.2-2.8c0.7-0.8,1.9-0.9,2.8-0.2l3,2.5 l7.5-6.9c0.8-0.7,2-0.7,2.8,0.1c0.8,0.8,0.7,2-0.1,2.8l-8.8,8.1C295.3,238.1,294.8,238.3,294.3,238.3z"
fill="#FFFFFF" />
</g>
</g>
</switch>
<i:aipgf
i:pgfVersion="24"
i:pgfEncoding="zstd/base64"
id="adobe_illustrator_pgf">
<![CDATA[
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
]]>
<![CDATA[
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
ayTKvk8GhdEahinIJv9tHMwgTRixL/pMDFCewKk20gyZspviNNXfSw0cMKWCdPdgGDtjxZHCFE4L
L/scWIrYl8UQfg8JLXpKWeEJyN4IKSuJ+qsIHN63cR6XquGNlBDDC7lUDQ+UGjU80sfS8DaEgOFx
eXO67IrMEkPUgBZkpQo3lVLzbMgsh6lU4aWS4hGr0ljVFY+XRogkeKyKVd/GdUdhv7SjsGmn9CSV
SCXSB4GeLhvVEApjT0qoTF5l8qpl8jt6UBgbTXCES6NfqLQIlVLzDC0W4WKV0Y4GY7HKaFRd9cwz
88w8KaikUledUKmrJoD/J5J0AphgQfAlSJGkfwYPgj6wJXPk5DcvrUmIySjeY5qE1DwvCsnrL54r
o7gmZMko/hmZ1MVTVyq/FRBkXBQQCwLDAaEwNoMBsXyIFbcgYBIebkFQ1DAzBeVEYexK7HdKl5Q7
q6UWM9cBujDXkiPKLKGd7Pzou+/d9qQnNdl72cmuS8+3L/2mj+M4+u55N5ae79L8ndz//w3Jd+f5
HsdPbjpZjr7/Tpbj6MeRe775/ffR5CZJ+j5qtG/+TO+Sd74/7xvuR/03o9bek6pP9ZGqb6P6NqpP
b/z3fcP9uLc2/dZai8bR996Nn2/z680fSU56X2rTd79BOe9/Rpr/a7LkWmvP/99mH8fRb74nu+7/
qEuvTf+9L3nHd+f55nskN99vXm7TJP/+vuuQ/3GbW5ukaZre1OXm++43nHfjyDfZ++aTI+k5SW68
593zjiQ7H/noN/l5OZKmaXK/yd13/38cNz/8e5cjH/k4lp/8pMn9SO6xI3snv+8bzkvy/z2Snek7
qc29PS/99yQ3uyfH0jTNvsn/ffcb7v24Pf9k5/yb3v+tde9kyXfvpSe35z/k/u/SJPnvno/k971v
uMl3N458l5xvPtlJPX7ex5L7/7/vHPWej32zPe++m3/zXZqm933DTb67cpck2W3P+eaTHS/HcvS+
9959977/0uS78+XIt0mSXcl5775rz0uuyZHzTflHc5O9/3L03vfON2nyTpqeb8bRNPtIbrLsXH/d
9++bcfPdlSXfJdk36TnfdE+OJqnHr83ND33pfd/dc77LkeTbJEnt+d6bbf6RLL3JS9Nzv33vOul9
75v//w+153vTf/eab02auuz8m+Ynve+m5n785jdNs9ybHM2/R75Jb5p/e871qH/ptblH0utQd6RS
t13Vp1Wf6usb1bdRfRs3U32qb+NIpW6h6EyROXbO/TdN0xx1yDe+9KNZdq77Lkm+TbIzSbLj5v+/
9HvUZOemaZrmSHZ8DLfvZch995+T5Dj+kewjSX7vfTfJ8vO/zZBvyk/ur/vuyFD3bfJN8r3Nv0le
kmYvyc7U3vseas+393zjZiPZdalKR6DXxqFl5+bve9w4lPz+9767aY6dk36XXZedb9wGJUNN8q7r
/ss9mqZp+k3yzu+u3GVZck6SJblLrU3TNHuofSd7390PTZJrHuqS75Jv3Kbz+4/c1KVpmp6XfOPQ
bvykJ0uSNE1zDHnf3Te7yUdSa61/+H3vdi9Nk/PSkyXfG4d2XHu+SXKTnO/v+f7jN01Th3rsxh2S
vv/wbzbfnvSl2X3fuFnneenNTZajaZo8LH+nPeeWbm+cTOn43rjaxq0BlDq9capv4yCiOaaodLfY
qu7RWTSiDac0x5QLpdMb5266xe4UG8fadLrTv+tKvjuT3PE6QN243IvqOwOwMY5MgqlUKagK6l4w
Rlol3QR64wq3qEEARk6RS0FQMJL0kEsxcIEcOvhosHOJFRse9KVR3iTBE69psSasOg==
]]>
<![CDATA[
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
]]>
<![CDATA[
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
]]>
<![CDATA[
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
]]>
<![CDATA[
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
]]>
<![CDATA[
+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
]]>
<![CDATA[
rtRxrEjXWLosoTJtHY9E67NxWAnHH6o7Py/0A9ucFES96Tamjycgwt9dFGZ/Q3gmHhXEP8TqYzcd
BpPHy0I/oTZRHXmhC1x5Hr+VP2+uoDxcOV7iY5NY4dqQDsWjK7B5DNO1xVBKKjzDuuK08fzhZT45
UWfYxdMDiFgvzR5lr6Y3oIwtQJt+snCkcQw5LkkDecVVR7OQ7+fzGAsi+4VBXeTTLvRFoutbNYPe
E8MRvlAZSEOM48I+m3Z8sON1YZnhs8bqQ9h9+2EvE6V3kK7iBbEM3Ck6jSB2b4xMFAfieQimiJpi
hnpXCDJHLqUXoatHzqQg5mxx0Yv2HIAuQu9kgmlgoGZS+IjSFNNkzf8VDngCMUV36nkJlhxxjHAE
Qqyrp4XPIaIy9TKy5LaesoVj9WU7ZLNJrYvQOt8ESueeSocItgD2O0+fZ95BKbtZVHzK4JKptZtM
UqJte4QohKtwBDYk1HpHVEgpPANgYaLT6YqIyHFAIBIFIGVnGf/zKNWLIkXin3h8D4kqANDNbESa
ty5XPijZcXYyEDEBoDZExfF/1t9c4mJ4bAYqk/lYs7za0a1lTyome5r4e7I520W/FKCQhb/F7L/k
70K3piOwuGqJXZc+4oZvBd4hVElSg15BZT6M0yrmeLQ/qUcRxeEfugDwAoVMeg07XyIHigGXbgzh
hcu8wHpHFxbnumDJAft1Bg5M6+JQuUSFXeWdABU6yFdBOPotBhDgofADBUYOwVlKJ+dIPNUUKQQc
u7kw729p552CzkzQbtshytyRntmh4voB0MgUQwtvONADLlJ3O+NCVe+ErigcGj8YxfKLQpTmOrTi
ph9abrgVcFoI0tHODnu9P+VYz+tYQWmj9obYNKA8ByJcxg3tfbHXgDuBZhB1q/ofQ8rvnMXXoQ3+
vpF6xezCF8xArLo40EXCDWxRrKLML9FwrMIaGbfUIueaK1CFFKhFU2BI9g+oAxoQjhdDM6MRKWEo
lYCP+m6CMlbtoNjO+BE1aJU/Q7riM/8hkIR7IX9uhxHUIkSZWNzQRUsRoQgjtKnNCRpuW4uodtV6
hdBNiAeGaAER/3Q8UP9C4fzQT/xtQkXbdw7+GmreZWCtFes02Oj4wGskC9wiBjGrdCDu0guNJUWP
1JanhX3XKIauUL4ytTE2m8E/2TuKYwwOREpCalJe3Mh9tWVNqj+IjtAR9NCeMXwwpbzmd+iu+IcK
WnZMARLJZIBPA8jzFIGlSYH3j6VyBKJuegyvMWUTBfw96jp2T4vPd+mOFpctyoZ+L6UPeqsAbHw5
GnAdEMQtCriU2gKekscdb8aCCzB+3UTuoEQbnk+Ei7DL0Ev4w6WDaZWI173m6QTo5tK5bnxPmxKh
PCn46joFOYPXRg5dZSfUnQwj4ioK3AeqCOKlYyMIYfXTqkdXeLNzHlM9fjfuMHqmt4ZMegjJVV83
oMPj9D2J4I5NCFsxs5aBJ22lv+IiERXocksde3iMhDT7SNuXAYzNZhtxrHCWyxRYSPrt7iMJosFq
NIDwG0a6mEgZysnvquIoCbmKDs1BLor056MoaqSaosWEkP/ci0W6LLrAlW5BIBaET4QZtsVq19wg
acLlOl6c01bHj62hH420shi4PDiDdyhyIb9Ok/IJhjhisddtPBjfgDqqffl3eC4aSxFkSqdVfCbo
a/mUD3YKbbCUBrsVib7HKscjVX60Z8f6KNq1iMzmHrbzcsaxLPo8I8yhhuOmC6UarNwnhYLZjcOC
M/aDRFbtZfDfIiJAxIKicYG+kljFhivC9/DuKky9qhVbLKaTyRnF+dOWvEymNxWSBM7/ukUnpNDH
fe0hXL+Xb87NIl3uMBePVPSIPk2x8zwK1Thiibzz2rOS7tFDrQzdLNx5K4cZiuBdS5QHfMcGdFl9
eK3GN26cbBL0UxsSKAL0yMq4Th1GZWFOQf4Dg6o9YuIpSwRISfo9p9xkKSQU+UI3MXdBh0+uEzSF
8t9dhYrPa6KvD2g91vecMSdhM4BjDXNAw79w2OrXKTFk3j0RdaeqlpxJUFECi39WyEyO9gWZ6TwH
Tp5pSX1WBEk2LglktBmT6uMRvnt7iYaOnTPfjd8/58aYbnrMEjX20GlIWUHQQpwooWArPkRIgy81
73UNUd9e0Y7Qgs82AonbPGVA/8LBjl2/CfMAVUCpvoywAit8tH1tbZq6y3f6WbFSMtoNa/x2aCpg
LMkz8+s6SbtfBeMVHd6QRWYlC2gZry5W4/af1Xgpq2eZlTNqywTmtbmiCAsVku+SPYQ1HcqvcBxI
q2dcBU8IJI+L/PQThP3IsNd4iD48DPFSl8y03b3vUn784dZ1ZOfEE5OgV/CHe7quJRHHT5vzZBku
YUZHODMo7mZdCYB2jwsZiScrAns9mQFG8YA6j0ROEM2Fo7qLUXzrU7DfRtOk5nqjcCTfoDwK6tPZ
nvXSNIZAntDPOIAIr+lJxTl66nahHfjQKhzhSz/o5uuXHODOqBKci69uitGKIYIUR8UozfxdmA6r
CGUBfeipH1qLxgoonnukSXcvYGyHsbQKuCs6+kypIBP77tBO93GTQpHhDUy3skK8eRvRyMCS6KNW
28omd5Y7aV5SAs6Imn+Rm+WLCb4bhUUuiiU1tl7jqgV+BM1b0meFsgDSQ1QAQVOih+OCmWVdL3qk
NdMRlKwwoNwsRFx4Jyomi4TP7U1RqwoU1Sn6kHG+NiEhww6FSwSIKr89kfIAI4fmC7pJRJd1VbbK
rILVjsiyRxWQA4Hna1gkAs+6b+ABKRjkDXyhTq2WEQfFPqMP0n+C3UWklIuSIeM+kYpMQJkURta6
epHJp0/efjFKCQ==
]]>
</i:aipgf>
</svg>

After

Width:  |  Height:  |  Size: 56 KiB

@ -0,0 +1,948 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:i="&amp;ns_ai;"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="upload your files.svg"
xml:space="preserve"
enable-background="new 0 0 600 410"
viewBox="0 0 600 410"
height="410px"
width="600px"
y="0px"
x="0px"
id="Layer_1"
version="1.1"><metadata
id="metadata155"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs153" /><sodipodi:namedview
inkscape:current-layer="g110"
inkscape:window-maximized="0"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="205"
inkscape:cx="300"
inkscape:zoom="1.895"
showgrid="false"
id="namedview151"
inkscape:window-height="1114"
inkscape:window-width="2025"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<switch
id="switch148">
<foreignObject
height="1"
width="1"
y="0"
x="0"
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
<i:aipgfRef
xlink:href="#adobe_illustrator_pgf">
</i:aipgfRef>
</foreignObject>
<g
id="g146"
i:extraneous="self">
<g
id="g110">
<path
id="path2"
d="M240,351.7h103.6c1.9,0,3.5-1.8,3.5-3.8v-66.8c0-2.2-1.6-3.8-3.6-3.8l-61.5,0.2c-1,0-1.8-0.4-2.5-1.1 l-6.3-6.8c-0.6-0.7-1.6-1.1-2.5-1.1H240c-1.9,0-3.5,1.8-3.5,3.8V348C236.5,350,238,351.7,240,351.7z"
fill="#383838" />
<path
id="path4"
d="M341.1,333h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C344.1,331.7,342.8,333,341.1,333z"
fill="#FFFFFF" />
<g
id="g50"
opacity="0.1">
<path
id="path6"
d="M341.2,333.5h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1 c1.6,0,2.9,1.3,2.9,2.9v48C344.1,332.2,342.9,333.5,341.2,333.5z"
fill-opacity="0"
fill="#383838" />
<path
id="path8"
d="M341.4,333.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.2,332.3,342.9,333.6,341.4,333.6z"
enable-background="new "
fill="#383838"
opacity="4.761905e-02" />
<path
id="path10"
d="M341.5,333.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.4,332.4,343,333.6,341.5,333.6z"
enable-background="new "
fill="#383838"
opacity="9.523810e-02" />
<path
id="path12"
d="M341.6,333.8h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.5,332.4,343.2,333.8,341.6,333.8z"
enable-background="new "
fill="#383838"
opacity="0.1429" />
<path
id="path14"
d="M341.6,333.9h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h97.9c1.6,0,2.9,1.3,2.9,2.9v48C344.6,332.6,343.3,333.9,341.6,333.9z"
enable-background="new "
fill="#383838"
opacity="0.1905" />
<path
id="path16"
d="M341.7,333.9h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.6,332.6,343.4,333.9,341.7,333.9z"
enable-background="new "
fill="#383838"
opacity="0.2381" />
<path
id="path18"
d="M341.8,334h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C344.7,332.7,343.4,334,341.8,334z"
enable-background="new "
fill="#383838"
opacity="0.2857" />
<path
id="path20"
d="M342,334.1h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H342c1.6,0,2.9,1.3,2.9,2.9v48C344.8,332.8,343.5,334.1,342,334.1z"
enable-background="new "
fill="#383838"
opacity="0.3333" />
<path
id="path22"
d="M342,334.1h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345,332.9,343.6,334.1,342,334.1z"
enable-background="new "
fill="#383838"
opacity="0.381" />
<path
id="path24"
d="M342.1,334.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345,332.9,343.6,334.2,342.1,334.2z"
enable-background="new "
fill="#383838"
opacity="0.4286" />
<path
id="path26"
d="M342.2,334.4h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v47.9C345.1,333,343.9,334.4,342.2,334.4z"
enable-background="new "
fill="#383838"
opacity="0.4762" />
<path
id="path28"
d="M342.3,334.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.2,333,343.9,334.4,342.3,334.4z"
enable-background="new "
fill="#383838"
opacity="0.5238" />
<path
id="path30"
d="M342.4,334.5h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.3,333.2,344,334.5,342.4,334.5z"
enable-background="new "
fill="#383838"
opacity="0.5714" />
<path
id="path32"
d="M342.4,334.6h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.4,333.3,344.1,334.6,342.4,334.6z"
enable-background="new "
fill="#383838"
opacity="0.619" />
<path
id="path34"
d="M342.6,334.6h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.4,333.4,344.1,334.6,342.6,334.6z"
enable-background="new "
fill="#383838"
opacity="0.6667" />
<path
id="path36"
d="M342.7,334.7h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.6,333.4,344.2,334.7,342.7,334.7z"
enable-background="new "
fill="#383838"
opacity="0.7143" />
<path
id="path38"
d="M342.7,334.8h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C345.7,333.5,344.4,334.8,342.7,334.8z"
enable-background="new "
fill="#383838"
opacity="0.7619" />
<path
id="path40"
d="M342.9,334.8h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H343c1.6,0,2.9,1.3,2.9,2.9v48C345.8,333.5,344.5,334.8,342.9,334.8z"
enable-background="new "
fill="#383838"
opacity="0.8095" />
<path
id="path42"
d="M342.9,335H245c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98c1.6,0,2.9,1.3,2.9,2.9v48C345.8,333.6,344.5,335,342.9,335z"
enable-background="new "
fill="#383838"
opacity="0.8571" />
<path
id="path44"
d="M343,335.1h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98c1.6,0,2.9,1.3,2.9,2.9v48C345.9,333.8,344.6,335.1,343,335.1z"
enable-background="new "
fill="#383838"
opacity="0.9048" />
<path
id="path46"
d="M343.2,335.1h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346,333.8,344.7,335.1,343.2,335.1z"
enable-background="new "
fill="#383838"
opacity="0.9524" />
<path
id="path48"
d="M343.2,335.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C346.1,333.9,344.8,335.2,343.2,335.2z"
fill="#383838" />
</g>
<path
id="path52"
d="M342.8,335.2h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C345.7,333.9,344.4,335.2,342.8,335.2z"
fill="#FFFFFF" />
<g
id="g98"
opacity="0.1">
<path
id="path54"
d="M343,335.7h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1 c1.6,0,2.9,1.3,2.9,2.9v48C345.9,334.4,344.6,335.7,343,335.7z"
fill-opacity="0"
fill="#383838" />
<path
id="path56"
d="M343.2,335.8h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346,334.5,344.8,335.8,343.2,335.8z"
enable-background="new "
fill="#383838"
opacity="4.761905e-02" />
<path
id="path58"
d="M343.3,335.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.1,334.6,344.8,335.9,343.3,335.9z"
enable-background="new "
fill="#383838"
opacity="9.523810e-02" />
<path
id="path60"
d="M343.4,335.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.3,334.6,345,335.9,343.4,335.9z"
enable-background="new "
fill="#383838"
opacity="0.1429" />
<path
id="path62"
d="M343.4,336h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.4,334.7,345.1,336,343.4,336z"
enable-background="new "
fill="#383838"
opacity="0.1905" />
<path
id="path64"
d="M343.5,336h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.4,334.8,345.1,336,343.5,336z"
enable-background="new "
fill="#383838"
opacity="0.2381" />
<path
id="path66"
d="M343.6,336.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.5,334.8,345.2,336.2,343.6,336.2z"
enable-background="new "
fill="#383838"
opacity="0.2857" />
<path
id="path68"
d="M343.6,336.3h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.6,335,345.3,336.3,343.6,336.3z"
enable-background="new "
fill="#383838"
opacity="0.3333" />
<path
id="path70"
d="M343.9,336.4h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C346.7,335.1,345.4,336.4,343.9,336.4z"
enable-background="new "
fill="#383838"
opacity="0.381" />
<path
id="path72"
d="M343.9,336.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H344c1.6,0,2.9,1.3,2.9,2.9v48C346.7,335.1,345.4,336.4,343.9,336.4z"
enable-background="new "
fill="#383838"
opacity="0.4286" />
<path
id="path74"
d="M344,336.5h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H344c1.6,0,2.9,1.3,2.9,2.9v48C346.9,335.2,345.6,336.5,344,336.5z"
enable-background="new "
fill="#383838"
opacity="0.4762" />
<path
id="path76"
d="M344.1,336.5h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347,335.3,345.7,336.5,344.1,336.5z"
enable-background="new "
fill="#383838"
opacity="0.5238" />
<path
id="path78"
d="M344.1,336.6h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.1,335.3,345.8,336.6,344.1,336.6z"
enable-background="new "
fill="#383838"
opacity="0.5714" />
<path
id="path80"
d="M344.2,336.8h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.2,335.4,345.9,336.8,344.2,336.8z"
enable-background="new "
fill="#383838"
opacity="0.619" />
<path
id="path82"
d="M344.4,336.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48.1 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.2,335.6,345.9,336.9,344.4,336.9z"
enable-background="new "
fill="#383838"
opacity="0.6667" />
<path
id="path84"
d="M344.5,336.9h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.3,335.6,346,336.9,344.5,336.9z"
enable-background="new "
fill="#383838"
opacity="0.7143" />
<path
id="path86"
d="M344.5,337h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.5,335.7,346.1,337,344.5,337z"
enable-background="new "
fill="#383838"
opacity="0.7619" />
<path
id="path88"
d="M344.6,337h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.5,335.8,346.3,337,344.6,337z"
enable-background="new "
fill="#383838"
opacity="0.8095" />
<path
id="path90"
d="M344.7,337.1h-97.9c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.6,335.8,346.3,337.1,344.7,337.1z"
enable-background="new "
fill="#383838"
opacity="0.8571" />
<path
id="path92"
d="M344.8,337.2h-98c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48C347.7,335.9,346.4,337.2,344.8,337.2z"
enable-background="new "
fill="#383838"
opacity="0.9048" />
<path
id="path94"
d="M345,337.2h-98.1c-1.6,0-2.9-1.3-2.9-2.9v-48 c0-1.6,1.3-2.9,2.9-2.9H345c1.6,0,2.9,1.3,2.9,2.9v48C347.8,335.9,346.5,337.2,345,337.2z"
enable-background="new "
fill="#383838"
opacity="0.9524" />
<path
id="path96"
d="M345,337.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C347.9,336,346.6,337.4,345,337.4z"
fill="#383838" />
</g>
<path
id="path100"
d="M345,337.4h-98c-1.6,0-2.9-1.3-2.9-2.9v-48c0-1.6,1.3-2.9,2.9-2.9h98.1c1.6,0,2.9,1.3,2.9,2.9v48 C347.9,336,346.6,337.4,345,337.4z"
fill="#FFFFFF" />
<g
id="g104">
<path
id="path102"
d="M346.4,364.4H236.5c-2,0-3.7-1.7-3.7-3.8v-66c0-2,1.7-3.8,3.8-3.8h55.2c1,0,1.3-0.1,2-0.8l6.7-6.7 c0.7-0.7,1.7-1.1,2.6-1.1h43.2c2,0,3.7,1.7,3.7,3.8v74.6C350.1,362.7,348.4,364.4,346.4,364.4z"
fill="#55ACEE" />
</g>
</g>
<path
id="path112"
d="M382,79.8h-7.1c0.1-0.7,0.1-1.3,0.1-2c0-13.3-10.8-24.2-24.2-24.2c-2,0-3.6,0-5,0 c-5.5-20-23.8-34.7-45.6-34.7c-21.7,0-40,14.7-45.6,34.7c-1.4,0-3.1,0-5,0c-13.3,0-24.2,10.8-24.2,24.2c0,0.7,0,1.3,0.1,2h-7.1 c-15,0-27.2,12.2-27.2,27.2l0,0c0,15,12.2,27.2,27.2,27.2h163.5c15,0,27.2-12.2,27.2-27.2l0,0C409.2,92,397,79.8,382,79.8z"
fill="#58AEF3" />
<rect
id="rect114"
height="80"
width="34.3"
fill="#383838"
y="186.9"
x="278.9" />
<path
id="path116"
d="M269.6,203.7c17.5-3.4,35.3-3.5,52.8-0.3l-27.4-60.2L269.6,203.7z"
fill="#383838" />
<g
id="g120">
<path
id="path118"
d="M296,245.1c-7.2,0-13.1-5.9-13.1-13.1s5.9-13.1,13.1-13.1s13.1,5.9,13.1,13.1S303.3,245.1,296,245.1z M296,219.9c-6.6,0-12,5.4-12,12s5.4,12,12,12s12-5.4,12-12S302.6,219.9,296,219.9z"
fill="#FFFFFF" />
</g>
<g
id="g124">
<path
id="path122"
d="M294.3,238.3c-0.4,0-0.9-0.2-1.3-0.5l-4.3-3.6c-0.8-0.7-0.9-1.9-0.2-2.8c0.7-0.8,1.9-0.9,2.8-0.2l3,2.5 l7.5-6.9c0.8-0.7,2-0.7,2.8,0.1c0.8,0.8,0.7,2-0.1,2.8l-8.8,8.1C295.3,238.1,294.8,238.3,294.3,238.3z"
fill="#FFFFFF" />
</g>
</g>
</switch>
<i:aipgf
i:pgfVersion="24"
i:pgfEncoding="zstd/base64"
id="adobe_illustrator_pgf">
<![CDATA[
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
]]>
<![CDATA[
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
ayTKvk8GhdEahinIJv9tHMwgTRixL/pMDFCewKk20gyZspviNNXfSw0cMKWCdPdgGDtjxZHCFE4L
L/scWIrYl8UQfg8JLXpKWeEJyN4IKSuJ+qsIHN63cR6XquGNlBDDC7lUDQ+UGjU80sfS8DaEgOFx
eXO67IrMEkPUgBZkpQo3lVLzbMgsh6lU4aWS4hGr0ljVFY+XRogkeKyKVd/GdUdhv7SjsGmn9CSV
SCXSB4GeLhvVEApjT0qoTF5l8qpl8jt6UBgbTXCES6NfqLQIlVLzDC0W4WKV0Y4GY7HKaFRd9cwz
88w8KaikUledUKmrJoD/J5J0AphgQfAlSJGkfwYPgj6wJXPk5DcvrUmIySjeY5qE1DwvCsnrL54r
o7gmZMko/hmZ1MVTVyq/FRBkXBQQCwLDAaEwNoMBsXyIFbcgYBIebkFQ1DAzBeVEYexK7HdKl5Q7
q6UWM9cBujDXkiPKLKGd7Pzou+/d9qQnNdl72cmuS8+3L/2mj+M4+u55N5ae79L8ndz//w3Jd+f5
HsdPbjpZjr7/Tpbj6MeRe775/ffR5CZJ+j5qtG/+TO+Sd74/7xvuR/03o9bek6pP9ZGqb6P6NqpP
b/z3fcP9uLc2/dZai8bR996Nn2/z680fSU56X2rTd79BOe9/Rpr/a7LkWmvP/99mH8fRb74nu+7/
qEuvTf+9L3nHd+f55nskN99vXm7TJP/+vuuQ/3GbW5ukaZre1OXm++43nHfjyDfZ++aTI+k5SW68
593zjiQ7H/noN/l5OZKmaXK/yd13/38cNz/8e5cjH/k4lp/8pMn9SO6xI3snv+8bzkvy/z2Snek7
qc29PS/99yQ3uyfH0jTNvsn/ffcb7v24Pf9k5/yb3v+tde9kyXfvpSe35z/k/u/SJPnvno/k971v
uMl3N458l5xvPtlJPX7ex5L7/7/vHPWej32zPe++m3/zXZqm933DTb67cpck2W3P+eaTHS/HcvS+
9959977/0uS78+XIt0mSXcl5775rz0uuyZHzTflHc5O9/3L03vfON2nyTpqeb8bRNPtIbrLsXH/d
9++bcfPdlSXfJdk36TnfdE+OJqnHr83ND33pfd/dc77LkeTbJEnt+d6bbf6RLL3JS9Nzv33vOul9
75v//w+153vTf/eab02auuz8m+Ynve+m5n785jdNs9ybHM2/R75Jb5p/e871qH/ptblH0utQd6RS
t13Vp1Wf6usb1bdRfRs3U32qb+NIpW6h6EyROXbO/TdN0xx1yDe+9KNZdq77Lkm+TbIzSbLj5v+/
9HvUZOemaZrmSHZ8DLfvZch995+T5Dj+kewjSX7vfTfJ8vO/zZBvyk/ur/vuyFD3bfJN8r3Nv0le
kmYvyc7U3vseas+393zjZiPZdalKR6DXxqFl5+bve9w4lPz+9767aY6dk36XXZedb9wGJUNN8q7r
/ss9mqZp+k3yzu+u3GVZck6SJblLrU3TNHuofSd7390PTZJrHuqS75Jv3Kbz+4/c1KVpmp6XfOPQ
bvykJ0uSNE1zDHnf3Te7yUdSa61/+H3vdi9Nk/PSkyXfG4d2XHu+SXKTnO/v+f7jN01Th3rsxh2S
vv/wbzbfnvSl2X3fuFnneenNTZajaZo8LH+nPeeWbm+cTOn43rjaxq0BlDq9capv4yCiOaaodLfY
qu7RWTSiDac0x5QLpdMb5266xe4UG8fadLrTv+tKvjuT3PE6QN243IvqOwOwMY5MgqlUKagK6l4w
Rlol3QR64wq3qEEARk6RS0FQMJL0kEsxcIEcOvhosHOJFRse9KVR3iTBE69psSasOg==
]]>
<![CDATA[
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
]]>
<![CDATA[
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
]]>
<![CDATA[
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
]]>
<![CDATA[
V0oqoaptANo7+bZ/ct51haTgNp4cx+TGHTtYaXycbBtdFw2Qc32e+mUyi+FX2uQkIXGHxr8S9eTm
WNs9rUk5efjy83mwBEU+TqvCwpP9nGzCrLFzb+F7HB55KQWbEs0Exn8yzBLojuBFFdlg3zDBD0qn
8p1N8qe9usEvzt0Jt4PFGDPcQJqJSWFKJWomghHBmdWVLq2jmuMrqhL28Y0lUJa76TgcBO4xM8r8
JiBK80teLgdKhlVzcoZPmv6CMl3RA3cV0aXM/JqomnA1pNFca+eddWGJUkWUzjuodRqFtvIabTuv
P+ifcQDNi94qZXdeu4FeZR/beX9xJTy7VEMZA1hSfU870N6XryWk2yw7DE9q0Osv6PQBsSjTeZHb
xNwEdIDOe+gzCPS23Qbyd17s++m/RAuw82pJEUrCCjTobWScL5B+I/rL3mo6aEqdpXxg4n6j6omO
/f7YAMYXzl6nEb70vRFggh/sT1f6zxXxB42K31dhxWhNFZ6TQoKwHsVk3+gyNiAGYjud3rRRc4FV
VKyJ0ueG7O+sc++cigQElxGi7QLZCofu0zNGu8wn4TXm1fGN4bRWREo+4EzrKx36oeb4kCVBZxVs
SGO4Kvi2PhhxcATESDn2Be8lt4balp3gGBzVOQYL14RAQW7M0pgjVmmqIKvk4wOD49OC6bYKx5H/
PAOLgqNF2fwGx/VHC9jQwsySNhEcyTZH/MQoOo5lYv6sCD1khGwYYcnAI87iWBhhiHKUXj5wKFM2
MVJwuN9Vd88ipe3LcAZJcFS70ODRHBn/vEU19uWSz/0ANUgfi9b9GW2BNtaD3GFxisNVQImKK278
3AWP+j/saoQGSrn/RyrhX+t4JPOrWZH+aEI+1UJx0awjPAgFxndjvfN6fXABAoR/qOVztKDdLjem
ZXKRdX8vk+Uc6+/rNCxwjYf21g9jeaeAOfay9qaw4omhUQO2f74rge1KDeNcAmrU/I35AC+pcqWx
UwufezuKm3VqoHxaXDbRtsLTBPs70reAFNR/ngWe59W1OmGVxRrmLNHQOS+1HlqF4/JYUsCOk1IY
n1DE0eYDdPneTZvj58Z2/Vmf8UoRuHV4FiDUSTRgqZycMY0NIRXD5emKMzSAPU6tcZoi7aFUrA8I
bchxnjt5tkAnVLR/QCxr4Ndvz4sIKp96lHnfp7+Op7iig+XTr9IET8d280ks0FpxMfjc9/SG/642
xehulYxYCqFAqvIXXDDjY65FTunOKjFegcmVKZnRK7zbH2jyUSIOIuAssZYK02wcFb4KyAD7OoO3
KXKt/B+1x915G8AEA1oVZFgcf9cD+K+KGaVFN+rjKGeH2zNdu6+B5xA2dfxHEEywr590aYMKVUOT
l4yO3c58b5LlTn2Pwx0+HqlZOfPRcM5j/bwrLcyKj38qSdYqqKv2SICD4JiIleqnfMzS25cbIFTN
sKCSIdyqYQex7P2tyrby9s/2vgt8ssJByZj80h0WMGx8w7mA614oUfvpiFqAPZFtB3q4KIOCG05W
Ov4NOZoeHB8USYEv9kn8Nd3DdDUAEvK5y6+JUNCjNQ7GbMclRoZdDHKZO7qsT93FV8shXOKzd1u5
2YuaV8Obk5QTfsRE+1xAYMETl7Q4vK3rBnU7AIA7pmXTQWou2lwArkSLy4nEKpvQ9M5YpuL4wXm9
+54vxLMYLtlUaeeb7FKT1TYAsMBI6Ht87/gvh4o6M56JrChrvpa18lvBzLQkTYH0xRg3JhA2gj2D
BhWknu8M9aSnSl/4JvwY/lKf7yIRDI+l76cBbadXB5X0J3172/h8vRYofR8Aer61ljrpK94XI32+
yJz0XYYKnOeLYdyy4mPpG/bF73i+aF+RvmiQ8NZDoP58ccs+FyB9N0ojNj5f6LjlV0jfhUHUPl9a
K31nZPbF1KnA9s/NqKMRf3QpI7FD+4iloQYw8HNquo/RYw2CpQU6e9W+REVPMKJmIFpxaF8FWG1t
Fm65EO4tGheO48J5z8p5neCNAI4av8P/z2a/29su5vITCNYBGfDFpMSsr1FmYBWGjh6VFngNTA/R
RT1V2Xr3OFxWYYJ4MgCCZqGq6m/RqmrDi+aSzXRSXUDua7DeiS13jZdpeqsz76BHhXbdG1SKXdpW
fzQ1ATNtjD4xAb+dkoS3dDKF+nrrYaRfT3JkEBtRqIRF1lt+KswQNl4pY0xyHLZdhiq5vjXgrMy8
zbKdHZN9MLIIGlVv0xLz42CQyx8Gy7Q/Mu+iHSfItZNT8ZG7mD3t890GyQfwoGkbho3Gkw0IIN3A
EHGnI1u6tpIEdWTLQgCFN3IyvbVD7UrjD2BVOw3nfxF3SyKAYfYjoBgu4z8xci0BrFsLX0qQoyvP
ZNIAPrCD8aWn2ZEFUpswMKGiobtPSta7+gzVLTdyZQ5c8ayCcpISPCMM/8rbGCgB8PmiqzTla+4S
5HCT3OYiGv2PoZnL1EvL6ZaC3K5X7cOp3DqOuRd+I52fRx61yTrlOqTqGggdCPqWFQ5Awhs+b7Ju
ywjZzr3uF3cXMnQTaDAOV9BlJeMOfsq3b/LeEWmcc2M4DKoMnUhap6Y1lSp6Npgbrodoy2mcE68P
B0GUwGwaSOUmmJMInAPDqRffEbssxkoNZY2y20+AG0JtOPyiXduLhaMM4NMT1cZuELCFUR6wIB98
wOMNoIZ/k2XmNluCPpEKqmp9xd9gdBeEjRY8Rs/O8kBKkeT74Ao2LsL4cJTBVQ/ZTWYOTuXuw4Id
qBFcx+iI1nXk9zLtEqqXlG7Stosi2PG2AZ3q0OoTT/rBCfDIfXNkdlJZabBMS1OA1jqo4Wi7dCG0
zgzJLsQEFn40EA0ZEzbMI4cw3tXFNGPdzBjCCaMRtcZBXYCRqGhVcewgplStGzlIWw18TArcVDiQ
TRXejdTbZyXrbuk8HL+Zlno5Ke5ET9+eFUvdKW7gFzNjxDs124eotZsyIwl5RYNpJTTbHj9YEfCT
C21MjRfTMCvdzu4oAuNqmyrbtv5M8MQxIywbNSHGd7yYnqWAEK5kkBRCLmEMtlEfv+VCo22GwR7O
3hvJ+HYtrE9R0AvT8+QYYiBcaISi9SKruoYhJqAT4n9caT5yk/ENvckzb1kxlxGgYvzPHjHXLe8o
KdmqoDZTlf8mTC8Ubh1suyN0zPrSWP694U/hSCj7QB9dAVElAcKHONPWQdOifUgjbcFX3SC6f8hK
plS3VAajNJIefH8JI19qlvJYVnnxygjJSk0KtdVnAFiK8bqFCV5xpDBvo1QKZKZJtnKpj8RTyA3g
aw4suHxE/vjHx/8xXZqTWf5MHMuSgya03ZCFEt4wgXhs24vtbI4oHV8Luxrp+cd5JVO/PFhexMbu
oJUQH7VEFs9bG4CztjUU8m3p3t06T+l0B4k8SA3/leCqkG44FrNRtxOim3OgWa0Eisw1hGCDuCex
Fd0Ius4sRL/H/woy0Tx4B1/06UffnynHOtjlHj91wP7/rwlzPAwt83Ua99G2e818GxhjZ+wcIqjP
V03DvRsMzlrlT1ckdvisp0eFLpwYmHi1X0zL/6Xn0ImFfLiR4BXUglxazjgpeyMOESXkC4rjkwoS
zTPHrKPfQ2YHpZucFQe44Ao3ed7TkuppcwGxovBZ8j12zzjyZiV1lrESyXs0BiP6QaQ2MDlmT1rx
B78jIkpW2MaubE5qPsqULVMsEVhSAZMpTf3VwHmG+VfSVNGDKEJz/zTr8gHAOB8QtBI/J5/EkC26
l9LFqvWnJv2/yNrChzasGH02QRSdCccq2ML0HhOvzEf1CjAi0kECT6iAA0UJF1mJrWepwdMbBUl3
+0eWHs5TDSTqg2cZkcF3jjHjDmZbqoNNy7o8863JkF3PEbVyxdZ/3AOhR+VIgOMq4aAOtpN3nQ0B
5fiIkUVzSoTAnISle6e2RVvuZCBBvH9uQhza17APt2jSFFKs7U4C3KB6H7mijhHnMBVMBF9GRnM+
wYzWDETjaaCRkBYf/bg5gcSMVBZMeiFjXKRvARzZ9xRxNvuRp/0IM54hM2vmHsdHMcqX6PfKiGNT
j8fbnJChnBYqTkRqYuRe3olgGvAH/uXDwrmJz7v38Zgj/PPvcIVCa+gNKI66rBKhL0fVI7z78UGD
pUhS59q0sl9uUhUtRCtPq7VoFCrHxraxYG6FcrdPvKSgNHgmoRJRg9AXtJXnTQgvUrRHG+O/c+4h
dylVXXGlaKLMn6wdTD3EkW0Bb7ll8FQXsiY0sMCd9s3Sokhlo0IOMx0qgPumTnbOuwfGXo6iP8Bp
5UVAJ6EcZpHRXtcxneueGkcpzr3HQdhUnv4BGDLGSkn81rXVXrl0dl7w9VwskS78wgOCBSeHZ3HW
T3gXcJaDISqCawZ8iEvB8GU33dkPHl2mNYHLuRfLJyRfm9tYMJGisRJ9BeIXkdaxe4gYxcmpOMfx
h6C5NKcwjA4lXYCM5puTgYmeCgvtmZXCH3d1RHqkOOgJpfERry//NFCAWrQJJ5pRz/4G1pqmVvK0
WMsYOChmNInuhLUNqB9W2gJdhLdzhRO4nfCB+BRNfMJQN3z0gA4MxmFgtphLunDkfKZWS0BHm7uE
dyAOrFE2ois/UPJY5N5XltT28gaclUpHuc9DeOX/lMe8zg4EoDSam2FuII3GUrKTwNSZwSMLBxVv
2XWziuRF+heUeuWwlxUooNS43GGWWwEV0NUfXpDM19DKLjRv2apPK5d3B9VDhuYIv/uaFF+lXMMs
8/GAnIDxKJqQCWog6hxMnjH5pLWTUZ74ZcKdaClvkIBI2PmAyxHCp5uEvUNtYqmQXqie84HRdC1V
9UmQqkqu9mkZmLdzbiTxo4FWz3w9RVfergFVxuxa6JrwQl/dMmtGxaa8Bc5gkKGxjtytHSnaWWDW
YflFEt+epU8v4i83V4NcJGpqXOdHkO3fAan++igm0PaznPf+An6ctNl4gOVLZKDkiMObJ0u29OnD
KLQP2zYHjynVh8fJ0D1s/bBgR71YsSo+6ruFN3d91r5NtJkdaZviDxjOg7pWtxKWYO8CVJiZcif1
TjwXqTNAns/oIYwVqKwsE6lx4auHohBtIYQXJywNQkAcJfyokwJv948NvTHbieVxahnAJWZg90kU
ywDKLQQsThayM8LCWz8HcBMQ6eveLIOvRCcbA1SGejz0TmLLao80oeXDfYN2uzHKZa4J/AJHWVdg
R/zGe2oeEUdrKvk50j6/NgHmbMef7x6HMhvhpAwZy8YpDUGmj0QJ7YKRW5rhBLa93JmAX9anYuaq
GpClX23buCSJuVwgJlTESotUXIqLLI5yqZafHIR8FZu7c/s8hQ0s6EUosKlkK+Q9ZCxYcrY9n23q
8z7GGCWT+KXl2uS+MYgONiEwycsEE0mziRP7kYlTfKsJA/wkzK5JaoTVxYv77thqGGO1dnqdaDSa
N8vkUTONBY9j/mHCg7vtZlulmttoLkvPRI6rp5qwfUeK0JIU3AOJ5j2paGRn/zzTJw==
]]>
<![CDATA[
+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
]]>
<![CDATA[
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
epHJp0/efjFKCQ==
]]>
</i:aipgf>
</svg>

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

@ -0,0 +1,71 @@
<?php
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
/* /home/home.html.twig */
class __TwigTemplate_af3d9cd9f4ff4c44106fba71564d7af6059a69449e652f694cd80b0b5e237d82 extends Template
{
private $source;
private $macros = [];
public function __construct(Environment $env)
{
parent::__construct($env);
$this->source = $this->getSourceContext();
$this->blocks = [
'title' => [$this, 'block_title'],
];
}
protected function doGetParent(array $context)
{
// line 1
return "base.html.twig";
}
protected function doDisplay(array $context, array $blocks = [])
{
$macros = $this->macros;
$this->parent = $this->loadTemplate("base.html.twig", "/home/home.html.twig", 1);
$this->parent->display($context, array_merge($this->blocks, $blocks));
}
// line 3
public function block_title($context, array $blocks = [])
{
$macros = $this->macros;
echo "Accueil - HearthTrack";
}
public function getTemplateName()
{
return "/home/home.html.twig";
}
public function isTraitable()
{
return false;
}
public function getDebugInfo()
{
return array ( 46 => 3, 35 => 1,);
}
public function getSourceContext()
{
return new Source("", "/home/home.html.twig", "/home/www/anpinagot/public_html/sae/Web/Sources/src/app/views/Templates/home/home.html.twig");
}
}

@ -0,0 +1,214 @@
<?php
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
/* home.html */
class __TwigTemplate_16e6c0dcab0136c1f1e8ae28198d95d31cd5a976b1114c0dd185f5b3a7465074 extends Template
{
private $source;
private $macros = [];
public function __construct(Environment $env)
{
parent::__construct($env);
$this->source = $this->getSourceContext();
$this->parent = false;
$this->blocks = [
];
}
protected function doDisplay(array $context, array $blocks = [])
{
$macros = $this->macros;
// line 1
echo "<!DOCTYPE html>
<html lang=\"fr\">
<head>
<meta charset=\"utf-8\" />
<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />
<meta name=\"description\" content=\"Accueil\" />
<meta name=\"author\" content=\"PINAGOT Antoine\" />
<title>Accueil - HeartTrack</title>
<link href=\"https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/style.min.css\" rel=\"stylesheet\" />
<link href=\"../css/styles.css\" rel=\"stylesheet\" />
<script src=\"https://use.fontawesome.com/releases/v6.3.0/js/all.js\" crossorigin=\"anonymous\"></script>
</head>
<body class=\"sb-nav-fixed\">
<nav class=\"sb-topnav navbar navbar-expand navbar-dark bg-dark\">
<!-- Navbar Brand-->
<img class=\"navbar-brand ps-3\" src=\"../../../public/assets/img/logo.png\">
<!-- Sidebar Toggle-->
<button class=\"btn btn-link btn-sm order-1 order-lg-0 me-4 me-lg-0\" id=\"sidebarToggle\" href=\"#!\"><i class=\"fas fa-bars\"></i></button>
<!-- Navbar Search-->
<form class=\"d-none d-md-inline-block form-inline ms-auto me-0 me-md-3 my-2 my-md-0\">
<div class=\"input-group\">
<input class=\"form-control\" type=\"text\" placeholder=\"Rechercher...\" aria-label=\"Rechercher...\" aria-describedby=\"btnNavbarSearch\" />
<button class=\"btn btn-primary\" id=\"btnNavbarSearch\" type=\"button\"><i class=\"fas fa-search\"></i></button>
</div>
</form>
<!-- Navbar-->
<ul class=\"navbar-nav ms-auto ms-md-0 me-3 me-lg-4\">
<li class=\"nav-item dropdown\">
<a class=\"nav-link dropdown-toggle\" id=\"navbarDropdown\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\"><i class=\"fas fa-user fa-fw\"></i></a>
<ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"navbarDropdown\">
<li><a class=\"dropdown-item\" href=\"#!\">Profile</a></li>
<li><a class=\"dropdown-item\" href=\"#!\">Paramètres</a></li>
<li><hr class=\"dropdown-divider\" /></li>
<li><a class=\"dropdown-item\" href=\"#!\">Déconnexion</a></li>
</ul>
</li>
</ul>
</nav>
<div id=\"layoutSidenav\">
<div id=\"layoutSidenav_nav\">
<nav class=\"sb-sidenav accordion sb-sidenav-dark\" id=\"sidenavAccordion\">
<div class=\"sb-sidenav-menu\">
<div class=\"nav\">
<div class=\"sb-sidenav-menu-heading\">Menu</div>
<a class=\"nav-link\" href=\"home.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/house.png\"></div>
Accueil
</a>
<div class=\"sb-sidenav-menu-heading\">Activités</div>
<a class=\"nav-link\" href=\"exercice.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/sprinter.png\"></div>
Exercices
</a>
<a class=\"nav-link\" href=\"analyze.html\">
<div class=\"sb-nav-link-icon\"><i class=\"fas fa-chart-area\"></i></div>
Analyses
</a>
<div class=\"sb-sidenav-menu-heading\">Social</div>
<a class=\"nav-link\" href=\"friend.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/group.png\"></div>
Amis
</a>
<a class=\"nav-link\" href=\"coaching.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/coaching.png\"></div>
Coaching
</a>
<a class=\"nav-link\" href=\"mail.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/letter.png\"></div>
Messagerie
</a>
</div>
</div>
<div class=\"sb-sidenav-footer\">
<div class=\"small\">Connecté en tant que:</div>
{user}
</div>
</nav>
</div>
<div id=\"layoutSidenav_content\">
<main>
<div class=\"container-fluid px-4\">
<h1 class=\"mt-4\">Accueil</h1>
<ol class=\"breadcrumb mb-4\">
<li class=\"breadcrumb-item active\">Vue d'ensemble</li>
</ol>
<div class=\"row\">
<div class=\"col-7\">
<div class=\"card mb-4\">
<div class=\"card-header\">
<i class=\"fas fa-chart-area me-1\"></i>
Stastiques globales
</div>
<div class=\"card-body\">
<canvas id=\"myAreaChart\" width=\"100%\" height=\"40\"></canvas>
</div>
</div>
</div>
<div class=\"col-5\">
<div class=\"card mb-4\">
<div class=\"card-header\">
<i class=\"fas fa-chart-bar me-1\"></i>
Résumé quotidien
</div>
<div class=\"card-body\">
</div>
</div>
</div>
</div>
<div class=\"row\">
<div class=\"col-5\">
<div class=\"card mb-4\">
<div class=\"card-header\">
<i class=\"fas fa-chart-bar me-1\"></i>
Liste d'amis
</div>
<div class=\"card-body\">
</div>
</div>
</div>
<div class=\"col-7\">
<div class=\"card mb-4\">
<div class=\"card-header\">
<i class=\"fas fa-chart-bar me-1\"></i>
Messagerie
</div>
<div class=\"card-body\">
</div>
</div>
</div>
</div>
</div>
</main>
<footer class=\"py-4 bg-light mt-auto\">
<div class=\"container-fluid px-4\">
<div class=\"d-flex align-items-center justify-content-between small\">
<div class=\"text-muted\">Copyright &copy; HeartTrack 2023</div>
<div>
<a href=\"#\">Politique de confidentialité</a>
&middot;
<a href=\"#\">Termes &amp; Conditions d'utilisations</a>
</div>
</div>
</div>
</footer>
</div>
</div>
<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"js/scripts.js\"></script>
<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"assets/demo/chart-area-demo.js\"></script>
<script src=\"assets/demo/chart-bar-demo.js\"></script>
<script src=\"https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/umd/simple-datatables.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"js/datatables-simple-demo.js\"></script>
</body>
</html>
";
}
public function getTemplateName()
{
return "home.html";
}
public function getDebugInfo()
{
return array ( 37 => 1,);
}
public function getSourceContext()
{
return new Source("", "home.html", "/home/www/anpinagot/public_html/sae/Web/Sources/src/app/views/Templates/home.html");
}
}

@ -0,0 +1,215 @@
<?php
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
/* base.html.twig */
class __TwigTemplate_83f313b86da35998a96ccc25fa02176c3fca11644e117af297089ca4a85f55ab extends Template
{
private $source;
private $macros = [];
public function __construct(Environment $env)
{
parent::__construct($env);
$this->source = $this->getSourceContext();
$this->parent = false;
$this->blocks = [
'title' => [$this, 'block_title'],
'stylesheets' => [$this, 'block_stylesheets'],
'javascripts' => [$this, 'block_javascripts'],
'menu' => [$this, 'block_menu'],
'body' => [$this, 'block_body'],
'script' => [$this, 'block_script'],
];
}
protected function doDisplay(array $context, array $blocks = [])
{
$macros = $this->macros;
// line 1
echo "<!DOCTYPE html>
<html lang=\"fr \">
<head>
<meta charset=\"UTF-8\">
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<title>";
// line 6
$this->displayBlock('title', $context, $blocks);
echo "</title>
";
// line 8
$this->displayBlock('stylesheets', $context, $blocks);
// line 12
echo "
";
// line 13
$this->displayBlock('javascripts', $context, $blocks);
// line 16
echo "</head>
<body class=\"sb-nav-fixed\">
";
// line 18
$this->displayBlock('menu', $context, $blocks);
// line 85
echo "
";
// line 86
$this->displayBlock('body', $context, $blocks);
// line 87
echo "
";
// line 88
$this->displayBlock('script', $context, $blocks);
// line 97
echo "</body>
</html>";
}
// line 6
public function block_title($context, array $blocks = [])
{
$macros = $this->macros;
}
// line 8
public function block_stylesheets($context, array $blocks = [])
{
$macros = $this->macros;
// line 9
echo " <link href=\"../css/styles.css\" rel=\"stylesheet\" />
<link href=\"https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/style.min.css\" rel=\"stylesheet\" />
";
}
// line 13
public function block_javascripts($context, array $blocks = [])
{
$macros = $this->macros;
// line 14
echo " <script src=\"https://use.fontawesome.com/releases/v6.3.0/js/all.js\" crossorigin=\"anonymous\"></script>
";
}
// line 18
public function block_menu($context, array $blocks = [])
{
$macros = $this->macros;
// line 19
echo " <nav class=\"sb-topnav navbar navbar-expand navbar-dark bg-dark\">
<!-- Navbar Brand-->
<img class=\"navbar-brand ps-3\" src=\"../../../public/assets/img/logo.png\">
<!-- Sidebar Toggle-->
<button class=\"btn btn-link btn-sm order-1 order-lg-0 me-4 me-lg-0\" id=\"sidebarToggle\" href=\"#!\"><i class=\"fas fa-bars\"></i></button>
<!-- Navbar Search-->
<form class=\"d-none d-md-inline-block form-inline ms-auto me-0 me-md-3 my-2 my-md-0\">
<div class=\"input-group\">
<input class=\"form-control\" type=\"text\" placeholder=\"Rechercher...\" aria-label=\"Rechercher...\" aria-describedby=\"btnNavbarSearch\" />
<button class=\"btn btn-primary\" id=\"btnNavbarSearch\" type=\"button\"><i class=\"fas fa-search\"></i></button>
</div>
</form>
<!-- Navbar-->
<ul class=\"navbar-nav ms-auto ms-md-0 me-3 me-lg-4\">
<li class=\"nav-item dropdown\">
<a class=\"nav-link dropdown-toggle\" id=\"navbarDropdown\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\"><i class=\"fas fa-user fa-fw\"></i></a>
<ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"navbarDropdown\">
<li><a class=\"dropdown-item\" href=\"#!\">Profile</a></li>
<li><a class=\"dropdown-item\" href=\"#!\">Paramètres</a></li>
<li><hr class=\"dropdown-divider\" /></li>
<li><a class=\"dropdown-item\" href=\"#!\">Déconnexion</a></li>
</ul>
</li>
</ul>
</nav>
<div id=\"layoutSidenav\">
<div id=\"layoutSidenav_nav\">
<nav class=\"sb-sidenav accordion sb-sidenav-dark\" id=\"sidenavAccordion\">
<div class=\"sb-sidenav-menu\">
<div class=\"nav\">
<div class=\"sb-sidenav-menu-heading\">Menu</div>
<a class=\"nav-link\" href=\"home.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/house.png\"></div>
Accueil
</a>
<div class=\"sb-sidenav-menu-heading\">Activités</div>
<a class=\"nav-link\" href=\"exercice.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/sprinter.png\"></div>
Exercices
</a>
<a class=\"nav-link\" href=\"analyze.html\">
<div class=\"sb-nav-link-icon\"><i class=\"fas fa-chart-area\"></i></div>
Analyses
</a>
<div class=\"sb-sidenav-menu-heading\">Social</div>
<a class=\"nav-link\" href=\"friend.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/group.png\"></div>
Amis
</a>
<a class=\"nav-link\" href=\"coaching.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/coaching.png\"></div>
Coaching
</a>
<a class=\"nav-link\" href=\"mail.html\">
<div class=\"sb-nav-link-icon\"><img src=\"assets/img/letter.png\"></div>
Messagerie
</a>
</div>
</div>
<div class=\"sb-sidenav-footer\">
<div class=\"small\">Connecté en tant que:</div>
{user}
</div>
</nav>
</div>
";
}
// line 86
public function block_body($context, array $blocks = [])
{
$macros = $this->macros;
}
// line 88
public function block_script($context, array $blocks = [])
{
$macros = $this->macros;
// line 89
echo " <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"js/scripts.js\"></script>
<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"assets/demo/chart-area-demo.js\"></script>
<script src=\"assets/demo/chart-bar-demo.js\"></script>
<script src=\"https://cdn.jsdelivr.net/npm/simple-datatables@7.1.2/dist/umd/simple-datatables.min.js\" crossorigin=\"anonymous\"></script>
<script src=\"js/datatables-simple-demo.js\"></script>
";
}
public function getTemplateName()
{
return "base.html.twig";
}
public function getDebugInfo()
{
return array ( 191 => 89, 187 => 88, 181 => 86, 112 => 19, 108 => 18, 103 => 14, 99 => 13, 93 => 9, 89 => 8, 83 => 6, 78 => 97, 76 => 88, 73 => 87, 71 => 86, 68 => 85, 66 => 18, 62 => 16, 60 => 13, 57 => 12, 55 => 8, 50 => 6, 43 => 1,);
}
public function getSourceContext()
{
return new Source("", "base.html.twig", "/home/www/anpinagot/public_html/sae/Web/Sources/src/app/views/Templates/base.html.twig");
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

@ -1,9 +1,36 @@
<?php
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../config/config.php';
if (APP_ENV === 'console') {
require_once __DIR__ . '/../src/console/Console.php';
}
elseif (APP_ENV === 'development') {
require_once __DIR__ . 'index.html';
use App\AppCreator;
use App\Router\Middleware\LoggingMiddleware;
use App\Router\Request\RequestFactory;
use Shared\ArgumentControllerResolver;
use Shared\IArgumentResolver;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
use Shared\Log;
$appFactory = new AppCreator();
$appFactory->registerService(IArgumentResolver::class, ArgumentControllerResolver::class);
$appFactory->registerService(\Twig\Loader\LoaderInterface::class, function() {
return new FilesystemLoader(__DIR__ . '/../src/app/views/Templates');
});
$appFactory->registerService(\Twig\Environment::class,\Twig\Environment::class);
// Connexion à la base de données
// $databaseContext = DatabaseContext::getInstance();
$appFactory->AddControllers();
$app = $appFactory->create();
if (!is_null($app)){
// Ajout des Middleware
/*$app->use(new LoggingMiddleware());*/
$app->mapControllers();
$app->run(RequestFactory::createFromGlobals());
}

@ -0,0 +1,9 @@
window.addEventListener('DOMContentLoaded', event => {
// Simple-DataTables
// https://github.com/fiduswriter/Simple-DataTables/wiki
const datatablesSimple = document.getElementById('datatablesSimple');
if (datatablesSimple) {
new simpleDatatables.DataTable(datatablesSimple);
}
});

@ -0,0 +1,15 @@
document.getElementById('saveButton').addEventListener('click', function() {
var preferences = {
notifications: document.getElementById('notif').checked,
theme: document.getElementById('theme').value
};
fetch('/index.php/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(preferences),
})
.catch((error) => console.error('Error:', error));
});

@ -0,0 +1,26 @@
/*!
* Start Bootstrap - SB Admin v7.0.7 (https://startbootstrap.com/template/sb-admin)
* Copyright 2013-2023 Start Bootstrap
* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
*/
//
// Scripts
//
window.addEventListener('DOMContentLoaded', event => {
// Toggle the side navigation
const sidebarToggle = document.body.querySelector('#sidebarToggle');
if (sidebarToggle) {
// Uncomment Below to persist sidebar toggle between refreshes
// if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
// document.body.classList.toggle('sb-sidenav-toggled');
// }
sidebarToggle.addEventListener('click', event => {
event.preventDefault();
document.body.classList.toggle('sb-sidenav-toggled');
localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
});
}
});

@ -0,0 +1,158 @@
<?php
namespace App;
use App\Controller\BaseController;
use App\Controller\FrontController;
use App\Router\Request\HttpRequest;
use App\Router\Middleware\IHttpMiddleware;
use App\Router\Request\IRequest;
use App\Router\Route;
use App\Views\Directives\Navigate;
use Shared\Attributes\Route as RouteAttribute;
use App\Router\Router;
use App\Router\Session;
use Shared\Log;
class App
{
private string $appName;
private int $version;
private ?IHttpMiddleware $middlewarePipeline = null;
private Container $container;
private Router $router;
private array $controllers = [];
private FrontController $frontController;
public function __construct(string $appName, int $version, \App\Container $diContainer)
{
$this->appName = $appName;
$this->version = $version;
$this->container = $diContainer;
$this->router = new Router("");
$this->frontController = new FrontController($this->router,$this->container);
}
public function use(IHttpMiddleware $middleware)
{
if ($this->middlewarePipeline === null) {
$this->middlewarePipeline = $middleware;
} else {
// Chain the new middleware to the end of the existing pipeline
$currentMiddleware = $this->middlewarePipeline;
while ($currentMiddleware->getNext() !== null) {
$currentMiddleware = $currentMiddleware->getNext();
}
$currentMiddleware->setNext($middleware);
}
}
public function getAppName(): string
{
return $this->appName;
}
/* public function twigConfigure(array $extensionClassNames = []): void
{
if (!$this->container->has(\Twig\Environment::class)) {
throw new \LogicException('You cannot use the "twigConfigure" method if the Twig Bundle is not available. Try running "composer require twig/twig".');
}
$twigEnvironment = $this->container->get(\Twig\Environment::class);
if (empty($extensionClassNames)) {
$twigEnvironment->addExtension(new Navigate($this->router));
} else {
foreach ($extensionClassNames as $extensionClassName) {
if (class_exists($extensionClassName)) {
$extensionInstance = new $extensionClassName();
if ($extensionInstance instanceof \Twig\Extension\ExtensionInterface) {
$twigEnvironment->addExtension($extensionInstance);
} else {
throw new \InvalidArgumentException("Class '$extensionClassName' does not implement Twig\Extension\ExtensionInterface.");
}
} else {
throw new \InvalidArgumentException("Class '$extensionClassName' does not exist.");
}
}
}
}*/
public function getVersion(): int
{
return $this->version;
}
public function run(IRequest $request)
{
if ($this->middlewarePipeline == null) {
return $this->frontController->dispatch($request);
}
// Exécutez le middleware en utilisant le pipeline
return $this->middlewarePipeline->handle($request, function($request) {
// Logique de gestion principale de la requête ici
$this->frontController->dispatch($request);
});
}
/**
* @throws \ReflectionException
*/
public function mapControllers(): void
{
$classes = $this->container->getAllRegisteredClassNames();
foreach ($classes as $class) {
if ($this->isController($class)) {
$this->mapControllerRoutes($class);
}
}
}
/**
* @throws \ReflectionException
*/
function mapControllerRoutes(string $controllerClass): void
{
$reflectionClass = new \ReflectionClass($controllerClass);
$attributes = $reflectionClass->getAttributes(RouteAttribute::class);
$prefix = '';
if (!empty($attributes)) {
$prefix = $attributes[0]->newInstance()->getPath();
}
foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
foreach ($method->getAttributes(RouteAttribute::class) as $attribute) {
/** @var RouteAttribute $route */
$route = $attribute->newInstance();
$this->router->addControllerRoute(
implode('|', $route->getMethods()),
$prefix . $route->getPath(),
$controllerClass,
$method->getName(),
$route->getName()
);
}
}
}
function isController(string $class): bool
{
$reflectionClass = new \ReflectionClass($class);
return $reflectionClass->isSubclassOf(BaseController::class);
}
}

@ -0,0 +1,91 @@
<?php
namespace App;
use App\Controller\BaseController;
use Shared\Log;
use Twig\Loader\FilesystemLoader;
class AppCreator
{
private Container $container;
private array $services = [];
public function __construct()
{
$this->container = new Container;
}
public function registerService(string $serviceId, callable|string $service): self
{
$this->container->set($serviceId, $service);
$this->services[] = $serviceId;
return $this;
}
/**
* Create an instance or perform actions based on the current application environment.
*
* @return App|null An instance of the App class in the 'development' environment, or null in other environments.
*/
public function create(): ?App
{
// Check the application environment
switch (APP_ENV) {
case 'console':
// Load the Console.php file in case of the 'console' environment
require_once __DIR__ . '/../console/Console.php';
break;
case 'development':
// Create a new instance of the App class in the 'development' environment
return new App("HeartTrack", 1, $this->container);
break;
case 'html':
// Load the index.test.php file in case of the 'html' environment
require_once __DIR__ . '/index.test.php';
break;
default:
// Handle other environment cases here, if necessary
break;
}
return null;
}
function AddControllers($namespacePrefix = 'App\Controller', $pathToControllers = __DIR__ . '/controller'): self
{
$controllerFiles = glob($pathToControllers . '/*.php');
foreach ($controllerFiles as $file) {
// Get class name from file name
$class = basename($file, '.php');
$fullClassName = $namespacePrefix . '\\' . $class;
if (!class_exists($fullClassName)) {
continue;
}
// Use reflection to check if class extends BaseController
$reflectionClass = new \ReflectionClass($fullClassName);
if ($reflectionClass->isSubclassOf(BaseController::class)) {
// Register in DI container
$this->container->set($fullClassName, function () use ($fullClassName) {
$controllerInstance = new $fullClassName();
$controllerInstance->setContainer($this->container);
return $controllerInstance;
});
}
}
return $this;
}
public function getServiceRegistered(): array
{
return $this->services;
}
}

@ -0,0 +1,109 @@
<?php
namespace App;
use Psr\Container\ContainerInterface;
use Shared\Log;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
class Container implements ContainerInterface
{
private array $entries = [];
public function get(string $id)
{
if ($this->has($id)) {
$entry = $this->entries[$id];
if (is_callable($entry)) {
return $entry($this);
}
$id = $entry;
}
return $this->resolve($id);
}
public function has(string $id): bool
{
return isset($this->entries[$id]);
}
public function set(string $id, callable|string $concrete): void
{
$this->entries[$id] = $concrete;
}
public function resolve(string $id)
{
// 1. Inspect the class that we are trying to get from the container
try {
$reflectionClass = new \ReflectionClass($id);
} catch (\ReflectionException $e) {
throw new \Exception($e->getMessage(), $e->getCode(), $e);
}
if (!$reflectionClass->isInstantiable()) {
throw new \Exception('Class "' . $id . '" is not instantiable');
}
// 2. Inspect the constructor of the class
$constructor = $reflectionClass->getConstructor();
if (!$constructor) {
return new $id;
}
// 3. Inspect the constructor parameters (dependencies)
$parameters = $constructor->getParameters();
if (!$parameters) {
return new $id;
}
// 4. If the constructor parameter is a class then try to resolve that class using the container
$dependencies = array_map(
function (\ReflectionParameter $param) use ($id) {
$name = $param->getName();
$type = $param->getType();
// Check for a default value
if ($param->isDefaultValueAvailable()) {
return $param->getDefaultValue();
}
if (!$type) {
throw new \Exception(
'Failed to resolve class "' . $id . '" because param "' . $name . '" is missing a type hint'
);
}
if ($type instanceof \ReflectionUnionType) {
throw new \Exception(
'Failed to resolve class "' . $id . '" because of union type for param "' . $name . '"'
);
}
if ($type instanceof \ReflectionNamedType && !$type->isBuiltin()) {
return $this->get($type->getName());
}
throw new \Exception(
'Failed to resolve class "' . $id . '" because invalid param "' . $name . '"'
);
},
$parameters
);
return $reflectionClass->newInstanceArgs($dependencies);
}
public function getAllRegisteredClassNames(): array
{
return array_keys($this->entries);
}
}

@ -0,0 +1,177 @@
<?php
// namespace App\Controller;
// use App\Container;
// use App\Router\Request\IRequest;
// use App\Router\Response\Response;
// use Shared\Attributes\Route;
// use Twig\Environment;
// use Data\Core\Preferences;
// use Shared\Log;
// class AthleteController extends BaseController
// {
// #[Route(path: '/search-user', name: 'search-user', methods: ['GET'])]
// public function searchUser(string $username, IRequest $req): Response
// {
// $taberror = [];
// $utiliArray = [
// [
// 'nom' => 'John',
// 'prenom' => 'Doe',
// 'img' => 'john_doe',
// 'username' => 'johndoe',
// ],
// [
// 'nom' => 'Alice',
// 'prenom' => 'Smith',
// 'img' => 'alice_smith',
// 'username' => 'alicesmith',
// ],
// ];
// // if(!Validation::val_string($name)){
// try {
// //code...
// // $model->userMgr->getUser($name);
// return $this->render('./page/addfriend.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => $utiliArray,
// 'infoUser' => [],
// 'exos' => [],
// 'member' => [],
// 'responce' => "Notification d'ajout envoyée à $username"
// ]);
// } catch (\Throwable $th) {
// //throw $th;
// // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
// }
// // }
// }
// #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])]
// public function analyses(): Response
// {
// return $this->render('./page/analyze.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8
// public function exercice(): Response
// {
// return $this->render('./page/exercice.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/add-friend', name: 'add-friend', methods: ['POST'])]
// public function addFriend(string $username, IRequest $req): Response
// {
// $taberror = [];
// $utiliArray = [
// [
// 'nom' => 'John',
// 'prenom' => 'Doe',
// 'img' => 'john_doe',
// 'username' => 'johndoe',
// ],
// [
// 'nom' => 'Alice',
// 'prenom' => 'Smith',
// 'img' => 'alice_smith',
// 'username' => 'alicesmith',
// ],
// ];
// // if(!Validation::val_string($name)){
// try {
// //code...
// // $model->userMgr->addFriend($name);
// return $this->render('./page/addfriend.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => $utiliArray,
// 'infoUser' => [],
// 'exos' => [],
// 'member' => [],
// 'responce' => "Notification d'ajout envoyée à $username"
// ]);
// } catch (\Throwable $th) {
// //throw $th;
// // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
// }
// // }
// }
// #[Route(path: '/delete-friend', name: 'delete-friend', methods: ['POST'])]
// #[Route(path: '/friend', name: 'friend', methods: ['GET'])]
// public function friend(): Response
// {
// $utiliArray = [
// [
// 'nom' => 'John',
// 'prenom' => 'Doe',
// 'img' => 'john_doe',
// 'username' => 'johndoe',
// ],
// [
// 'nom' => 'Alice',
// 'prenom' => 'Smith',
// 'img' => 'alice_smith',
// 'username' => 'alicesmith',
// ],
// ];
// // $this->Auth->getUser->role->getFriends
// return $this->render('./page/addfriend.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => $utiliArray,
// 'infoUser' => [],
// 'exos' => [],
// 'member' => [],
// ]);
// }
// }

@ -0,0 +1,80 @@
<?php
// namespace App\Controller;
// use App\Container;
// use App\Router\Request\IRequest;
// use App\Router\Response\Response;
// use Shared\Attributes\Route;
// use Twig\Environment;
// use Data\Core\Preferences;
// use Shared\Log;
// class AuthController extends BaseController
// {
// #[Route('/login', name: 'login')]
// public function login(?string $username, ?string $password ,IRequest $request): Response {
// // if user is already logged in, don't display the login page again
// if ($user) {
// return $this->redirectToRoute('blog_index');
// }
// // this statement solves an edge-case: if you change the locale in the login
// // page, after a successful login you are redirected to a page in the previous
// // locale. This code regenerates the referrer URL whenever the login page is
// // browsed, to ensure that its locale is always the current one.
// $this->saveTargetPath($request->getSession(), 'main', $this->generateUrl('admin_index'));
// return $this->render('security/login.html.twig', [
// // last username entered by the user (if any)
// 'last_username' => $helper->getLastUsername(),
// // last authentication error (if any)
// 'error' => $helper->getLastAuthenticationError(),
// ]);
// }
// #[Route('/login', name: 'login')]
// public function login(?string $username, ?string $password ,IRequest $request): Response {
// // if user is already logged in, don't display the login page again
// if ($user) {
// return $this->redirectToRoute('blog_index');
// }
// // this statement solves an edge-case: if you change the locale in the login
// // page, after a successful login you are redirected to a page in the previous
// // locale. This code regenerates the referrer URL whenever the login page is
// // browsed, to ensure that its locale is always the current one.
// $this->saveTargetPath($request->getSession(), 'main', $this->generateUrl('admin_index'));
// return $this->render('security/login.html.twig', [
// // last username entered by the user (if any)
// 'last_username' => $helper->getLastUsername(),
// // last authentication error (if any)
// 'error' => $helper->getLastAuthenticationError(),
// ]);
// }
// function inscription() {
// $model = new ModelVisitor();
// $log=Validation::clean_string($_POST['pseudo']);
// $mdp=Validation::clean_string($_POST['password']);
// if($model->createAUser($log,$mdp)){
// if(ModelUser::login($log, $mdp)){
// UserControler::displayView();
// }
// }
// }
// function login() {
// $model = new ModelVisitor();
// if(!isset($_POST['pseudo']) || !isset($_POST['password'])) throw new Exception(" some wrong with credentials !!!!!");
// $log=Validation::clean_string($_POST['pseudo']);
// $mdp=Validation::clean_string($_POST['password']);
// if(ModelUser::login($log, $mdp)){
// UserControler::displayView();
// }
// }
// }

@ -0,0 +1,72 @@
<?php
namespace App\Controller;
use App\Container;
use App\Router\Response\RedirectResponse;
use App\Router\Response\Response;
use Psr\Container\ContainerInterface;
abstract class BaseController
{
protected ContainerInterface $container;
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
protected function renderView(string $view, array $parameters = []): string
{
if (!$this->container->has(\Twig\Environment::class)) {
throw new \LogicException('You cannot use the "renderView" method if the Twig Bundle is not available. Try running "composer require symfony/twig-bundle".');
}
return $this->container->get(\Twig\Environment::class)->render($view, $parameters);
}
/**
* Renders a view.
*
* If an invalid form is found in the list of parameters, a 422 status code is returned.
* Forms found in parameters are auto-cast to form views.
*/
protected function render(string $view, array $parameters = [], Response $response = null): Response
{
$content = $this->renderView($view, $parameters);
$response ??= new Response();
/* if (200 === $response->getStatusCode()) {
foreach ($parameters as $v) {
if ($v instanceof FormInterface && $v->isSubmitted() && !$v->isValid()) {
$response->setStatusCode(422);
break;
}
}
}*/
$response->setContent($content);
return $response;
}
protected function redirect(string $url, int $status = 302): RedirectResponse
{
return new RedirectResponse($url, $status);
}
protected function redirectToRoute(string $route, array $parameters = [], int $status = 302): RedirectResponse
{
return $this->redirect($this->generateUrl($route, $parameters), $status);
}
/*
* TODO : Should hanle ierror if the route is not existing
* */
protected function generateUrl(string $route, array $parameters = []): string
{
return $this->container->get(\App\Router\Router::class)->generate($route, $parameters);
}
}

@ -0,0 +1,128 @@
<?php
// namespace App\Controller;
// use App\Container;
// use App\Router\Request\IRequest;
// use App\Router\Response\Response;
// use App\Router\Response\IResponse;
// use Shared\Attributes\Route;
// use Twig\Environment;
// use Data\Core\Preferences;
// use Shared\Log;
// #[Route(path: '/coach', name: 'coach')]
// class CoachController extends BaseController
// {
// private ICoachManager $coachManager;
// private $security;
// public function __construct(DataManager $dataManager, Security $security)
// {
// $this->coachManager = $dataManager->coachMgr;
// $this->security = $security;
// }
// #[Route(path: '/', name: 'home', methods: ['GET'])]
// public function index(): Response
// {
// return $this->render('./page/home.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route('/global-stats', name: 'coach_global_stats', methods: ['GET'])]
// public function globalStats(): Response
// {
// // Add logic to fetch and process global stats
// return $this->render('coach/global_stats.html.twig');
// }
// #[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8
// public function exercice(): Response
// {
// return $this->render('./page/exercice.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/coaching', name: 'coaching', methods: ['GET'])]
// public function coaching(): Response
// {
// return $this->render('./page/coaching.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route('/list-athletes', name: 'coach_list_athletes')]
// public function listAthletes(): Response
// {
// $coach = $this->security->getUser();
// $athletes = $this->coachManager->getAthletesForCoach($coach);
// return $this->render('coach/list_athletes.html.twig', [
// 'athletes' => $athletes,
// ]);
// }
// #[Route('/athlete-analysis/{athleteId}', name: 'coach_athlete_analysis', methods: ['GET'])]
// public function athleteAnalysis($athleteId): Response
// {
// // Fetch and process data specific to the athlete
// return $this->render('coach/athlete_analysis.html.twig', [
// 'athleteId' => $athleteId,
// ]);
// }
// #[Route('/add-athlete/{athleteId}', name: 'coach_add_athlete', methods: ['POST'])]
// public function addAthlete(IRequest $request, $athleteId): IResponse
// {
// // Implement logic to add athlete
// // ...
// return $this->redirectToRoute('coach_list_athletes');
// }
// // #[Route('/remove-athlete', name: 'coach_remove_athlete', methods: ['POST'])]
// // public function removeAthlete(int $athleteId, IRequest $request): IResponse
// // {
// // return $this->redirectToRoute("/athletes");
// // }
// }

@ -0,0 +1,592 @@
<?php
namespace App\Controller;
use App\Container;
use App\Router\Request\IRequest;
use App\Router\Response\Response;
use Shared\Attributes\Route;
use Twig\Environment;
use Data\Core\Preferences;
use Shared\Log;
// TODO : Remove this BaseClass
class Controller extends BaseController
{
private Environment $twig;
private Preferences $preference;
public function __construct()
{
session_start();
$this->preference = new Preferences();
}
#[Route(path: '/', name: 'home', methods: ['GET'])]
public function index(): Response
{
return $this->render('./page/home.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/analyses', name: 'analyses', methods: ['GET'])]
public function analyses(): Response
{
return $this->render('./page/analyze.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/activity', name: 'activity', methods: ['GET'])]
public function activity(): Response
{
return $this->render('./page/activity.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8
public function exercice(): Response
{
return $this->render('./page/exercice.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/exercices', name: 'exercices', methods: ['POST'])] // 8
public function exercices(String $type, String $intensite, String $date, IRequest $req): Response
{
$exercicesArray = [
[
'date' => $date,
'type' => $type,
'intensite' => $intensite,
'status' => 'A venur',
]
];
return $this->render('./page/exercice.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => $exercicesArray,
'member' => []
]);
}
#[Route(path: '/search-user', name: 'search-user', methods: ['GET'])]
public function searchUser(string $username, IRequest $req): Response
{
$taberror = [];
// FILTER
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addfriend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/search-member', name: 'search-member', methods: ['GET'])]
public function searchMember(string $username, IRequest $req): Response
{
$taberror = [];
// FILTER
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/add-member', name: 'add-member', methods: ['POST'])]
public function addmember(string $username, IRequest $req): Response
{
$taberror = [];
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/member', name: 'member', methods: ['GET'])]
public function member(): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
#[Route(path: '/add-friend', name: 'add-friend', methods: ['POST'])]
public function addFriend(string $username, IRequest $req): Response
{
$taberror = [];
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addfriend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/friend', name: 'friend', methods: ['GET'])]
public function friend(): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
return $this->render('./page/addfriend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
#[Route(path: '/friendlist', name: 'friendlist', methods: ['POST'])]
public function friendlist(string $username, IRequest $req): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
/* TODO */
// -> Enlever ou bloquer un utilisateur en fonction de son username
return $this->render('./page/friend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => $utiliArray,
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
#[Route(path: '/friendlist', name: 'friendlist2', methods: ['GET'])]
public function friendlist2(): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'test',
'status' => 'johndoe',
'username' => 'jdoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'test2',
'status' => 'alicesmith',
'username' => 'asmith',
],
];
return $this->render('./page/friend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => $utiliArray,
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
#[Route(path: '/coaching', name: 'coaching', methods: ['GET'])]
public function coaching(): Response
{
return $this->render('./page/coaching.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/mail', name: 'mail', methods: ['GET'])]
public function mail(): Response
{
return $this->render('./page/mail.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/import', name: 'import', methods: ['GET'])]
public function import(): Response
{
return $this->render('./page/import.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/settings', name: 'settings', methods: ['GET'])]
public function settings(IRequest $req): Response
{
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/profile', name: 'profile', methods: ['GET'])]
public function profile(): Response
{
return $this->render('./page/profile.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/preferences', name: 'preferences', methods: ['POST'])]
public function preferences(string $theme, IRequest $req): Response
{
/*TODO*/
// VALIDER LES DONNEES
$this->preference->majCookie($theme);
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/psettings', name: 'psettings', methods: ['POST'])]
public function psettings(string $nom,string $prenom,string $dateNaissance,string $mail,string $tel, IRequest $req): Response
{
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => $prenom,
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/mdp', name: 'mdp', methods: ['POST'])]
public function mdp(string $ancienMotDePasse,string $nouveauMotDePasse,string $confirmerMotDePasse, IRequest $req): Response
{
// CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
}

@ -0,0 +1,74 @@
<?php
namespace App\Controller;
use App\Container;
use App\Router\Request\IRequest;
use App\Router\Response\Response;
use App\Router\Router;
use Shared\Exception\NotFoundHttpException;
use Shared\Exception\NotImplementedException;
use Shared\IArgumentResolver;
use Shared\Log;
class FrontController {
private Router $router;
private Container $container;
public function __construct(Router $router, Container $container) {
$this->router = $router;
$this->container = $container;
}
public function dispatch(IRequest $request) {
try {
$match = $this->router->match($request);
if (!is_null($match)) {
$method = $match['target'];
$controller = $this->getController($match['target']);
$callable = array($controller,$method[1]);
$request->addToBody($match['params']);
if (!is_callable($callable)){
throw new NotImplementedException('Controller target is not callable' .'Handle when route target is not a callable : not handle');
}
$argumentResolver = $this->container->get(IArgumentResolver::class);
$arguments = $argumentResolver->getArguments($request, $callable);
// check role
$response = call_user_func_array($callable, $arguments);
// should handle response properly like if it's a HTML, STING, JSON,....
$response->send();
} else {
$this->handleError(404, "Page not found");
}
} catch (NotFoundHttpException $e) {
$this->handleError(404, $e->getMessage());
}
}
private function getController($controllerSpec) {
if (is_array($controllerSpec)) {
$controllerName = $controllerSpec[0];
} else {
$controllerName = $controllerSpec;
}
return $this->container->get($controllerName);
}
// TODO : Don't work need Antoine help
private function handleError(int $statusCode, $message) : void {
if (!$this->container->has(\Twig\Environment::class)) {
throw new \LogicException('You cannot use the "renderView" method if the Twig Bundle is not available. Try running "composer require symfony/twig-bundle".');
}
$response = new Response($this->container->get(\Twig\Environment::class)->render('./error/error.html.twig',['title'=> $message , "code" => $statusCode, "name" => $message, "descr" => $message ]),$statusCode);
$response->send();
}
}
?>

@ -0,0 +1,36 @@
<?php
// namespace App\Controller;
// use App\Container;
// use App\Router\Request\IRequest;
// use App\Router\Response\Response;
// use Shared\Attributes\Route;
// use Twig\Environment;
// use Data\Core\Preferences;
// use Shared\Log;
// class HeartRateController extends BaseController
// {
// #[Route(path: '/import', name: 'import', methods: ['GET'])]
// public function import(): Response
// {
// return $this->render('./page/import.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// }

@ -0,0 +1,17 @@
<!-- #[Route(path: '/mail', name: 'mail', methods: ['GET'])]
public function mail(): Response
{
return $this->render('./page/mail.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
} -->

@ -0,0 +1,80 @@
<?php
// namespace App\Controller;
// use App\Container;
// use App\Router\Request\IRequest;
// use App\Router\Response\Response;
// use Shared\Attributes\Route;
// use Twig\Environment;
// use Data\Core\Preferences;
// use Shared\Log;
// class UserController extends BaseController
// {
// #[Route(path: '/', name: 'home', methods: ['GET'])]
// public function index(): Response
// {
// return $this->render('./page/home.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/settings', name: 'settings', methods: ['GET'])]
// public function settings(IRequest $req): Response
// {
// return $this->render('./page/settings.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/preferences', name: 'preferences', methods: ['POST'])]
// public function preferences(string $theme, IRequest $req): Response
// {
// /*TODO*/
// // VALIDER LES DONNEES
// $this->preference->majCookie($theme);
// return $this->render('./page/settings.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// }

@ -0,0 +1,52 @@
<?php
$listF= array (
"a" => array("img" => "test","nom" => "Kilou", "prenom" => "Clément", "status" => "En ligne"),
"b" => array("img" => "test2","nom" => "Kilou", "prenom" => "Frédérique", "status" => "En ligne"),
"c" => array("img" => "test3","nom" => "Kilou", "prenom" => "Hugo", "status" => "Hors ligne")
);
$listMe= array (
"a" => array("img" => "test","nom" => "Kilou", "prenom" => "Clément", "status" => "En ligne"),
"b" => array("img" => "test2","nom" => "Kilou", "prenom" => "Frédérique", "status" => "En ligne"),
"c" => array("img" => "test3","nom" => "Kilou", "prenom" => "Hugo", "status" => "Hors ligne")
);
$listA= array (
"a" => array("date" => "29/11/18","type" => "Nage", "bpm" => "116", "kmh" => "3.0","distance" => "0.6"),
"b" => array("date" => "27/11/18","type" => "Sprint", "bpm" => "143", "kmh" => "19.0","distance" => "4.2"),
"c" => array("date" => "23/11/18","type" => "Cyclisme", "bpm" => "126", "kmh" => "27.0","distance" => "30.0")
);
$listM= array (
"a" => array("lu" => "false","nom" => "Julien", "prenom" => "Clément", "message" => "Demande d'exercice"),
"b" => array("lu" => "true","nom" => "Ferdiloi", "prenom" => "Frédérique", "message" => "Coaching"),
"c" => array("lu" => "true","nom" => "Kuliqo", "prenom" => "Raphael", "message" => "Rendez-vous")
);
$listE= array (
"a" => array("date" => "20/10/23","type" => "Natation", "intensite" => "Fort", "status" => "Programmé"),
"b" => array("date" => "16/10/23","type" => "Boxe anglaise", "intensite" => "Moyen", "status" => "Fini"),
"c" => array("date" => "10/10/23","type" => "Cyclisme", "intensite" => "Moyen", "status" => "Fini")
);
$infoUser= array("img" => "test2", "nom"=>"Polika", "prenom" => "Amandine", "dateNaiss" => "24/05/1993", "favSport" => "Natation", "coach" => "M.Bastien", "description" => "Salut, c'est Frigiel");
$loader = new \Twig\Loader\FilesystemLoader(__DIR__.'/views/Templates');
$twig = new \Twig\Environment($loader);
$template=$twig->load('./page/exercice.html.twig');
$template->display([
'pp' => "test2",
'user' => "Amandine",
'role' => "Athlète",
'friendship' => $listF,
'analyzes' => $listA,
'mails' => $listM,
'users' => $listF,
'infoUser' => $infoUser,
'exos' => $listE,
'member' => $listMe
]);
?>

@ -0,0 +1,94 @@
<?php
namespace App\Router;
/**
* Represents a single route in the application.
*/
class Route
{
/**
* The name of the route.
*
* @var string|null
*/
private ?string $name;
/**
* The path for the route.
*
* @var string
*/
private string $path;
/**
* The callable to be executed when the route is matched.
*
* @var callable
*/
private $callable;
/**
* Constructor for the Route.
*
* @param string $path The path for the route.
* @param callable $callable The callable to be executed for this route.
* @param array|null $params Optional parameters for the route.
* @param string|null $name Optional name for the route.
*/
public function __construct(string $path, callable $callable, array $params = null, string $name = null)
{
$this->path = $path;
$this->callable = $callable;
$this->name = $name;
}
/**
* Gets the name of the route.
*
* @return string|null The name of the route.
*/
public function getName(): ?string
{
return $this->name;
}
/**
* Sets the name of the route.
*
* @param string|null $name The name to set.
*/
public function setName(?string $name): void
{
$this->name = $name;
}
/**
* Gets the callable associated with the route.
*
* @return callable The callable for this route.
*/
public function getCallable()
{
return $this->callable;
}
/**
* Gets the path for the route.
*
* @return string The path for the route.
*/
public function getPath(): string
{
return $this->path;
}
/**
* Sets the callable for the route.
*
* @param callable $callable The callable to set for this route.
*/
public function setCallable(callable $callable)
{
$this->callable = $callable;
}
}

@ -0,0 +1,116 @@
<?php
namespace App\Router;
use App\Router\Request\IRequest;
/**
* Router class to manage a collection of routes in the application.
* It provides functionalities to add routes and check if a given URL matches any of the defined routes.
*/
class Router {
/**
* The base path for routing.
*
* @var string
*/
private string $path;
/**
* Collection of routes.
*
* @var \AltoRouter
*/
private \AltoRouter $routes;
/**
* Supported HTTP verbs.
*
* @var string[]
*/
public static $verbs = ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'];
/**
* Constructor for Router.
*
* @param string $path The base path for the router.
*/
public function __construct(string $path = "/PHP/project/index.php") {
$this->path = $path;
$this->routes = new \AltoRouter();
}
/**
* Adds a new Route to the collection.
*
* @param string $method The HTTP method.
* @param Route $route The route object.
* @throws \InvalidArgumentException If method is not supported.
*/
public function add(string $method, Route $route) {
if (!in_array($method, self::$verbs)) {
throw new \InvalidArgumentException("Method not supported");
}
$this->routes->map($method, $route->getPath(), $route->getCallable(), $route->getName());
}
/**
* Adds a route for a controller action.
*
* @param string $method The HTTP method.
* @param string $path The path for the route.
* @param mixed $controller The controller object.
* @param string $action The action method in the controller.
* @param string $name (Optional) The name of the route.
* @throws \InvalidArgumentException If method is not supported.
*/
public function addControllerRoute(string $method, string $path, $controller, string $action, string $name = '') {
if (!in_array($method, self::$verbs)) {
throw new \InvalidArgumentException("Method not supported");
}
$this->routes->map($method, $path, [$controller, $action], $name);
}
// TODO: Implement the extractParams method.
// public function extractParams(string $path) {}
/**
* Adds a GET route.
*
* @param string $path The path for the route.
* @param callable $callable The callback function.
* @param string $name The name of the route.
*/
public function get(string $path, callable $callable, $name) {
$this->routes->map('GET', $path, $callable, $name);
}
// Similar methods for post, put, etc. can be added here.
/**
* Checks if the request can be processed.
*
* @param IRequest $request The request object.
* @return array|null The matched route or null if no match.
*/
public function match(IRequest $request): ?array {
return $this->routes->match($request->getRequestUri(), $request->getMethod()) ?: null;
}
/**
* Returns all routes.
*
* @return array The array of routes.
*/
public function getRoutes() {
return []; // TODO: Implement the actual logic to return routes.
}
public function generate (string $routeName, array $params = array()): string
{
return $this->routes->generate($routeName,$params);
}
}
?>

@ -0,0 +1,121 @@
<?php
/*
Use the static method getInstance to get the object.
*/
namespace App\Router;
class Session
{
const SESSION_STARTED = TRUE;
const SESSION_NOT_STARTED = FALSE;
// The state of the session
private $sessionState = self::SESSION_NOT_STARTED;
// THE only instance of the class
private static $instance;
private function __construct() {}
/**
* Returns THE instance of 'Session'.
* The session is automatically initialized if it wasn't.
*
* @return object
**/
public static function getInstance()
{
if ( !isset(self::$instance))
{
self::$instance = new self;
}
self::$instance->startSession();
return self::$instance;
}
/**
* (Re)starts the session.
*
* @return bool TRUE if the session has been initialized, else FALSE.
**/
private function startSession()
{
if ( $this->sessionState == self::SESSION_NOT_STARTED )
{
$this->sessionState = session_start();
}
return $this->sessionState;
}
/**
* Stores datas in the session.
* Example: $instance->foo = 'bar';
*
* @param name Name of the datas.
* @param value Your datas.
* @return void
**/
public function __set( $name , $value )
{
$_SESSION[$name] = $value;
}
/**
* Gets datas from the session.
* Example: echo $instance->foo;
*
* @param name Name of the datas to get.
* @return mixed Datas stored in session.
**/
public function __get( string $name )
{
if ( isset($_SESSION[$name]))
{
return $_SESSION[$name];
}
}
public function __isset( $name )
{
return isset($_SESSION[$name]);
}
public function __unset( $name )
{
unset( $_SESSION[$name] );
}
/**
* Destroys the current session.
*
* @return bool TRUE is session has been deleted, else FALSE.
**/
public function destroy()
{
if ( $this->sessionState == self::SESSION_STARTED )
{
$this->sessionState = !session_destroy();
unset( $_SESSION );
return !$this->sessionState;
}
return FALSE;
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Router\Middleware;
use App\Router\Request\IRequest;
use Shared\Validation\Validator;
class RequestValidationMiddleware extends Middleware {
private $validator;
private $rules;
public function __construct(Validator $validator, array $rules) {
$this->validator = $validator;
$this->rules = $rules;
}
public function handle(IRequest $request, callable $next) {
$this->validateRequest($request);
return parent::handle($request, $next);
}
private function validateRequest(IRequest $request) {
foreach ($this->rules as $param => $ruleSet) {
foreach ($ruleSet as $rule) {
$this->validator->rule($param, $rule['callback'], $rule['message']);
}
}
$requestData = array_merge($request->getQueryParameters(), $request->getRequestParameters());
$this->validator->assert($requestData);
}
}
// $validationRules = [
// 'email' => [
// ['callback' => Validator::required(), 'message' => 'Email is required.'],
// ['callback' => Validator::email(), 'message' => 'Email must be a valid email address.']
// ],
// // Add more rules as needed
// ];

@ -0,0 +1,9 @@
<?php
namespace App\Router\Middleware;
use App\Router\Request\IRequest;
interface IHttpMiddleware {
public function handle(IRequest $request, callable $next);
}

@ -0,0 +1,12 @@
<?php
namespace App\Router\Middleware;
use App\Router\Request\IRequest;
class LoggingMiddleware extends Middleware {
public function handle(IRequest $request, callable $next) {
// Logique de journalisation
echo "LoggingMiddleware: Log request - Method: {$request->getMethod()}, URI: {$request->getRequestUri()}\n";
return parent::handle($request, $next);
}
}

@ -0,0 +1,20 @@
<?php
namespace App\Router\Middleware;
use App\Router\Request\IRequest;
abstract class Middleware implements IHttpMiddleware {
protected $next;
public function setNext(IHttpMiddleware $nextMiddleware) {
$this->next = $nextMiddleware;
}
public function handle(IRequest $request, callable $next) {
if ($this->next !== null) {
return $this->next->handle($request, $next);
}
return $next($request);
}
}

@ -0,0 +1,6 @@
<?php
namespace App\Router\Request;
interface ContentStrategy {
public function getContent(): array;
}

@ -0,0 +1,23 @@
<?php
namespace App\Router\Request;
// should maybe change this
class ContentStrategyFactory {
private static $strategyMap = [
'application/json' => JsonContentStrategy::class,
// Format...
];
public static function createContentStrategy(string $contentType, string $requestMethod): ContentStrategy {
foreach (self::$strategyMap as $type => $className) {
if ($contentType === $type || in_array($requestMethod, ['PUT', 'PATCH', 'DELETE'])) {
return new $className();
}
}
return new FormContentStrategy();
}
public static function registerStrategy(string $contentType, string $className): void {
self::$strategyMap[$contentType] = $className;
}
}

@ -0,0 +1,9 @@
<?php
namespace App\Router\Request;
class FormContentStrategy implements ContentStrategy {
public function getContent(): array {
return $_POST;
}
}

@ -0,0 +1,55 @@
<?php
namespace App\Router\Request;
class HttpRequest implements IRequest {
private $queryParameters;
private $requestParameters;
private $method;
private $requestUri;
private $headers;
private array $body;
public function __construct(
array $query,
array $server,
array $headers,
ContentStrategy $contentStrategy,
array $body
) {
$this->queryParameters = $query;
$this->requestUri = $server['REQUEST_URI'] ?? '';
$this->method = strtoupper($server['REQUEST_METHOD'] ?? 'GET');
$this->headers = $headers;
$this->requestParameters = $contentStrategy->getContent();
$this->body = $body;
}
public function getQueryParameters(): array {
return $this->queryParameters;
}
public function getRequestParameters(): array {
return $this->requestParameters;
}
public function getMethod(): string {
return $this->method;
}
public function getRequestUri(): string {
return $this->requestUri;
}
public function getHeaders(): array {
return $this->headers;
}
public function getBody(): array{
return $this->body;
}
public function addToBody(string|array $attributes){
$this->body[] = $attributes;
}
}

@ -0,0 +1,16 @@
<?php
namespace App\Router\Request;
interface IRequest
{
public function getRequestUri();
public function getBody();
public function addToBody(string|array $attributes);
public function getHeaders();
public function getMethod();
public function getQueryParameters(): array;
public function getRequestParameters(): array;
}

@ -0,0 +1,9 @@
<?php
namespace App\Router\Request;
class JsonContentStrategy implements ContentStrategy {
public function getContent(): array {
$rawContent = file_get_contents('php://input');
return json_decode($rawContent, true) ?? [];
}
}

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

Loading…
Cancel
Save