Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f46c179a6a | ||
|
|
d9e1cef279 | ||
|
|
99c9ccf77d | ||
|
|
00959bd8de | ||
|
|
fbae301eec | ||
|
|
81137bf50f | ||
|
|
3995a3e939 | ||
|
|
c211acdb3d | ||
|
|
ea3e492f6a | ||
|
|
960596871e | ||
|
|
9d7e0b54a6 | ||
|
|
812e5734f2 | ||
|
|
cb92f1146c | ||
|
|
cb8172dfcc | ||
|
|
2d75c27a43 | ||
|
|
936711bf2c | ||
|
|
626e7c8f42 | ||
|
|
5ffe6d9201 | ||
|
|
daca48e6ca | ||
|
|
44d8d495e7 | ||
|
|
878ff25dba | ||
|
|
bb42d856cc | ||
|
|
84d4acd791 | ||
|
|
4c47fa5601 | ||
|
|
3ff29ac7c1 | ||
|
|
d256392ad5 | ||
|
|
36afc56fb3 | ||
|
|
3c04687fbf | ||
|
|
61129d6625 | ||
|
|
942ae1d1f9 | ||
|
|
18b32d1892 | ||
|
|
436d57081e | ||
|
|
3ed27deca8 | ||
|
|
6d6cb1e727 | ||
|
|
4a5eca446c | ||
|
|
a0aa148c35 | ||
|
|
818ab0b6f9 | ||
|
|
58cb9bfcf7 | ||
|
|
dedc9a261e | ||
|
|
4302503af3 | ||
|
|
52541b5eca | ||
|
|
983d110233 | ||
|
|
f238d983e9 | ||
|
|
2e22a520db | ||
|
|
059fe35431 | ||
|
|
243b84b4af | ||
|
|
f5a2d63341 | ||
|
|
914db2a695 | ||
|
|
4755c19221 |
@@ -1,2 +0,0 @@
|
||||
node_modules
|
||||
npm-debug.log
|
||||
@@ -1,7 +0,0 @@
|
||||
FROM node:18
|
||||
WORKDIR /usr/src/app
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
EXPOSE 8080
|
||||
CMD [ "node", "ljdp.js" ]
|
||||
@@ -0,0 +1,5 @@
|
||||
# le journal d'un podcast
|
||||
|
||||

|
||||
|
||||
Ton journal quoitidien.
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
secret: "P94ZN8XEZjDUy2LLvV7b569QEKGXgp4pepik7Jj9LXbp3qsnz"
|
||||
};
|
||||
@@ -1,121 +0,0 @@
|
||||
const config = require("../config/auth.config");
|
||||
const db = require("../models");
|
||||
const User = db.user;
|
||||
const Role = db.role;
|
||||
|
||||
var jwt = require("jsonwebtoken");
|
||||
var bcrypt = require("bcryptjs");
|
||||
|
||||
exports.signup = (req, res) => {
|
||||
const user = new User({
|
||||
username: req.body.username,
|
||||
email: req.body.email,
|
||||
password: bcrypt.hashSync(req.body.password, 8),
|
||||
active: false,
|
||||
balance: 0,
|
||||
walletid: null
|
||||
});
|
||||
|
||||
user.save((err, user) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
if (req.body.roles) {
|
||||
Role.find(
|
||||
{
|
||||
name: { $in: req.body.roles }
|
||||
},
|
||||
(err, roles) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
user.roles = roles.map(role => role._id);
|
||||
user.save(err => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
res.send({ message: "l'utilisateur à été créé avec succès" });
|
||||
});
|
||||
}
|
||||
);
|
||||
} else {
|
||||
Role.findOne({ name: "user" }, (err, role) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
user.roles = [role._id];
|
||||
user.save(err => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
res.send({ message: "l'utilisateur à été créé avec succès. vous pouvez maintenant vous identifiez" });
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
exports.signin = (req, res) => {
|
||||
User.findOne({
|
||||
username: req.body.username
|
||||
})
|
||||
.populate("roles", "-__v")
|
||||
.exec((err, user) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).send({ message: "rip utilisateur introuvable" });
|
||||
}
|
||||
|
||||
var passwordIsValid = bcrypt.compareSync(
|
||||
req.body.password,
|
||||
user.password
|
||||
);
|
||||
|
||||
|
||||
if (!passwordIsValid) {
|
||||
return res.status(401).send({
|
||||
accessToken: null,
|
||||
message: "oof! mauvais mot de passe"
|
||||
});
|
||||
}
|
||||
|
||||
if (!user.active) {
|
||||
return res.status(401).send({
|
||||
accessToken: null,
|
||||
message: "oof! ta pas activé ton compte my brother in christ"
|
||||
});
|
||||
}
|
||||
|
||||
var token = jwt.sign({ id: user.id, name: user.username }, config.secret, {
|
||||
expiresIn: 86400 // 24 hours
|
||||
});
|
||||
|
||||
var authorities = [];
|
||||
|
||||
for (let i = 0; i < user.roles.length; i++) {
|
||||
authorities.push("ROLE_" + user.roles[i].name.toUpperCase());
|
||||
}
|
||||
res.status(200).send({
|
||||
id: user._id,
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
roles: authorities,
|
||||
accessToken: token,
|
||||
message: "utilisateur authentifié"
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -1,12 +0,0 @@
|
||||
exports.allAccess = (req, res) => {
|
||||
res.status(200).send({ message: "ljdp.ca"});
|
||||
};
|
||||
|
||||
exports.userBoard = (req, res) => {
|
||||
res.status(200).send({ message: "bienvenue "+req.userName });
|
||||
console.log(req.userId);
|
||||
};
|
||||
|
||||
exports.adminBoard = (req, res) => {
|
||||
res.status(200).send({ message: "admin btw" });
|
||||
};
|
||||
@@ -1,59 +0,0 @@
|
||||
const jwt = require("jsonwebtoken");
|
||||
const config = require("../config/auth.config.js");
|
||||
const db = require("../models");
|
||||
const User = db.user;
|
||||
const Role = db.role;
|
||||
|
||||
verifyToken = (req, res, next) => {
|
||||
let token = req.headers["x-access-token"];
|
||||
|
||||
if (!token) {
|
||||
return res.status(403).send({ message: "token introuvable :*(" });
|
||||
}
|
||||
|
||||
jwt.verify(token, config.secret, (err, decoded) => {
|
||||
if (err) {
|
||||
return res.status(401).send({ message: "non autorisé lol" });
|
||||
}
|
||||
req.userId = decoded.id;
|
||||
req.userName = decoded.name;
|
||||
next();
|
||||
});
|
||||
};
|
||||
|
||||
isAdmin = (req, res, next) => {
|
||||
User.findById(req.userId).exec((err, user) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
Role.find(
|
||||
{
|
||||
_id: { $in: user.roles }
|
||||
},
|
||||
(err, roles) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < roles.length; i++) {
|
||||
if (roles[i].name === "admin") {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
res.status(403).send({ message: "yo t'es pas admin :(" });
|
||||
return;
|
||||
}
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
const authJwt = {
|
||||
verifyToken,
|
||||
isAdmin,
|
||||
};
|
||||
module.exports = authJwt;
|
||||
@@ -1,7 +0,0 @@
|
||||
const authJwt = require("./authJwt");
|
||||
const verifySignUp = require("./verifySignUp");
|
||||
|
||||
module.exports = {
|
||||
authJwt,
|
||||
verifySignUp
|
||||
};
|
||||
@@ -1,121 +0,0 @@
|
||||
const db = require("../models");
|
||||
const dev = require("deep-email-validator");
|
||||
const ROLES = db.ROLES;
|
||||
const User = db.user;
|
||||
|
||||
checkDuplicateUsernameOrEmail = (req, res, next) => {
|
||||
// Username
|
||||
User.findOne({
|
||||
username: req.body.username
|
||||
}).exec((err, user) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
if (user) {
|
||||
res.status(400).send({ message: "oof! ce nom d'utilisateur est déjà utilisé" });
|
||||
return;
|
||||
}
|
||||
|
||||
// Email
|
||||
User.findOne({
|
||||
email: req.body.email
|
||||
}).exec((err, user) => {
|
||||
if (err) {
|
||||
res.status(500).send({ message: err });
|
||||
return;
|
||||
}
|
||||
|
||||
if (user) {
|
||||
res.status(400).send({ message: "oof! cette addresse courriel est déjà utilisé" });
|
||||
return;
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
checkRolesExisted = (req, res, next) => {
|
||||
if (req.body.roles) {
|
||||
for (let i = 0; i < req.body.roles.length; i++) {
|
||||
if (!ROLES.includes(req.body.roles[i])) {
|
||||
res.status(400).send({
|
||||
message: `oof! ce role ${req.body.roles[i]} n'existe pas`
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
validateEmail = async (req, res, next) => {
|
||||
if (req.body.email) {
|
||||
const emailRes = await dev.validate({
|
||||
email: req.body.email,
|
||||
sender: req.body.email,
|
||||
validateRegex: true,
|
||||
valideMx: true,
|
||||
validateTypo: true,
|
||||
validateDisposable: true,
|
||||
validateSMTP: false,
|
||||
})
|
||||
console.log((emailRes.valid))
|
||||
if (!emailRes.valid) {
|
||||
res.status(400).send({
|
||||
message: "oof! ton email est pas valide loco"
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
|
||||
checkPassLimit = (req, res, next) => {
|
||||
|
||||
function isUpperCase(str) {
|
||||
return str === str.toUpperCase();
|
||||
}
|
||||
|
||||
if (req.body.password) {
|
||||
if (req.body.password.length <= 8) {
|
||||
res.status(400).send({
|
||||
message: "oof! ce password ne respecte pas la longueur minimal."
|
||||
});
|
||||
return;
|
||||
}
|
||||
else {
|
||||
var upper = 0;
|
||||
for (let c of req.body.password) {
|
||||
if (isUpperCase(c))
|
||||
{
|
||||
upper = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (upper != 1)
|
||||
{
|
||||
res.status(400).send({
|
||||
message: "oof! ce password n'a aucune majuscule."
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
const verifySignUp = {
|
||||
checkDuplicateUsernameOrEmail,
|
||||
checkRolesExisted,
|
||||
validateEmail,
|
||||
checkPassLimit
|
||||
};
|
||||
|
||||
module.exports = verifySignUp;
|
||||
@@ -1,13 +0,0 @@
|
||||
const mongoose = require('mongoose');
|
||||
mongoose.Promise = global.Promise;
|
||||
|
||||
const db = {};
|
||||
|
||||
db.mongoose = mongoose;
|
||||
|
||||
db.user = require("./user.model");
|
||||
db.role = require("./role.model");
|
||||
|
||||
db.ROLES = ["user", "admin"];
|
||||
|
||||
module.exports = db;
|
||||
@@ -1,10 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const Role = mongoose.model(
|
||||
"Role",
|
||||
new mongoose.Schema({
|
||||
name: String
|
||||
})
|
||||
);
|
||||
|
||||
module.exports = Role;
|
||||
@@ -1,21 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const User = mongoose.model(
|
||||
"User",
|
||||
new mongoose.Schema({
|
||||
username: String,
|
||||
email: String,
|
||||
password: String,
|
||||
active: Boolean,
|
||||
balance: Number,
|
||||
walletid: String,
|
||||
roles: [
|
||||
{
|
||||
type: mongoose.Schema.Types.ObjectId,
|
||||
ref: "Role"
|
||||
}
|
||||
]
|
||||
})
|
||||
);
|
||||
|
||||
module.exports = User;
|
||||
@@ -1,25 +0,0 @@
|
||||
const { verifySignUp } = require("../middlewares");
|
||||
const controller = require("../controllers/auth.controller");
|
||||
|
||||
module.exports = function(app) {
|
||||
app.use(function(req, res, next) {
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"x-access-token, Origin, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/api/auth/signup",
|
||||
[
|
||||
verifySignUp.checkDuplicateUsernameOrEmail,
|
||||
verifySignUp.checkRolesExisted,
|
||||
verifySignUp.validateEmail,
|
||||
verifySignUp.checkPassLimit
|
||||
],
|
||||
controller.signup
|
||||
);
|
||||
|
||||
app.post("/api/auth/signin", controller.signin);
|
||||
};
|
||||
@@ -1,22 +0,0 @@
|
||||
const { authJwt } = require("../middlewares");
|
||||
const controller = require("../controllers/user.controller");
|
||||
|
||||
module.exports = function(app) {
|
||||
app.use(function(req, res, next) {
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"x-access-token, Origin, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.get("/api/all", controller.allAccess);
|
||||
|
||||
app.get("/api/user", [authJwt.verifyToken], controller.userBoard);
|
||||
|
||||
app.get(
|
||||
"/api/admin",
|
||||
[authJwt.verifyToken, authJwt.isAdmin],
|
||||
controller.adminBoard
|
||||
);
|
||||
};
|
||||
@@ -28,8 +28,6 @@
|
||||
border: 3px solid #4B0082;
|
||||
}
|
||||
|
||||
:root { background-attachment: fixed; }
|
||||
|
||||
body {
|
||||
height: 100vh;
|
||||
background-image: url("../img/winxp.jpg");
|
||||
@@ -62,11 +60,6 @@ body {
|
||||
text-shadow: 4px 0px var(--teal);
|
||||
}
|
||||
|
||||
.typebox {
|
||||
margin-top: 2%;
|
||||
margin-bottom: 2%;
|
||||
}
|
||||
|
||||
#sbody {
|
||||
font-size: 15px;
|
||||
margin-left: 5px;
|
||||
@@ -112,55 +105,22 @@ body {
|
||||
|
||||
}
|
||||
|
||||
#bjlogin {
|
||||
margin: 0 auto;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
#reg_status {
|
||||
margin: 0 auto;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align:center;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
#bjmenu {
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
#tab1bj {
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.bjbuttons {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
#mainbj {
|
||||
padding: 3%;
|
||||
border: 1px solid black;
|
||||
background-color: #F3F3EF;
|
||||
}
|
||||
|
||||
.ws:link {
|
||||
#ws:link {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.ws:visited {
|
||||
#ws:visited {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.ws:hover {
|
||||
#ws:hover {
|
||||
text-decoration: none;
|
||||
color: coral;
|
||||
}
|
||||
|
||||
.ws:active {
|
||||
#ws:active {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
@@ -543,7 +543,7 @@ legend {
|
||||
|
||||
menu[role=tablist] {
|
||||
position: relative;
|
||||
margin: 0 0 0;
|
||||
margin: 0 0 -2px;
|
||||
text-indent: 0;
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
@@ -551,7 +551,6 @@ menu[role=tablist] {
|
||||
}
|
||||
|
||||
menu[role=tablist] button {
|
||||
background: #d0d0bf;
|
||||
z-index: 1;
|
||||
display: block;
|
||||
color: #222;
|
||||
@@ -560,11 +559,19 @@ menu[role=tablist] button {
|
||||
}
|
||||
|
||||
menu[role=tablist] button[aria-selected=true] {
|
||||
padding-bottom: 2px;
|
||||
margin-top: -2px;
|
||||
background-color: #ece9d8;
|
||||
position: relative;
|
||||
margin-bottom: -2px;
|
||||
z-index: 8;
|
||||
margin-left: -3px;
|
||||
margin-bottom: 1px
|
||||
}
|
||||
|
||||
menu[role=tablist] button:focus {
|
||||
outline: 1px dotted #222;
|
||||
outline-offset: -4px
|
||||
}
|
||||
|
||||
menu[role=tablist].justified button {
|
||||
flex-grow: 1;
|
||||
@@ -991,8 +998,14 @@ legend {
|
||||
}
|
||||
|
||||
menu[role=tablist] button {
|
||||
padding: 0 12px 3px;
|
||||
border-bottom: 1px solid black;
|
||||
background: linear-gradient(180deg, #fff, #fafaf9 26%, #f0f0ea 95%, #ecebe5);
|
||||
margin-left: -1px;
|
||||
margin-right: 2px;
|
||||
border-radius: 0;
|
||||
border-color: #91a7b4;
|
||||
border-top-right-radius: 3px;
|
||||
border-top-left-radius: 3px;
|
||||
padding: 0 12px 3px
|
||||
}
|
||||
|
||||
menu[role=tablist] button:hover {
|
||||
@@ -1002,17 +1015,23 @@ menu[role=tablist] button:hover {
|
||||
}
|
||||
|
||||
menu[role=tablist] button[aria-selected=true] {
|
||||
background: #F3F3EF;
|
||||
border-color: #919b9c;
|
||||
margin-right: -1px;
|
||||
border-bottom: 1px solid transparent;
|
||||
border-top: 1px solid #e68b2c;
|
||||
box-shadow: inset 0 2px #ffc73c;
|
||||
border-bottom: 1px solid #F3F3EF;
|
||||
box-shadow: inset 0 2px #ffc73c
|
||||
}
|
||||
|
||||
menu[role=tablist] button[aria-selected=true]:first-of-type:before {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
top: 100%;
|
||||
left: -1px;
|
||||
height: 2px;
|
||||
width: 0;
|
||||
border-left: 1px solid #919b9c
|
||||
}
|
||||
|
||||
ul.tree-view {
|
||||
|
Before Width: | Height: | Size: 662 KiB After Width: | Height: | Size: 662 KiB |
|
Before Width: | Height: | Size: 572 B After Width: | Height: | Size: 572 B |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 912 KiB After Width: | Height: | Size: 912 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 855 KiB After Width: | Height: | Size: 855 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |