From e1ddb297f2f4dbf4eeeaa9733b236b24228a4ab6 Mon Sep 17 00:00:00 2001
From: Pierre Jarriges <pierre.jarriges@tutanota.com>
Date: Sun, 18 Jul 2021 16:47:03 +0200
Subject: [PATCH] update software articles

---
 public/articles/software/index.json           |    9 +-
 .../software/mentalo/images/mental-eau.png    |  Bin 0 -> 17155 bytes
 public/articles/software/mentalo/mentalo.json |   19 +
 public/articles/software/mentalo/mentalo.txt  |    2 +
 .../images/obj-to-html-logo.png               |  Bin 0 -> 952 bytes
 .../object-to-html-renderer.json              |   18 +
 .../object-to-html-renderer.txt               |    1 +
 .../images/kuadrado-template-screen.png       |  Bin 39284 -> 0 bytes
 .../website-template/website-template.json    |   13 -
 .../website-template/website-template.txt     |    3 -
 public/education/education.js                 |  665 ++++++++-
 public/games/games.js                         |  772 +++++++++-
 public/main.js                                |  965 ++++++++++++-
 .../software-development.js                   |  813 ++++++++++-
 public/style/style.css                        | 1278 ++++++++++++++++-
 src/lib/article-utils.js                      |    2 +-
 .../components/software-articles.js           |   11 +-
 .../software-development.scss                 |   59 +-
 18 files changed, 4559 insertions(+), 71 deletions(-)
 create mode 100644 public/articles/software/mentalo/images/mental-eau.png
 create mode 100755 public/articles/software/mentalo/mentalo.json
 create mode 100755 public/articles/software/mentalo/mentalo.txt
 create mode 100644 public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png
 create mode 100755 public/articles/software/object-to-html-renderer/object-to-html-renderer.json
 create mode 100755 public/articles/software/object-to-html-renderer/object-to-html-renderer.txt
 delete mode 100644 public/articles/software/website-template/images/kuadrado-template-screen.png
 delete mode 100644 public/articles/software/website-template/website-template.json
 delete mode 100644 public/articles/software/website-template/website-template.txt

diff --git a/public/articles/software/index.json b/public/articles/software/index.json
index 82e6d2b..62342be 100755
--- a/public/articles/software/index.json
+++ b/public/articles/software/index.json
@@ -1,3 +1,8 @@
 {
-    "articles": ["watergun", "website-template", "make_frames"]
-}
+    "articles": [
+        "mentalo",
+        "object-to-html-renderer",
+        "make_frames",
+        "watergun"
+    ]
+}
\ No newline at end of file
diff --git a/public/articles/software/mentalo/images/mental-eau.png b/public/articles/software/mentalo/images/mental-eau.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed6c2eeced7fbb226d7c30e1a526b7c0b09c6d93
GIT binary patch
literal 17155
zcmZvEdq7NG*Z5QjA@^Jx3CV39*MvH531JXIG#<BHi$auUM+jk1gy^_Lh(fyKlw?#-
zjY=hz={8L@YVOUMnRE93ojmXJz3=yXzdxk2&t7Y<`(A79eY&uEm22;w!+Nq<tlrC(
zE?&!GnL-w;i+6W3W+c<}`WzO^<m}!>i&igNv}n{JKi}PZ5A0&G#$OA*=Cm|t{)k+j
z=VO=6BYuslzxtr(>8@+~WxK?$KGXBThCOB3jU}8tC0Aq9X7^0!YK{$#?=z(+V@_Jn
z)3xU3qoX4phDVY_?AOtsLmT+-GIeP|=H&1}Pws5p5%PS~k~z2gzDZwiLtY#;y8EA9
zruUz&bzHL|+y7)uj<6zgwn*iylb#=cBErP^)bX1w=Um<`n3ue_<*x3+qZecBKS@75
z>bCVNc}@1F!1r!=ALEJL-@e33FFg9R@O7x9&+f5{#>R}fV*h-J9=<5(DV<!j@A2o&
zx<*bfY4VL-38f<z_YdEAy1U7=ed8aQS{&XybM1=Qy;xlx`w%rceW%}z>@TlFCaha}
zg-u!V1NILd_qitakZCjjb(_FuRGP&MSqdF|psH}dC`GR=dk=zSlNI2)m+$`9w)X>u
zr=|JqS6LrQH`8D(*KHivhCCrwvwn)2qy6TKCx1<9>L~vqY%#m~AYrXTR<_L_TVj75
z6$FIM2{P(d#1rfn)_xx}#Rs}DdYQg@#X6VyjH<etu=<&>Mw_r^vF!gi$Xd&qJm&&y
zcbD#GyRz<gXFWG_y6eWuVoj4e?nMVLp(~3wZ6C*gn;coY%AGa8>HF@^hwW~zi&^Kp
zj$Fz-^f<J1lRt|!#kTXG$??b7F=o*G$g-6#<`VPXJvcVeNe;El(9k0;8;>mVJ$P`J
z&k@!lzg>SG*|l?2z}_Q!M!7Cqx!U7YA1fAX6l>Yy1?!IgXsc=2{wS^gxw_Jke}&Ba
zoQ~q1O7C5Eal0|=jFwLnT|YL0db*{%4b)-RXQE#@Ha5Ze-o5(%nr^yO+%eQ7)}QLd
zDoF}n!fF|TnT2RxvQg}g&Y@I36>&v5owZbKP;%#d7O_SJ%Y<0VCJZhUF(ZNH0#K5~
z%!$!9;F=c<ls8S<Idx9CjV>>8Gn9cGtYzcBW@j{lP^`u4AJ_)wX#w*PK=~@{ni-HQ
zs5d-QF8~XbVOYx+=8e^VzKQjO4&(q$1Aat^x`C3(XgJk_At9p^P0LLN^#7Vb)o~5~
zYn>Vuk&PcI_y@zX)XpXT&%u8v`i(Zihkk@>I>Af<839RgEjL5*zZQ=0(f@ygsM(JG
zKUXujVl7es5d1fsK`Y>waKOcXz3@N|n*T&tjv1B_zbXAU?Ej#bvFTVIBb$HISn?8R
zBCh<V7_aC4#+}HF@c-fA_xs;Zov;n}@me<Bg~3O<V%eCX2Q20eVbyj%{mBaHd>5-T
z$vS0A8>FwU@y%JnOGoCJ&fXT=V3JigdZd7LWl+nBE{9^53U`ErE}mm;I%1S5SXj&L
zPW3p2*>H;3=#1)L4+^_3@XWhOfEqv!Sg2d{_Y8&I8Gl~q{2EIeg<Y(&OAIJ98O<pY
zJDAR%->B6iGf*-WNLjVruUV7K!)ZnVQ~n-Bpq5)}2}*1`G3GFoLI%I)BVv=CkD4#c
zFA-Ndr*<mM`tM&T<`;L^L((}{VaF_3(1e>Uo~;|pfPSS0EL8swt&L|%#;BQzXH=F9
zhCY26c9{7SA<2N9X%Fj54)~i<>4!5}c;5{6|1hnvYn(<YxwYJ-cCfCK!hb>EHTGv9
zn)%&-W9pQ}*L05g`6GWZGWs{ZFY&n1FXSKL#9IE>dQ^`SPRwBBzopD9c!MD}i=nkW
z%xv*L!vC-Jvhb_>RYHte{vH{|{73bm9OuV2{4WXo=IKkpEc9ECfsKqm{v(sW@p;|E
zU=ONCU3FC7JO4=n!_SsTgfT)DVh@Zq%p)TeazIJ$KRo^|;eU+d#HQbj#STCWL?<zf
zAgU?<PR3iV{nrYetC0iz4l<J?0i)jE^B6w1Dw)7hz%cS#q5m?yr5?Yf|F=c`O-E61
zr!^kI{-)_48uniQO)nE}?)}e-|I+H0f`1F@0hNPiF;?<ht}PdTPyG)LKc;gS!}t#k
zGAyL`Vr(+M(_sFQgKBvvQI=q#F2`i_Kg0h;)|BA(0+Z1r)xVWA1O0Du84eP&*r-#E
zbl-n?=o}O>k(UD*gV6si$lrqhFS5Q&yvrEYQXxaff7+no|Ip8ucn3!R|H9DJsm6bn
zJ7M#0wf$QYf2&9JhB5c?o%)or`uzup6Z~~_VXc61gDZU>=>L|;Rp&d5OXc0s2@bWp
z1tyEH0x~uG&*&($e=l6-@#uar)*BwQG}Yt~I=P7k|3)o(bI+?eBj<h%W(GA2=~nO7
zFq_pn(Vkz0*|^EqL_Wzo%nD({V9Qgo_u6sdQPK~+LR7w)m8so9xA}Fc)vD;7t<sNX
zEK1?cL^Xe2H`ZjV5Hq`fFM!0zh=ih390vyrWTg;aOqOlEU0bc2NfD3O(8&mVTY|SX
z?fHmvLMY#!FgA`85<ewB6iw6v-v&AhzuSP`pVFxqB&)h*CCi0%b>)dtL|3Pp0KY3p
z3Z5-f7y@id>37V7>puIFXQP#MXb!|hcg$+XraTNmN7Wi5NEEPP<2wVY)^p;N?-{2j
zt|MtN3R+Jo>@MqpD^|l5LGk{&Fl_H*n$v*jk<hV^t)In-w@Q&j#XQ~aGsbV?wZH7t
zBca}TMq{}adDT_C8wT=`g&uI|xl@iS#v@uGaB3Pfd=eRP8YT<r_f%~w<7*-n8n`GJ
za2#J{NChaOmB3{|M`|sRg;I1csupo)GSsA@(N-0;+$nVc93BeuMHZ<Q60pTn8A$n_
z#W=NI--v^I`%%gGU>{D4IOCP(I=d;IQUVv$akOj(Qutm)>P@{c${m|nJy;{ZdFQ@(
z6IEx4&XJfdZ>s^{qFWAQ4|#q@rFUK!csP1VnV+rd@2b^Ls>KwWSI~<i?W+gRP7ryU
zplpwa#tY4B4@c8!&UjY}tK-#==$%?A_@%xLSo7+5yDyri-WL4IZ+^2=#W~TBbZrg;
z?K?6*B0I-!A-~4nG8D^%z#bNOT&FE~EZEPW#B~a5O;xw~{a~V$IL9Zgq<BZyQBbH5
zd=;P<uHT<vc|?7q2{W}0R}XR1hnt5q@jmhr*{D+WO<~oCRfaWGdnB^qP|KuOx+qIl
z4R)Fsj6wgKzyiGu&&mLPdKHeN{q5I}+)$wvTe>`;%oP=~FaTAYRbEi8sHhi$3o3js
z>nSm%HZj){UD9IXigmNSsGLa!C|S2O*amu)x2Bgw)q(gOY_!q{D!lA>HzkEle#5&6
zeoj7>(asO79Bqv}&<r;P2t#A_(whDWZZO!%rm>6)a9~YSgD{W;)mysqUkYYO(|zm5
zRg#>1URux5YSwZ2St3yIt)ZW}j|Hr<X5Hq^uteYI+NFezNR<X)W4mPq?KTeO%``*0
zofI!@M4A+*Q|7T$gx@qYkHoIb_VKI}H?qbn@|RHq+M`m~hig+Bh;)<H^^XVm=vL-}
zcWg_zQt#V3DebTQuB+(SUjuf$A0CtqLaD0s!5dm1+mb|F1J*1Anb6<z%rrxT*Cru$
z0xY$H9F%tO7TUYxesyhswdmE<6d}~HSUxhCbotb1!wuW{pRp)9mre4{fSP`*5AEq1
z$DiiZckx3u@=)R4-3MlK*rpGj;Rl=qEDX-ouupG3c1Y5|p1n4Fk|HsS_s$@-H@v>S
z<G!XMyaLUWrpIP}2}K{Fi&5+Y-u?7gaEyLnb2W=+7?l3h6g{Nw`4>I6h#V_ibd3Jc
zueKNyt%9l@ul6j`GiE<s`a<8!4WE8qyPqHW+#pIiOQ=L!wx33R6rI#3gR82ZF8yK^
zrNjx9wK2frF7{!e(LE0w|GCn5svO6b^V|9&uz}JF^R=N<j5qs*poMVk0FmM1hP{1e
zO7{nmBH5&8ui5W~Q)Os)stYM|<`niF-;NnMuT;1$?;P-Nw6>)1T98*ue0g?g4{PVU
z)jE2=^Qx)A9qu$X)8GIP2Mt48ZrMIr8Q#F7pCoqu>}=diZ4IkaW+8hRl>xQHi~bNl
zslufXDHpPH{y5ZV(|6h9X%K_n0{UAM7K{EErr?!;wd&1epr8im*9WQZW{IczvtwF$
zwCxXkGc4uS=5PH)Wz-~3fl{@&3v7QDR3>tV!<!OEn3e<dV3TV9J{f>Uc_3>A-a~J7
z_kA~bxdCMZN0c%2;-u*h3m!yU89~e!G&iXmAtaFbK{VHAVkFol@9)teG251l^z*XO
zDHMBOKEk99|A_1*n74dNOvykc*w84CM}oBRgk3E#MepJg9y}PU=9J_6pYIa_jAi|J
zp+2!4^DEw-P`c|B^4<uV{I&04P50y9lqd_FK+{H_RfJRC-={1{|3mCtw<!nN&ak^!
z<wxOT^<f*dJ4=0?2dJMoLyw9}peq!7eKGz}k|8k{OM6ln&wGR2e{I)Pn2~s5kQ8;V
zhNr96Qrz({-aa^3X;~^5*)>T_^ncsd*6e+LJUUBzaA34-(`LG-q1EIMBW;&$DPRey
z@f5e7w-Eg~GFtm_&uXIh@i0(Xbzxt4NOUQ<;fS*6i5)!kYMI#mvKIfua~Ne?)H5Wy
zn7~2t{`X!`@QTj~t{C;@tC4%VdB2cFO^iaLJ%V0NBoFT2P8oJ}JX$h;TfKk2InTjV
z!Fxk-25m6R8|ijyvemp?gZHv^w)2nH$QlNr4@o7qEa*Zf#!eaf$a4t&wFQ^-GwSN`
zCr;Jc%!zYM83y!VPg(V&F=_G39wFoU_tYbe@41lcsId{84DDJqit^Saj&Jy}t1S>d
z)+U|{IfokSeUbmgd)>3pB(x^}*jXqb7JWDT^;&7v$&ga6kLcN(#X#YgKLmB(qs892
zjT~bL#p>0Z2KJEBUEO{&(<{}7q&@lEJN$UNvM0UybVR>Mw9qU>#VZ8~K~aNOw&-L$
z%CNQK#6dLSA`%i79cUMwlVXZ4>Ds&c*#3m2D-1brT_{U~H0MtEGzJpv*5StX^%ZSn
zjpCh@+udNp04qb7p1ow{p)R%Px`fE8sY=-DB`}B|X}sSM4d5H*>C2fom9+;H*`u>5
zoW3XXZn?ZIdbvfSQv}Rd+0~pSL0ypJaW`6~;h55n<$I5Z6K!|1G1kW-x$!u|NVrP0
zt{n4P`dB>UA$X1J0=c)}^Gy6Y!urkEbL6~StYKdo{UZ<4IgD$mc$rm@C&pMu6lP{D
z*tG!6G*<Dn7b@~W4~11rMYX6QMx$AEYk9Y<t%Kr0KFC(_3SfuFpt8gdg33g3Y90~9
zs%|)qmXI8Y1~dd){c63+1tE+!<iTHDoKRZfjX%)iTX4|N0Q~E0dX4Db>jdpJtS&x{
zK{gc~)%q%z&q`X`A_)F<ok!G~1eBW`60lj3Xu3YC7^JNm`#pE{1FY`ZjudIe9$Y?N
zi~J*lI~5`%27(`6cQV`heKK5L2YyV~QHETBLvKUshy#?vXL0G9#aB+zZr|TdGNo6+
zXWYAYRSKP6w~`ZPWRq4Z_RphpPuOPDZe6sTv6>)qI028Kx`I~HHx$(YZjGC|&Y*wA
zcV9;IX!e*_T?6;KSh$UWhodXOo`Skhy?3$O@gw;&#*#+q<RoRl&!+p<thp!>jfMxQ
z2Ax`ckApwMj#TC+@^X2{qq)af8yPbhk7m$!OzLBwHR6j1r3_EStYy4u-KwEI8cVVD
zR%M_uu{^Pf?UiIJ;mi{&36s}ghuX60G$jbX?$*LPZP-O6H9PQWVP;JP6%-Z{M4L&N
z1S-%FHO~-r+$iIXt53Y8=>M)amHM4NqqVzqHT3G^F(7;4NDEY%%bVFSF_81HL--X&
zY7*=5j#~q6z{RkxYWU?F=vRGWW~0qX?7GT#Jn|+z4tyRtb>j1HiS?X}q>AyRC|s5u
z_zYV0X4K{c4c=3qCiEDu&6N9iq|EDR>t|;07O_1_F$r-8Jq=rvmw3Lbra;dzd<4}a
zG<6m723$-?I|3+=dLkECS+f3&x?d)*saU=rJ;lCYyNe^z>@Dt5B@A8cS|n}Qh%lMu
zx7S`%CN-viQVV`mdv~+~QY$(f4!6rN3DT&D&mgrV_427RnLA94>bPp30a+ATFXw0Z
zHl8MyqMNjMJX&8stS9`>IprL@o-K4=Jn!|7ed6b+u0$UA;n5-1;uI{V&C(vtq~bMI
z1Z$cs04rFy2q~uF@*fFe`grMIQ0FR6GTKq`O7wKmpL8CNwd5lx-xAP2MJbjC-Wi}T
zpezEg#}wWQUZN>kcr)*b_(Y!x{_--Ukm1LCx$W3<s)}qNrXk^T(qeF#9cd-A6nz|$
zi+Q2kx-d^yzEv)%Q^nEt?SMz^N-h0t@Mz&)G%i0@TUY+()UB`Z4AWAGSMde`vD915
zd#=rU1_E+F76K}N9-{0DThe|K=@wK&$}PmE=fYDWhtFVu;htqGd=yM_8fHD$f8Rp&
zmJpGEjT8@0cY$RZ<KU?y$;63hTOBcsHI^LC0hHAg#C8o70<@;mc}FsE4<~qpR`~=Y
zCsQNMM*U(cXbG`O&urs7s%!M<&v)rrkHBjgyPE^TO|DiEhmT@pVnEyeT<lP2N2~j)
z1|Ik<HNI@u3x?Cj;C7U*_wVpbGl~^a7>m0J$_4`4uf#@;<)ZV%H!urEqJ0uHr3OE$
zJ=L5KEDQqbpdl2}mOsjs4%YCTiua5Pa(Eojo3&D(_y9Yeqx$ppnXTX|f$E0aGj+f@
zP*JXl@jX*0{N4p!<@;}(q<IF0?4(l7w#~Y-a)DYc1Y=>Cxr&@S>ad>klJ{z5xZ{f(
zNl|<@IvgXdeUdh`Q^X|Z9OXTI$O!jxKe$U9-Z6e!_*r5r7>!(#B-{`T%GBb^U36h~
z?fi>MOZiG&;jb+5GjWc17V8_OllAUOu@#(V@guQLxr~WhzGLQ2->l{EX)pNbxv>XN
z-CGey;X<+G$D5TtyXf{HmbEF(rtTS%VGR`;e=ny~M`_?5Twk0h5(BeK{=*Y<=xfe2
zlR@Q*(+fgy400QYr2+c`*OjnC#SejgqX=89WZRNK0Tu2FA?Shf>xneH|0che+{oZ~
zxXXF~DOe64)SNb>?2(-^H8^1(+;kBfl6OTnzlAwSD)4Y(1p%4{AUl0(qKYY1J<y_O
zVzHr%Uf>Kf>p9=;y>gjMw~5Ch0*=OPMZYQ%C!v^nPT;DK_f+Ehpf@^g81M^>PC5{N
zBZ7$6T_^<(Bp3>xz2x=`j)FuI<kO+sUM{*tDEc`jRb!Ne-b2lsFc8f!S~iqpmVWR-
zz_W4!8y|_1C}Tbm(B%3VTSnMF1(7PNcU+;`;h51p6Th4yWorag!z9?N>#kYYGi}~!
z>@xA|@(;pRA~2b!h@<yDpp2Z|TRp*fH0m?Kl*|^_sUBY@Kr-=YM|3{s0<O4w;cyhl
z4XUB?aKlVX7RGqo-ba*l5=?HIQ{fawZ(^Nt`|!MkX!3oiK>^#wqsazcBy!DT5)$zl
zjk#Vh0Y(!J%NaN50WGs%dezqhK^g9MS=aCT8MQ0AC3&F>BQ~{&m=?-G25zU45URLa
zem00tw=!>?>(c9ycA~9jKNAX;>v>xoGQz`=(@mf$S(RtDaf4w|fa5+gdLZ40@rBKf
zKecJqG#qPaAT83q{4(E+E4o?sGpy{w9|@=^iLVZ=PI1<4ghA=k(71)@*4w|l3&jt4
z7xl)h)i7E`{Gze7+TrPZv8MPi>pa^jql{f$KD~a6WD((CdTRuw<VB%C+@WQw*K6va
z4?Xf~eRgILy<^)c|4aOaukwSxwovaS$OLVM^3#PymInEfHgS9Tr^WX{uNUnVczl}1
zm#-mTN*V>Iw1^*d8D)AAF+|QmYv@WpQtTc4eELxbSXr5DuP=oIry$F4P}Q9@E}BB`
zg9*<JYYncsK25?)v!D(2`PgS?UotE;_&!y!2h55T*wz|d8>y9%aBL{7d;-4x+Vw$*
z^dL+la%N<+WHVIqUQzNtJnJjiIUp~G_XJ$}UZ8hHLlTj<;jbd`YADhH&7^GNIF^2^
zo`@{L_UZhRTG0vML(QTA?Wz)j_bL>o8J){6L|y1dew_HrkOMK_L*UGl9KDkNW?Lcn
zF=FOfP&>F4-b>iUaNmIKkaEhfqQg{xA!;K%4Z;p{l-r8>M=XWo#BT*#zzFmn<|cqS
ze_gg7cM;3PCxfGUA!upGmJ^=|_2wH^hUNPr;dm%U6*~DF1wPJI$<r`iS$GrWSa)O>
z%*v?eBoQ6HW!T&Uu8M$WhamcNJs~05_>B@a@>ZtK%dt6Gv(}w@+yN*zZ6-00q6CJh
z5PpC%K*8ja=r$b5onpyLi&9tA3Q91+W;B>~g%L?4XQ;k`n1RB25fP|jd{2F<uC1qW
zIX$<~53Zs=KLdqG`n{5rXRt4W+6`KCL>chnszRL_ld|s@2!PA!AML^?*g8rYtmKV+
zJrnrqE#G1!rx80#sE<t&JzPe>sbPGJJvK;=ib>M#B5@Cm;4xZyO<`lHnpE2*)itsQ
z@)BQM^|su9C{uywCW_Zk$qetk^`PfwAZ|+wq<0LZhe2z4+*1^d;4@cecu^%l0}6<<
zL;$DTSQN5Ge}>p^?OqSw&Vp;9<!}@hPJG8G?i^#XjQ37=&XJ1y%KgTX62)vD6-C?1
z`F)l!5qtPOYD)<j_cg$)ZBVOK05*l51(V`PPSH=PB?#6F(Fqt8%Ev$^>S7p1e<+Jy
z0OQf_=oor%>sMcSa36+9E46%!a&Yz8uLWR4gvN7EknffrDsgLo6?)IdknkF+Ym8C>
zdvq$;#*}hB_|D*+cQCv^oJ)URPsMFhrfQuh!ka2lrCd+34ca1=ifs;(zMN26p{&U=
z8z}Rb8uQb;rxmDrfzC0pWf?kM^=_dW7VRgzTccLc2b6Qe(Hde`a#i4)ZB@oJ(j7+E
z%h@KUf?vO&gfplI<wA3>k3c)@vpZ$COqu#3z|#t?)`g-7N+$PD)u$#<D{|!(i7z`o
z$Ua<Ie_{$9W8BiG>h4LkU_2rd+tHL-FoacpR`iS<Y4Co=*L&G@lnZBj;+1g#ldJQv
zue3YlsyJ0m(sr&jj4}SWycx|V9gIC%9c*YHxa2dg5^vL|_6f=S0X~0_3cfU~T6aQk
z)EF;<S2}$iS5GX_6Xq$VJq?07c~w#V0e!*l6WwkDk2VJWvva^ZdGH4^kz%TM4l<e?
z;uMOzXok~cytm<86e}`c8P7<0k&>szov2WF*fWXp)h%3S6or8vKBHTYuXhBpm$!I^
znUsfm+XhCr#vaK`BH{^Mf)-R^PJ=+hK||M|=0MUs^~AAcXCFFg*W8r0h~i(A2a|6|
zxq2*-l3h<pnf%sf@ffrqOPs*_3k9(@YJK%0YbFv8rbH%^7@Gmv;#0h&vzlg!9DE9Q
zBjQNW!>~haZ5TbAa>xQPIfg~B;UZ}6SA16QYrUuL8@paUfdMZd@leCoMWa+tZVp5?
z&>0m?-uPrA9G3--wd?2Wea{j8UFMyRE1ZCyoC8C_BZ=?4{b(K~9f@uyiJwp+XVfla
zxhgC44ia+sYgm~^d;XN})S*)PueaFBn`n~|IG7Go$Sc6fO9g8{2+^-vd7uvSjb;+`
zXbC7+@hn3Qzi?ockZcg<fevheFXd~5xC&eW!cdDcNbsKBVnXxzdt?A*>WJ9U2|8&l
z;RC&k_*Ik8U?d1T!upgLv|11{)u)WRlsHeI_bVd^O6&sbcuADV8VMFc_pte&8df%F
z%;|WNosU7!R(>DIw$!r@eQR8JaCNi(3NUG^#U_4;+DSPY52jFZ^ZDJ-qV!o`W{&#6
zN<eW};SlJ>cxEJ1Kn}M;j;D!4lb+hfp+#pMs0vnv+2}iH65sY14X!+WK&48=)h>`N
zXf)}oVNV^rg$mFH&`0}<z~B#|d4-^YKGYGE0xSUzstOYxnDo7MO{Bd1D&l}W^h7-3
z&;ClWB}-`8#y5hnPx-t}OrXl><m2JN{w_RLe!u(H{Y~i7W2aKC5Mx|vvDr3EyG-w!
zL1j{Nb-DfdCS&@9WbI)R`xIG{n;QHg#i0CTJF!hE-mFhG>JC~=piRHbW_9eyN(4U=
zii(QFn<<PI3kDS4rBmFYH;&9uL+Q44P~9h_tZyftaCd(-ev+EZlz+Vo=>kfQn?F%A
zS$Vo^*6~*-zhMVGo>-f&*g%UrW6=a8ju^B7g$e6&jUs0jG;6!1+@fT=DFbAwdYsYP
za0RGE>VpThoO+HH2VF*Jd|iB^cCopGr`3x-vQcsY%Bd6opfXAGoAU>bVC6K154BL@
z6lDn~ms-5VCPyM+IT24+I@buZd5xI7J1LixdIrq==PtlJN;r*bBYtIp4l&QQ(}F*t
z?YF5Di}j+}rtrg^2(<b%8dy%uz1vZ_D<AcMD^H``_pok?4^sCzm1q^8E2dYfUm10i
zraYh=Ho}>37qu1oUkbr1-qebrX+)7YAjYPFiI;isr9XBUvKK-h)Us%sdUFsxRL_0T
zT|Zr4`2=lhLpDuvEk3Kuq{NQPK>e}YW#O}?tp<BkQAgkuFL?3iBvSZeO|FtVq)UC&
z+bR7DNArYulDLDKi;ZsBLhp9EcV*q3Kf1+oyk}5$!PZkHc!zWy97pvVDr}W%o49|{
ze(=ZCtDiys8D0+KG6}#0X{YB;b^vY1oC{v^rVm+1#r=WoryXWAbMP2ujVxy}g|y?j
zE3&39_Tj-JnX{3z`N-*2DXlk%`#35BTJd=*EaROib(=cyiMYLkW?Nqg+Oos_0*bbs
z1|!y^j!DEAK&2L;_8%?ehg`We%exs3F<n3l*FU^DaYQ<kO}%Xabb6cf!-jFX>+5ey
z2ca9lw#j!yMXJ`2%g|vLL*EI7+6^;fxJxtg$umV@z*+u|yW!D(>NqNO4bzwC3f~VL
z*1!oASsNaj+?R+deFsRy8#SKPL<MslCQbz`i2VcJvOCcDjf`)^QJL}$8T&Q9loej7
zYrs#-1FwzaFq}PuW2rWYc<eT(Q{T^{vL(J3Iu@CYy1<ku6Vc}<VySos2=4JL2CyL;
z<#m)nDHG6|3eY}veV7QHBIG>|ucznko|iiJ{q0`ldl<p&Ys1H*VK5qP=gmCP^a*u*
z>i7aKtlXj-aPny%33{uNORy@vFAU$GN9~OY)~V;rg>Gxtl42&Lyrj?(>>877T>5q!
zYAREeyqnA6%Y%I)@PjuH3svTbK~60+oj(YcZ=#dYSf^GM5Y@6%(`k7o+g3_AEAKsq
z7MEEZxYt2R>|AC7-(uc30EQg@P_~H2Klo@miUV(;u{(}Hc|Zm0K81V1wi<3PM7!5+
znRq{()V<vM<)ye4)oBRR_9kXmi6&l)HoNKB?9k@)uHzh#eHO?Y8LW5Uqq}rWBaf-)
z+#@AZ?;mY939|U*mry~p)%ocirZQ3WC6#E|F=;ZI3sHJsBX_u2iZDHm6sBADVreVo
zO;ao0VsS=6z3)j1Wy~h=l36lkE570?=pQWVe%=S%q7Hmy<oh~t<24oXJ6y{i!MZs0
zRZzy7Lna+}SBM>111mm^sbRV&cU8brfsdu6Gtm(AaltDII|F6aWXco;-9lpNx*r~o
zB;vFTyfUdC%vJl>V%#4l_rIrfsNa=`V_$f$3r>6miXTyDF>j(U085gdi_(9kJ$Hj?
zS3*MhsP}9Wm?8CCOk#HzJY&+&7mV+0S__>baD&OH<Ks)lWSZFx=jRPQw5KNSER*$Q
zw+n^hG!Lf{RQNH|l9MJQE)qSe!Ob<qPxPWefSyB3YUOCA(NJ48Yu01hvDvbHOSC1C
zMeLXSN(DYA_ZAXQjZ@bmw(Y32{eIi!^7ogw`jzENsy5C^)6V%20%S2JvL20sxFz&E
zYY93D>r{zMN;6}gPrLL!Mt+)-4sGW>K)X;uTbM%nU~f_ZL(>zWs}_jQkv$H(pFy>s
zq`Pf^qOiNxv!?JhqythD^+?BAk`E?Qm(LSxCK*J}!R%ItQvsukeK(|bJ(CZ*p&)1*
zf!i5Ul@*ZyIq^1WEnVqxidi2G0jZxBGv@Sw64<tho>5GmtGmgoIpIrQmwORC-d(r~
z>E2VXwTX1BuTki5EbS;H9vi171mAf#yyl|Tm8TdfEEe%*Z)*7!c);+IqTvlnDp<5o
zkBNxOM1t|KPr#sn!iv<d-ihKf&l5aRKeW9+X-<bTP9{@xIY=mS;%A4>9ZdhE&%L82
zr)GyY@gLHjOb>*skvAnyK~<I?y6`jkN#;5^f#&Fg+|cMdhP%OYpM1$Dq8Q_O+b;Bk
zV+HBsw;JrK9^LF9QB5yaJm0odUdxstH`H*ry5G4x(T05D!W1;sZA7D{&2YIZlb<Xr
zmP_SYUkTa-_kv-yL<c5S;RPSoqbK)Jg$R)zlMYjHSyRR@@AN=Da;}z;(rfZ>#6|_$
z-$qXci_gGO=svOqMSM{QF({@Oj5DmF!(E6Q1P?5M1uyE+d-fO!Is*42|8JGPQ=lom
zzZ}ic0AuRQ18SL0f!F)k98*bu>0+yEB%o+5bg@e9ui?1TQ(#c_n)iY;gg@&zBMFfd
ze@}&bI2>1IYSH7SVr;G^TH8M9Vm+sUh*b)~dgKb1tcEKmfxM3?eNplZ99BL9DIE1*
zIpCVwDvF^{b^~pJ4IQdA&CGFu)G~Zlwd~%|8`RinyVlM~?hY^0`n#J^zv%Rl`XB`-
zoQKT8T%U&UfPSeLbm*0eX&1GKH`1b^l&jCK@fAoT!-MTodQdLW(hL$C!GwEh6nY1D
zq$JfSbuwVkGAA76TW_J!^#p%l_Xxa#Nh@cg5a>N0{lZ>fZen{v_J{T`6|iPH)V6xT
zXj()l)%eGZnJ{h!lb({kPpN3fN-zPvf^j@F=2`nb_!_!1ox32up7RShX@`DBIpR|@
zztuEn;P%N>Rk`~bDC+Q?A>lP(7l_3~G+`WPlGo^c3#`*yD%tj^EfU;DFC^k%|ENL8
z0TAngO{+W>8^CNv!qN7~|2(?88VYB_@I|OJL7cgE&QAi~&NhYDn4<T#e)v?BzRt)r
zBtD@QaZ=&M;iP5kMz{}|GS*?G;60^N<*lzsO%=&Cg*W34J1tl6&QJnoBae##k7Us8
zEq29e<zNCz7XZbqshM=mknRVzM%9Z&%yvGEsbs~@_r@dw=@n<UrRWq;c%5>cU9U>i
zCbsg&qvY)$B}g{CSWFF4fp-;dTMS60^O-#Cl(+$rZz@UGNI-eVqX#PF9^pso#M1a;
zqR!VS@uG^R_N&Jmu`CcvRV1R%&icJ4dPWz56wjYEm$jwW03Gx^s3#$xn4O*{t=qMq
z=}kJqA{9t%;3cA=$79ZUq?Hp|H<t$Shwv3|LG{fJqAG5O6YKg-7?z@nY~`79Bl@lM
zcm4)1e<p5XZQT751dk?t7Iyz?#Cx{zOa*KGV%qKuLGFD}g2!XZ!4rB=ZLl=p{l!wE
zOUxs?5>7kFXL^yTLXe{3-AqRFhNHzY6e~gZ7Bc5?zFd9;6S9x#Q6tjjtWaQj-ONj0
zi8K5L+h^49%I$O3>+zf#O9?R)$%ZFerJ~ra_#<r?IBW{Sk$n+!?DLvp4(HpMN<Ivw
zseFf;z_T-KXl9V&K9gXUovu3>2}l*D_imnfSzup?YQ^a>qs^I`C6kgS`iltzK}T<a
z%z<*1|7R7}i**6nFVam9&qqu3zTZF(*ptqDc{^?os*h%=ZUWu*l4~k)ZKKpD?uzgZ
zc+&2gfL={KF%Qu!1-0UXO5VWsU{aZQO6)+X^;WV}r^wN#(4y}!i||HCxyWg+%5D`w
zUz=o4vFln1E%x{r)`xKh9PMihJ=)^AiB5<s9;*c1GuaV|RJdN?1({8}0l`8{0E#EK
z`Op_ACQE(t2XZ`x!HG)oBubReTVt?_h(L?V>F=bgo@wt>ygYO_8$5@x&+y&~*FiAp
zbSFF8RsK_&uuY&3e3%$kyJSMLzJa;XC?}M!&%oSxG=VBG2oJ77Nj2zhGxje0&($DM
zjc0-UFW?EqJ55x8V0yhi$YE_>wz!q)eN}0&IMS+__tD^{c8F6k9$2UpHDD3&Kq0ZH
z+;E806)$hZWXvKXkop>W(TKZ&!O(hh{G+MsYkjqrD9H}<&P0wGl)0A8x;-0B)qq1o
zG4yOUlb5cB-c|nj@|0kaTEY8dn4X~5DDbLACRg7JrJ2EE^rgw}KB#mo$i_5RA01MP
zTExjiL#{G6Rn!iActz^9vz8!9ISNXs3O3^!?<`m2TZ8^2nO!Nd1<n5~Kw&{K!@a(V
zGAw8tNd`L~RZ`wI;5~Cf`2O`kI8_ihP~mWvbSuE11ylOAV=pO=i{90_c?K1Bk{Utr
z-clm}x(?S*SlcmSvyfUf8sft7a{)!%N5M`488xWleg7E0m-W7EQ~&EAr&6A7MZ~U&
zLifNjr6BFs{uS@|b>i1^H#+JC=TyK)FOoCS*MgKK1l|5Lo|Ic|aE7)LR7SC%tT<CB
zc$N>!6`1uTCng(C){9zIM2B3;e%<=uP@C>1Dq}5WnxirjPnG})I!)O%U>nxLpY35C
z(mB)s%3F#zf|w^qAaKoEp%;Qf?@!h~^xXxg(Wly7`!Pkd+c7L7+vXd`9+fc-;~o%n
z3n?L#q$rC=w~Z?2g)y7(W+=7C(N1XSSek%&>ZZFGJAInxc(A{Wr?41Z)Mub!cx`9$
z6n7E|AE9?t+^vX)TfxuW)J*6531y|luc1GBO{L=8$v85O@|cV!qH%?&W5-s%BFb{n
z2-FhDY%w!wUor^mP{H@)4w73;N#8JoOzU9=%Cwwig%*6l1~D7&5zJ!}dJtXb0tw9X
zs9q;yUzFhwwQSf`f~HZq65cPQE-m~B&Np(t`2_dSW+)m63nkly=|ulPZ#l?*`ur-c
zhbN>BX0XgK8IzXznsyu%^|5BQkSMgq3;L543U(~@XgP6@Ncs|{Wm~h)Avb;0No@gb
z7l4IE5*e~o_%wo`zoh$4icqlY#7m9SuMC4pm(Z;(Fl<3S59IHsD?|9UB{<`z+(zH)
zQ%o&L3kOH`CrYb!8b)7fSuGFF?aw&(EGf@feT_*CL}^1lQMTjezQjhB5PD#yD-$ha
z*gt9qmg@yltk*)cW;&gM558NIp`B~}V8&V)t;2HPV(tC<%CY-E(TbP!pF%rBq50A$
zN=C%(e2qlxXzE8ssYGYM^_2&@>6zB5QoK~pu41}4*uYZG1iB|&@&(Tm4W_vE@SyEB
zb&rXZQEU08(&%TnM_E>JgJM*tQAz>2z(~uym|8iG`rwwap0SecdbXv6m#ml=0SLGt
zSeLk(=t~6Et4W24Jri8#O0W$2b+3>@?@3yAEjG}ePTEMEL5nInn{N}4x6wl(T5lLc
zreb$5Fy=J^e(10x(3&-{E2WNv_V3OR^OzvOT)&|N{oq;3t=@8q_bX~kPo~J18u5H1
zyEGGbcO$%uqb1ovs#XCy)&%`iFd=u21)67&4xx9E+)4D_1SXvYWVM6nY=Yw|Vt+2^
z&(P*3!5-7MPeb8i=%Nj`?l-Q{cVMTT9YK|}U;)Z+m;Uux*gy<nrY7f!@_xddI$~4T
zIM0qh?rk=>DXotEZu(7s!5^{+&ZJOGN6ba>iPX$o;v94TP)8Wv_Fn~Vz{hSextVvZ
za($adQ!TJ+0vc*Xbfsh|<3<$SmS2!!S0d3w<`BG1pl)eeLxs63Gv(%Pja<EN66H$b
ziy>wnVz9A_YsJno1~eWGrDYoeA3N8(T)<WmVJNnqnYm5nuf8zI2W)`_3ehQXfX9k%
zkOaj{y}_vWZkRa8d;X74f``lwc^`P{D~$MBD$cn!ezkZ9#km&BlpW7h>^9zC;G2Ry
zS|2r$?r>oWTYK~}61W<9LeQ#ii+zl_wu$~?+O9|R4tl*H9rv}%<*fiSn3h*Qx-9{#
znm9V_u~S|A6WHm%aVz*uYR-q!xh*EVwUmD!D#;gTKPqQvO{82?koziBZ#UwCGH&vb
zzBRHTdCcv<RP4!oJ$t%S-O?*q65PVzD7*<CBm1AA(bg-!8BaF2GYP^$G?o-}c)vZ*
zK5UbN)WU(^*r3Tx@0){QM8P`v7|-;J@_q)(#MhIR%0XxdBZjjbu6dx^$>;Epa~qL0
zm0!=1-LoF5H&U2_=_bbMD^zSE;MFkG3tzF%%~3Iq-x!H<WS~znwuu5mj_Gw)d=n-&
zb@XltXmL1f5MEG$55PlTK?W$$pCe>ghI;7qW`~8eCq#5WZ^ka8IA{SBnyfw#7Avi|
zx13Mrf*&hnYaz!ICXtweNiD2^Eb7b#;xs|-%U-maB9KEq+9l%KQdI@0Z-*T9OGJ|>
z=@G_u8<-0Rj9{1LqrUZWN7pN|;HDLE?}CiO>CX>48${wjy~7F8NE^=#+)GQ-df+4B
zdZoj1rmH!t0Bw9qc`{xsSQhoJN#oMzL-_mla#shP?F2;nRuWfHF<}KJff|3=;_${1
zBy)k68t?<4vm62117nhX7Qo64OFg}v0;sNFB=qE<aXw|<+qReb|2eynmxZ1Fa1%A9
zRgwjp=aP6}$J{{*>>?#?!i?d>&K_Z#nTu=-z(7FZ8{rKop$@|7D*PT5?CX31!BsJj
zVC}n`XPCrg6@Nk%vM&e6VA4xnzjyNP&^-iQW%~P|zA`a^%JkLuBt;?~`~ZG78(bs-
zU%HTC2`w+t?0odNiaiL;JU3sB7m1Bmbi~r+RY%^a*>$KtQyGZ;a}veiPq>g06U+Y+
zANw>f7yHCUZJm3_mE6Cs-(HZ4#?V))k_JiuZ7%P4J;Z`Jqbtng7PiP^9rasJ4XK}U
zGLOvs*$g-`!`70=e%Zt4nllHXybSvGHwlVZoW<Pz7FKC+Z*wW=08=PlDpf#p4J!2K
zXrJP$5jScFFOIf4#+w=a&0xz|?qwBQgXKn|1^#=--yjZH^wiDVX2kDYCSEaa8OhWI
zoF<;jm{Y{g>D`JgTw4SZ##dg_Qv;d){b7fb&$Mn<qb5cjbJI#YTN4uA59q35*Zb%u
zhcLHx(;igx&B5E_T2xHFcNHg^+9M`aRpx2JnfT1t3sjhk0R&ly`&V~i&K}>C29l{8
z;o~+Ci&7ortff-i6^;4%C3rmZ&4zaruw{<D(QYNSPRc%BX}^-;G9OI$Cj6(uc1}pI
zLczA8=}S=LQ|u0tFC=5`!N~U*3aubI0zF8-M5#;MI$A*-GurM)c0`0t5xCMSAIX9h
zcgJ1kuT)}i*AXnr9xdUF%@Wsv{3d{&bm25t?irs>3e`fiNg|eli)z%-G=!y32y$^A
zbD*TvV-O&jo}iV686L)R^l<uX9}P_+5_tIx%coS>IHgVxg8ci0Q2U+L-?=d=E|Uap
zhjC<w_eB*0GlI3L0DShc*9LMZ-W&Qt=NQxER7A~la}MKA1sV9@d?E`)79h`S?RF7#
z86U23tGPQpL*biFh0)wKQ2evnY}CP|h|wJt+@$kqd1Eb@J!vC6J2~_`^1O=1Y>2)F
zE5v_R=JDcq*^KF~(sLvrQh`*MWcgsjaC!-I5uK{iVJ@jyz5nOwBzI`@L^58RLuggJ
zPec^@V~Ob?Y@B^-ZVsh2)KKXS?`u@P^-ul^S9pYnkK8=&NYmV#5&;@lfCkoKT=k=%
zm@R{0%wF^~)dV%=gRaQ;^>jRtYRSn;iGHa#Jh%td!ryF<OwfdQXOu1TT4s1;ep-5V
zEwf@`hqPct^)B%W!_h@q#t9b;bz&B9Polun3!7DU-HGE}x_B)*hn>R&8OQTFTwj@M
zHoAcKhnt|2g80N-yCXha>UQj8{9~fr_f9SHlZY3;yfaYA-rr)$e5WD7+>J^6;;+Z>
zGL0avH4LrK2j@EMHbR&2!a%A3^(1)-l(&+dw(|L4IKgc4DvT1{rPdiLRy{ONnV0wk
z%yY*m&N?XUMG-u$&NmS`GapOLMWt2%N8;qaan97o84+DIoyA8*CTov4rfg*lE)v;)
zM85GfwoG~JnDL+!JqIpzx`%F^MPd&~4~mE4;t^rr3auurJn@m(fl4hw(Dq4vLVbiQ
z9lkD~c(GRevr#&*3N~*j4%ge&SNO~;yTm6QwnA^w%+QmRdz(;^n0#j-oNU0iSK)Ul
zFmcobcJ$U~B=>~=(c8-^tjV5fWi;H%;TIU{K${8+DjIg3mS%&^vgu>hak{<gUllFH
zEcEC2`(WQ<jPjg}5`uUW)ZA~tu=SJ1*=jP{MA@l0p~OReAYO12grPv`ha4@Vu>Gh9
z6}FgmHyT=kH`mGMA8z!Wa1`S_V8f^>XcmGhMDMsj4ba+&Yo~pyutfRZg!?fhvvfFx
z4!wak0{%rLDL@shzDjZMyK9}Oo;jpgrfYJLK_adv#-qBO^x=x)ujrvSF&HtIN1U|N
zV_WfQ&FtsRVW<T@o|6K-^<fE<P+}}k$iBryP?5<fdt?;RE3?7UGQ2CgY7SOoRH9!;
zyp}L1#6N$Yq0BWAvqXI2TnO`tLI@#BxvF3n`J6nL!AR$2hpQaPKM`WgPz>&=uwgF|
z@x{sP{^tW|%x4~#Sb(|~5I<0ypOp3GsOOHslwC_0>N*ayHP3R;q<)iqxMuaJRTf7Q
zKKcsgK6<Mizw7Qk^Z>(Ld-QPV!po@FMCe}5p6C;|m}wKgS^sBGbh~5Dg;Ff#85>qi
zLCohdKfEv(jb(Ej#k5oOR`d759+yRjuJc1-K@?D0&0hvf*KI_L+l1gc+D^qCAdAHT
z#)gQ72AiR*U1UMblyUE(hR~59>|V&#SICq)E85Usyi~x?Cvfl%Ra3d#!2{%@Px14?
zTlAInC7(xaoT?dc7X5*2j`Z1b7p*fz%M8T<$tvv98naOY!0Sbllm{mikI>_M6zgeK
zJDla15VZ2KLRx}7KoSvuQ59C{I)4}#xlntqSgQ$T!as<dl99^mc3zU``t;`?!)UT1
z5`AsmQMG*3Ok_Wym1zWEB=0e0?jdF`38}AaR}M{lz&>2zY`jq&{KnH_%_-0e+6>^I
z<)_V*@x0(nvsx}cs)KzNJoPfXKDG&kmZN>Fckc&D*kMEl|NcxdJYRrDWvm@r-K^+E
zB{MXPtzwsTKdzQ*j+w%I!_;GWDlGSf)$Bf}90)YJL;DzX!6dvjFxRYB=PPH8pN~D%
zJi=AXMXrw~isZrvJG$?TV}GCcdS63mf|Zl;hGhsI>@0o}nx#H;>-<*34u!PB61t^e
ztt!qC6YQ(_MZXs}*Uh^UIArtQlZTEbtK@An&V4sgRADUY`jOPo-jkc-G`c3xSCx7>
zWW=ul9j=^Ga$Bo}6dVqc3&N7Nnxjv>#pmWc2BsLCX`3~xCcO^d@u=$0J#otH(gFou
za@jE<Aed`fmc@wfPT*v8Y<F(Ji7Bdi@4kFCUmn$gmFajtoDIvKba-FN-f$H>5N->_
znWPzT5{94$_VkdzLKV9KyiDkewhOY$W#+)4O#u7-BH%b?hYjk}5$TDY%&<qpP>v<K
z3&Zjay$wpX1abMnb_J{<cS<Z_Q4zlkf?XPHosj)i5Z#`Sh7@AO=<6N+w_4r<@$~L*
zez;=xU%-kIUv}4_Z56lWi&qd(c!W0gyLy5DxWqClh7=mm*h`mD-=WJfdoL)wYe2id
zMD#Q~D5+w?Tj@>8u)YQ(m)+~I`$ae-m0`_7eUu()<5Q5zazbu*32!!QpE^zxagOq6
z;=R-4m_a{8@Yid3o3Yu7#G$P9dUr$KP;X*Y=ctC;Vi$J<DR;shf6`CyQ^wSxSOl=9
zYwccl29{x9Ip!!vw>~1BT+CDxbgVUa%^Ze5k3??_*&(2C(YfDi?aoJmUB1;a$O`rB
z{Yue8Hnn)B-ahDCwKV;JBXn`Yy42#0NKR+wl5@f2$N1Y?6mS>Kpll!Gky6eOmU!;$
zol<Ofi6wvSUx?3+UqK09A83(A*wrP8*TRN2cf+zm6=tsw@3vqb>_^4!)-$JC6+S6z
zsL;4!wRSfO2r-fmLH!ij+#)7ZQi$MF&K<sAe;{H#jb&4@F6by3ir)?Bh%Q6+WHI-8
zKCzz_*(6d~mz)E#?&Aw^iBs%In9^_cDy-nnGJhC1hw?vIpCxpAqvEP8`F=-Hrp;AP
z)P-M?hRV8s$!BcPF`Qt0y@SWX40(<c<lU>W7(0b;c}4+22ovjfW^sopu$4Uwan;O%
z6V!MYL);4!Z0{EWuvQEpmnFh%uGc;0%;4Kc0pIUAvqLntQY){E{C|bwGgd>lZd5F-
z;;|Xz`;F#UOBrE;J<As}-#rrtsb;&gWa=NRUVmdLYV;lUS-@w$a_mj!>8aji4+eDx
zGngdcukD0uxyAg*#+Y&L8)mJ+z>Hs#g#2t-RHG^7c8RqkiyNr%ZLBl1IY^48n_e=(
z(#N1r3${hpC5`HBaM)G$2!Gqgo85E8LUPE`DvGwv3Bfh3Y^w9yY=!x6%v3g4A>f+=
z#Q@6x6LYi6@h9_r`iO%iFF~J~E#;W-wkBW~oy`34fS}I53n0TEt;mpwrjDyINLkGH
z;r>TDK~iEp(TI%<$dw5UNLVCuYGJlKLn|sCQ`3iaWlT#2CcJh;hKDXSjAV^iP?89)
zuv?C?4*go1Y8KM4B#;@LR?^0*J#@{-mF0R-GskrHlGsw4tk*WdS4^&)pN!1+ecTq>
UGUikYLk4S^%c{i*3%8yAe{Z2>W&i*H

literal 0
HcmV?d00001

diff --git a/public/articles/software/mentalo/mentalo.json b/public/articles/software/mentalo/mentalo.json
new file mode 100755
index 0000000..0ba7316
--- /dev/null
+++ b/public/articles/software/mentalo/mentalo.json
@@ -0,0 +1,19 @@
+{
+    "title": "Mentalo",
+    "date": "2021/07/18",
+    "subtitle": "Une application pour créer des jeux simples",
+    "body": "<file>mentalo.txt",
+    "technical": {
+        "stack": [
+            "Javascript",
+            "Nodejs",
+            "Sass"
+        ],
+        "license": "GNU GPL v3",
+        "repository": "https://gitlab.com/kuadrado-software/mentalo",
+        "version": "0.1.2"
+    },
+    "images": [
+        "mental-eau.png"
+    ]
+}
\ No newline at end of file
diff --git a/public/articles/software/mentalo/mentalo.txt b/public/articles/software/mentalo/mentalo.txt
new file mode 100755
index 0000000..1e33e08
--- /dev/null
+++ b/public/articles/software/mentalo/mentalo.txt
@@ -0,0 +1,2 @@
+Mentalo est une application éducative qui permet de construire un raisonnement logique à travers la création de jeux simples basés sur des écrans statiques et des choix texte.
+Sortie d'une version beta prévue pour Septembre 2021.
\ No newline at end of file
diff --git a/public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png b/public/articles/software/object-to-html-renderer/images/obj-to-html-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..8efda75f697267280b833f5aeb6b1a36b96cee67
GIT binary patch
literal 952
zcmV;p14sOcP)<h;3K|Lk000e1NJLTq0077U0077V0{{R3mzF%;0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iQ>7v;f_4xQ$xxjv6cusQDionYs1;guFuC*#nlvOS
zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_7;J6>}?mh0_0YbgZG^;BHXu55t
z5^*t;T@?eb2%sM!#4sW=%b1g-Bsz|-d-(Wz7v))<&;2<<YR+PSPb8jYhG`RT5KnK~
z2Iqa^Fe}O`@j3ChNf#u3<htVV8|Q+{0?!Pa>C`-Nm{=^dvC_t@Xlle$#1U1~DPPEV
zta9Gstd*;*c~AbrU`}6I<~q$`B(R7jND!f*iW17O5v5fp#X^eq;~o4%u3sXTLaq`R
zITlcX2HEw4|H1EWt^DMKmlTWx-7k*wF$x5Bfkw@7zK<QJaRT_Cfh)b`uhfB=Ptt2G
zEpi0(Z37qAElt@2E_Z;zCqp)6SMt*o@_FF>jJ_!g4BP^}YhG{7eVjf3Y3eF@0~{Oz
zV+G1y@9^%P_TK(I)9mjDj)HQs_{KmA00006P)t-s00030|No`gpWOfe00Cl4M??UK
z1szBL000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jvG64KxSu`<9Xb000?uMObu0
zZ*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004lNkl<ZSi|j=F>=Hp3`NCII2|ds
z3O5PYN|A|uG>*a%C@DN9NEYlG*x4rO^c!n<Sg?O389*cwi9{mN|H|y$f{Qg6$iYEw
zgaen)r)or{O12k7Pl)e`jy-{nKqbdO*5@S9V_|ZGCETVY6=G*Z6Y&#b3-LBh$eO@-
zdyGV9BIhr;5W^%6WG!oEGx_L=%Ee#1(c?-C+G@9AW_%z!*&B(_4sdsJW^pYDt#lST
z+0jixD;|p{P<qF=2bWsuSh~_DT{6|;Sui|Z`C*sJ#y|vb6&o=LQ=Y_=(UoARnFM?t
z7r*J)#A|#GdAzgd?Hmdd6MHAH?zl5kC6r|NHa7#c4=$)wx3CAMCQ&Ud6Y?63LqfJS
zuPJFsry?i25|>jcUVHY%r4AM*VIYdhHddlbOQ8R1Acjbs5JhC0b;(yDAJhJMGalZj
zq?9#WyHUR;eEdUi=Yh0I;X9)H>C#A@E^Sshct-9sk*63;NWJ6JIcf)z<bxy<i9{mN
apXe8)qb))s^l9_}0000<MNUMnLSTaQbC!(&

literal 0
HcmV?d00001

diff --git a/public/articles/software/object-to-html-renderer/object-to-html-renderer.json b/public/articles/software/object-to-html-renderer/object-to-html-renderer.json
new file mode 100755
index 0000000..6ba1fd6
--- /dev/null
+++ b/public/articles/software/object-to-html-renderer/object-to-html-renderer.json
@@ -0,0 +1,18 @@
+{
+    "title": "Object to HTML Renderer",
+    "date": "2021/07/18",
+    "subtitle": "Un moteur de rendu web dynamique",
+    "body": "<file>object-to-html-renderer.txt",
+    "technical": {
+        "stack": [
+            "Javascript",
+            "Nodejs"
+        ],
+        "license": "LGPL-3.0",
+        "repository": "https://gitlab.com/kuadrado-software/object-to-html-renderer",
+        "version": "1.0.3"
+    },
+    "images": [
+        "obj-to-html-logo.png"
+    ]
+}
\ No newline at end of file
diff --git a/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt b/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt
new file mode 100755
index 0000000..34837d1
--- /dev/null
+++ b/public/articles/software/object-to-html-renderer/object-to-html-renderer.txt
@@ -0,0 +1 @@
+Une librairie minimaliste et sans aucune dépendances pour faire du rendu web html dynamique avec du Javascript.
\ No newline at end of file
diff --git a/public/articles/software/website-template/images/kuadrado-template-screen.png b/public/articles/software/website-template/images/kuadrado-template-screen.png
deleted file mode 100644
index 5bfef5aa520bcd8d9b130622d1bcbbf9915b962d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 39284
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

diff --git a/public/articles/software/website-template/website-template.json b/public/articles/software/website-template/website-template.json
deleted file mode 100644
index e6e65de..0000000
--- a/public/articles/software/website-template/website-template.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-    "title": "Template web",
-    "date": "2021/01/28",
-    "subtitle": "Modèle de site statique simple et dynamique",
-    "body": "<file>website-template.txt",
-    "technical": {
-        "stack": ["Javascript", "Browserify", "Nginx", "Docker"],
-        "license": "MIT",
-        "repository": "https://gitlab.com/kuadrado-software/kuadrado-website-template",
-        "version": "0.1.0"
-    },
-    "images": ["kuadrado-template-screen.png"]
-}
diff --git a/public/articles/software/website-template/website-template.txt b/public/articles/software/website-template/website-template.txt
deleted file mode 100644
index c1610ad..0000000
--- a/public/articles/software/website-template/website-template.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Basé sur les mêmes mécanismes de rendu dynamique que pour Watergun, ce modèle de site web propose une base réutilisable pour n'importe quel site statique simple et moderne.
-
-Ce modèle est celui qui a servi pour le présent site.
\ No newline at end of file
diff --git a/public/education/education.js b/public/education/education.js
index bc6aad7..9a7ac52 100644
--- a/public/education/education.js
+++ b/public/education/education.js
@@ -1,11 +1,660 @@
-!function s(a,o,r){function i(t,e){if(!o[t]){if(!a[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=o[t]={exports:{}},a[t][0].call(n.exports,function(e){return i(a[t][1][e]||e)},n,n.exports,s,a,o,r)}return o[t].exports}for(var c="function"==typeof require&&require,e=0;e<r.length;e++)i(r[e]);return i}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),a=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!a.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],5:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");e=e("../../lib/web-page");const a=[{title:"Programmation",description:`<b>Franchissez le mur du code !</b><br />
-        Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`,image:"learning_theme_coding.png"},{title:"Dessin numérique et animation 2D",description:`Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br />
-        Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`,image:"learning_theme_2d.png"},{title:"Maths et physique",description:"Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.",image:"learning_theme_math.png"},{title:"Aide informatique générale",description:"Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.",image:"learning_theme_pc.png"},{title:"Stage GNU/Linux",description:`<b>Passez le cap du libre ! </b><br/>
+(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+function getServerUrl() {
+    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
+        }`;
+}
+
+module.exports = {
+    getServerUrl,
+    build: {
+        protected_dirs: ["assets", "style", "articles"],
+        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
+    },
+};
+
+},{}],2:[function(require,module,exports){
+const { getServerUrl } = require("./config");
+
+module.exports = {
+    images_url: `${getServerUrl()}assets/images/`,
+    articles_url: `${getServerUrl()}articles/`,
+};
+
+},{"./config":1}],3:[function(require,module,exports){
+"use strict";
+
+module.exports = {
+    setRenderCycleRoot(renderCycleRoot) {
+        this.renderCycleRoot = renderCycleRoot;
+    },
+    objectToHtml: function objectToHtml(obj) {
+        const { tag } = obj;
+
+        const node = document.createElement(tag);
+        const excludeKeys = ["tag", "contents", "style_rules", "state"];
+
+        Object.keys(obj)
+            .filter(attr => !excludeKeys.includes(attr))
+            .forEach(attr => {
+                if (attr === "class") {
+                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
+                } else {
+                    node[attr] = obj[attr];
+                }
+            });
+        if (obj.contents && typeof obj.contents === "string") {
+            node.innerHTML = obj.contents;
+        } else {
+            obj.contents &&
+                obj.contents.length > 0 &&
+                obj.contents.forEach(el => {
+                    switch (typeof el) {
+                        case "string":
+                            node.innerHTML = el;
+                            break;
+                        case "object":
+                            node.appendChild(objectToHtml(el));
+                            break;
+                    }
+                });
+        }
+
+        if (obj.style_rules) {
+            Object.keys(obj.style_rules).forEach(rule => {
+                node.style[rule] = obj.style_rules[rule];
+            });
+        }
+
+        return node;
+    },
+    renderCycle: function () {
+        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
+            mode: "replace",
+        });
+    },
+    subRender(object, htmlNode, options = { mode: "append" }) {
+        const insert = this.objectToHtml(object);
+        switch (options.mode) {
+            case "append":
+                htmlNode.appendChild(insert);
+                break;
+            case "override":
+                htmlNode.innerHTML = "";
+                htmlNode.appendChild(insert);
+                break;
+            case "insert-before":
+                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
+                break;
+            case "adjacent":
+                /**
+                 * options.insertLocation must be one of:
+                 *
+                 * afterbegin
+                 * afterend
+                 * beforebegin
+                 * beforeend
+                 */
+                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
+                break;
+            case "replace":
+                htmlNode.parentNode.replaceChild(insert, htmlNode);
+                break;
+            case "remove":
+                htmlNode.remove();
+                break;
+        }
+    },
+};
+
+},{}],4:[function(require,module,exports){
+"use strict";
+
+class WebPage {
+    constructor(args) {
+        Object.assign(this, args);
+    }
+}
+
+module.exports = WebPage;
+},{}],5:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+const WebPage = require("../../lib/web-page");
+
+const EDU_THEMES = [
+    // {
+    //     title: "Création de jeux vidéo",
+    //     description: "Conception, graphisme et animation, programmation, je vous accompagne dans la découverte des techniques pour créer un jeu vidéo de A à Z",
+    //     image: "learning_theme_conception.png",
+    //     pageUrl: "gamedev",
+    // },
+    {
+        title: "Programmation",
+        description: `<b>Franchissez le mur du code !</b><br />
+        Apprenez à programmer avec différents langages (Python, Javascript, C ...), pour du web, du logiciel, du jeu vidéo ou autre.`,
+        image: "learning_theme_coding.png",
+        // pageUrl: "coding",
+    },
+    {
+        title: "Dessin numérique et animation 2D",
+        description: `Apprenez à utiliser des logiciels libres de création graphique 2D et d'animation.<br />
+        Créez des personnages et des décors, menez votre projet de dessin animé, d'illustration ou de jeu vidéo.`,
+        image: "learning_theme_2d.png",
+        // pageUrl: "2d",
+    },
+    {
+        title: "Maths et physique",
+        description: "Abordez les notions fondamentales de façon décontractée pour le plaisir de comprendre.",
+        image: "learning_theme_math.png",
+        // pageUrl: "math",
+    },
+    // {
+    //     title: "Musique et sons électroniques",
+    //     description: "Découvrez des logiciels libres de composition musicales, de synthèse sonore et de prise de son.",
+    //     image: "learning_theme_sound.png",
+    //     pageUrl: "sound",
+    // },
+    {
+        title: "Aide informatique générale",
+        description: "Perdu avec votre ordinateur ou votre smartphone, les logiciels, internet ? Je vous aide pas à pas à comprendre les fondamentaux et à utiliser sereinement la technologie.",
+        image: "learning_theme_pc.png",
+        // pageUrl: "popularization"
+    },
+    {
+        title: "Stage GNU/Linux",
+        description: `<b>Passez le cap du libre ! </b><br/>
         Stage de 4 séances pour installer Linux, faire ses premiers pas avec les logiciels libres et acquérir une autonomie suffisante pour une utilisation basique.
-        `,image:"learning_theme_linux.png"}];class o extends e{render(){return{tag:"div",id:"education-page",typeof:"EducationalOrganization",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image brain",src:`${s}brain.svg`}]},{tag:"h1",contents:"Pédagogie"},{tag:"p",contents:`Animation d'ateliers informatiques accessibles à tous. 
-                                    Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`}]}]},{tag:"div",class:"title-banner"},{tag:"section",class:"bg-dark",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"ul",class:"edu-themes",contents:a.map(e=>({tag:"li",class:"edu-theme",contents:[{tag:"img",width:250,height:140,class:"pixelated",src:`${s}${e.image}`},{tag:"h3",contents:e.title},{tag:"p",contents:e.description}]}))}]}]},{tag:"section",class:"practical-info",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour qui ?"},{tag:"p",class:"info-body",contents:`Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/>
+        `,
+        image: "learning_theme_linux.png"
+    }
+];
+
+class EducationPage extends WebPage {
+    render() {
+        return {
+            tag: "div",
+            id: "education-page",
+            typeof: "EducationalOrganization",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-header logo-left",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "page-contents-center grid-wrapper",
+                            contents: [
+                                {
+                                    tag: "div",
+                                    class: "logo",
+                                    contents: [
+                                        {
+                                            tag: "img",
+                                            alt: "image brain",
+                                            src: `${images_url}brain.svg`,
+                                        },
+                                    ],
+                                },
+                                { tag: "h1", contents: "Pédagogie" },
+                                {
+                                    tag: "p",
+                                    contents: `Animation d'ateliers informatiques accessibles à tous. 
+                                    Programmation, graphisme 2D, jeux vidéo, vulgarisation, accompagnement de projet, etc.`,
+                                },
+                            ],
+                        },
+                    ],
+                },
+                {
+                    tag: "div",
+                    class: "title-banner",
+                },
+                {
+                    tag: "section",
+                    class: "bg-dark",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "page-contents-center",
+                            contents: [
+                                {
+                                    tag: "ul",
+                                    class: "edu-themes",
+                                    contents: EDU_THEMES.map(theme => {
+                                        return {
+                                            tag: "li",
+                                            class: "edu-theme",
+                                            contents: [
+                                                { tag: "img", width: 250, height: 140, class: "pixelated", src: `${images_url}${theme.image}` },
+                                                { tag: "h3", contents: theme.title },
+                                                { tag: "p", contents: theme.description },
+                                            ]
+                                        }
+                                    })
+                                },
+                            ]
+                        },
+                    ]
+                },
+                {
+                    tag: "section",
+                    class: "practical-info",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "page-contents-center",
+                            contents: [
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Pour qui ?" },
+                                        {
+                                            tag: "p",
+                                            class: "info-body",
+                                            contents: `Les ateliers sont accessibles aux adultes comme aux enfants, plutôt à partir de 12 ans.<br/>
                                             Les séances ont lieu en groupes mixtes. Capacité limitée à 5 personnes.
-                                            `}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Où ça ?"},{tag:"p",class:"info-body",contents:"Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>"}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quel matériel ?"},{tag:"p",class:"info-body",contents:`Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) 
+                                            `
+                                        }
+                                    ]
+                                },
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Où ça ?" },
+                                        {
+                                            tag: "p",
+                                            class: "info-body",
+                                            contents: "Dans mon local professionnel : <br /><blue>32 rue Simon Vialet, passage du Cheminou, 07240 Vernoux en Vivarais.</blue>"
+                                        }
+                                    ]
+                                },
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Quel matériel ?" },
+                                        {
+                                            tag: "p",
+                                            class: "info-body",
+                                            contents: `Le matériel informatique est fourni sur place (ordinateurs et tablettes graphique) 
                                             mais il est possible d'amener le sien. 
-                                            <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.`}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Quand ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Mardi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",contents:[{tag:"span",contents:"Mercredi"},{tag:"span",contents:"14h - 16h"}]},{tag:"li",contents:[{tag:"span",contents:"Jeudi"},{tag:"span",contents:"16h - 18h"}]},{tag:"li",class:"fullwidth",contents:"<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>"}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Combien ça coûte ?"},{tag:"ul",class:"info-body tabled",contents:[{tag:"li",contents:[{tag:"span",contents:"Inscription au mois"},{tag:"span",contents:"50€, accès à toutes les plages horaires."}]},{tag:"li",contents:[{tag:"span",contents:"Inscription à la séance"},{tag:"span",contents:"15€"}]},{tag:"li",contents:[{tag:"span",contents:"Cours particuliers"},{tag:"span",contents:"30€/h, sur place ou en visio. Horaires à définir."}]},{tag:"li",contents:[{tag:"span",contents:"Stage 4 séances de 2h"},{tag:"span",contents:"40€ par personne, horaires et dates à définir selon la demande."}]}]}]},{tag:"div",class:"info-block",contents:[{tag:"h3",class:"info-title",contents:"Pour s'inscrire ou en savoir plus"},{tag:"ul",class:"info-body",contents:[{tag:"li",contents:[{tag:"span",contents:"Me contacter"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"li",contents:[{tag:"span",contents:""},{tag:"a",href:"tel:+33475780872",contents:"04 75 78 08 72",property:"telephone"}]},{tag:"li",contents:[{tag:"span",contents:"ou passer directement me voir au local !"}]}]}]}]}]}]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":4}],6:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./education");s(e)},{"../../run-page":7,"./education":5}],7:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),a=e("./template/template");t.exports=function(e){e=new a({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":9,"object-to-html-renderer":3}],8:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),a=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,o=!1,r=""){return{tag:"ul",id:"nav-menu-list",class:o?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,a=`${r}${t}`;return{tag:"li",class:o||window.location.pathname!==a?"":"active",contents:[{tag:"a",href:a,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(a)]}}}},{"../../../constants":2}],9:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:a}=e("../../constants"),o=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new o).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${a}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${a}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]);
\ No newline at end of file
+                                            <br />Il est recommandé d'apporter au moins une clé USB pour faire ses sauvegardes.`
+                                        }
+                                    ]
+                                },
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Quand ?" },
+                                        {
+                                            tag: "ul",
+                                            class: "info-body tabled",
+                                            contents: [
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Mardi" },
+                                                        { tag: "span", contents: "16h - 18h" },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Mercredi" },
+                                                        { tag: "span", contents: "14h - 16h" },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Jeudi" },
+                                                        { tag: "span", contents: "16h - 18h" },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    class: "fullwidth",
+                                                    contents: "<em><blue>Ouvert de Septembre à Juin, sauf vacances scolaires ou fermetures exceptionnelles</blue></em>"
+                                                }
+                                            ]
+                                        },
+                                    ]
+                                },
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Combien ça coûte ?" },
+                                        {
+                                            tag: "ul",
+                                            class: "info-body tabled",
+                                            contents: [
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Inscription au mois" },
+                                                        { tag: "span", contents: "50€, accès à toutes les plages horaires." },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Inscription à la séance" },
+                                                        { tag: "span", contents: "15€" },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Cours particuliers" },
+                                                        { tag: "span", contents: "30€/h, sur place ou en visio. Horaires à définir." },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Stage 4 séances de 2h" },
+                                                        { tag: "span", contents: "40€ par personne, horaires et dates à définir selon la demande." },
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                },
+                                {
+                                    tag: "div",
+                                    class: "info-block",
+                                    contents: [
+                                        { tag: "h3", class: "info-title", contents: "Pour s'inscrire ou en savoir plus" },
+                                        {
+                                            tag: "ul",
+                                            class: "info-body",
+                                            contents: [
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "Me contacter" },
+                                                        {
+                                                            tag: "a",
+                                                            href: "mailto:contact@kuadrado-software.fr",
+                                                            contents: "contact@kuadrado-software.fr",
+                                                        }
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "" },
+                                                        {
+                                                            tag: "a",
+                                                            href: "tel:+33475780872",
+                                                            contents: "04 75 78 08 72",
+                                                            property: "telephone",
+                                                        },
+                                                    ]
+                                                },
+                                                {
+                                                    tag: "li",
+                                                    contents: [
+                                                        { tag: "span", contents: "ou passer directement me voir au local !" }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+
+                },
+            ],
+        };
+    }
+}
+
+module.exports = EducationPage;
+
+},{"../../../constants":2,"../../lib/web-page":4}],6:[function(require,module,exports){
+"use strict";
+const runPage = require("../../run-page");
+const EducationPage = require("./education");
+runPage(EducationPage);
+
+},{"../../run-page":7,"./education":5}],7:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+const Template = require("./template/template");
+
+module.exports = function runPage(PageComponent) {
+    const template = new Template({ page: new PageComponent() });
+    objectHtmlRenderer.setRenderCycleRoot(template);
+    objectHtmlRenderer.renderCycle();
+};
+
+},{"./template/template":9,"object-to-html-renderer":3}],8:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+
+const NAV_MENU_ITEMS = [
+    { url: "/games/", text: "Jeux" },
+    {
+        url: "/education/",
+        text: "Pédagogie",
+        // submenu: [
+        //     { url: "/gamedev", text: "Création de jeux vidéo" },
+        // ]
+    },
+    { url: "/software-development/", text: "Software" }
+];
+
+class NavBar {
+    constructor() {
+        this.initEventHandlers();
+    }
+
+    handleBurgerClick() {
+        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
+    }
+
+    initEventHandlers() {
+        window.addEventListener("click", event => {
+            if (
+                event.target.id !== "nav-menu-list" &&
+                !event.target.classList.contains("burger") &&
+                !event.target.parentNode.classList.contains("burger")
+            ) {
+                document.getElementById("nav-menu-list").classList.remove("responsive-show");
+            }
+        });
+    }
+
+    renderHome() {
+        return {
+            tag: "div",
+            class: "home",
+            contents: [
+                {
+                    tag: "a",
+                    href: "/",
+                    contents: [
+                        {
+                            tag: "img",
+                            alt: "Logo Kuadrado",
+                            src: `${images_url}logo_kuadrado.svg`,
+                        },
+                        {
+                            tag: "img",
+                            alt: "Kuadrado Software",
+                            class: "logo-text",
+                            src: `${images_url}logo_kuadrado_txt.svg`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+
+    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
+        return {
+            tag: "ul",
+            id: "nav-menu-list",
+            class: isSubmenu ? "submenu" : "",
+            contents: menuItemsArray.map(item => {
+                const { url, text, submenu } = item;
+                const href = `${parentUrl}${url}`;
+                return {
+                    tag: "li",
+                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
+                    contents: [
+                        {
+                            tag: "a",
+                            href,
+                            contents: text,
+                        },
+                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
+                };
+            }),
+        };
+    }
+
+    renderResponsiveBurger() {
+        return {
+            tag: "div",
+            class: "burger",
+            onclick: this.handleBurgerClick.bind(this),
+            contents: [{ tag: "span", contents: "···" }],
+        };
+    }
+
+    render() {
+        return {
+            tag: "nav",
+            contents: [
+                this.renderHome(),
+                this.renderResponsiveBurger(),
+                this.renderMenu(NAV_MENU_ITEMS),
+            ],
+        };
+    }
+}
+
+module.exports = NavBar;
+
+},{"../../../constants":2}],9:[function(require,module,exports){
+"use strict";
+
+const { in_construction } = require("../../config");
+const { images_url } = require("../../constants");
+const NavBar = require("./components/navbar");
+
+class Template {
+    constructor(props) {
+        this.props = props;
+    }
+    render() {
+        return {
+            tag: "main",
+            contents: [
+                {
+                    tag: "header",
+                    contents: [new NavBar().render()],
+                },
+                in_construction && {
+                    tag: "section",
+                    class: "warning-banner",
+                    contents: [
+                        {
+                            tag: "strong",
+                            class: "page-contents-center",
+                            contents: "Site en construction ...",
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    id: "page-container",
+                    contents: [this.props.page.render()],
+                },
+                {
+                    tag: "footer",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "logo",
+                            contents: [
+                                {
+                                    tag: "img",
+                                    alt: `logo Kuadrado`,
+                                    src: `${images_url}logo_kuadrado.svg`,
+                                },
+                                {
+                                    tag: "img",
+                                    class: "text-logo",
+                                    alt: "Kuadrado Software",
+                                    src: `${images_url}logo_kuadrado_txt.svg`,
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
+                        },
+                        {
+                            tag: "div",
+                            contents: [
+                                { tag: "strong", contents: "<blue>Contact : </blue>" },
+                                {
+                                    tag: "a",
+                                    href: "mailto:contact@kuadrado-software.fr",
+                                    contents: "contact@kuadrado-software.fr",
+                                },
+                            ],
+                        },
+                        {
+                            tag: "div",
+                            class: "social",
+                            contents: [
+                                {
+                                    tag: "strong",
+                                    contents: "<blue>Sur les réseaux : </blue>",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://www.linkedin.com/company/kuadrado-software",
+                                    target: "_blank",
+                                    contents: "in",
+                                    title: "Linkedin",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://twitter.com/KuadradoSoft",
+                                    target: "_blank",
+                                    contents: "t",
+                                    title: "Twitter",
+                                    style_rules: { fontFamily: "serif" },
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: `Copyright © ${new Date()
+                                .getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = Template;
+
+},{"../../config":1,"../../constants":2,"./components/navbar":8}]},{},[6]);
diff --git a/public/games/games.js b/public/games/games.js
index 0d18235..db8aa16 100644
--- a/public/games/games.js
+++ b/public/games/games.js
@@ -1,3 +1,769 @@
-!function n(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(i)return i(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return c(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],7:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,s){"use strict";const i=e("../../../generic-components/image-carousel"),{getArticleBody:l}=e("../../../lib/article-utils");class g{constructor(e){this.props=e}render(){const{title:e,subtitle:t,body:s,images:n,path:r}=this.props;return{tag:"div",class:"team-member",typeof:"Person",property:"author",contents:[{tag:"div",class:"team-member-img",contents:[{tag:"img",alt:`ìmage team member ${e}`,src:n.map(e=>`${r}/images/${e}`)[0],property:"image"}]},{tag:"h3",class:"team-member-title",contents:e,property:"name"},{tag:"strong",class:"team-member-subtitle",contents:t,property:"jobTitle"},{tag:"p",class:"team-member-body",contents:l(s),property:"description"}]}}}t.exports=class{constructor(e){this.props=e}render(){const{title:e,tags:t,body:s,subtitle:n,images:r,path:a,team_subarticles:o,image_banner:c}=this.props;return{tag:"article",typeof:"VideoGame",additionalType:"Article",class:"game-article",contents:[{tag:"h2",property:"name",class:"game-title",contents:e},{tag:"div",class:"game-banner",contents:[{tag:"img",class:"pixelated",src:`${a}/images/${c}`}]},{tag:"div",class:"game-tags",contents:t.map(e=>({tag:"span",contents:e,property:"about"}))},{tag:"h3",class:"game-subtitle",contents:n,property:"alternativeHeadline"},{tag:"div",class:"game-description",property:"description",contents:l(s)},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"game-team",contents:[{tag:"h2",contents:"L'équipe"},{tag:"div",class:"team-members",contents:o.map(e=>new g({...e}).render())}]}]}}}},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(e,t,s){"use strict";const{articles_url:n}=e("../../../../constants"),{loadArticles:r,populateArticles:a}=e("../../../lib/article-utils"),o=e("object-to-html-renderer"),c=e("./game-article");t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${n}games`).then(e=>{Promise.all(e.map(async t=>(t.team_subarticles&&(t.team_subarticles=await a(t.team_subarticles.map(e=>Object.assign(e,{path:t.path})))),t))).then(e=>{this.state.articles=e,this.refresh()})}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div"},{tag:"div"}]}}refresh(){o.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{articles:e}=this.state;return{tag:"section",class:"game-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new c({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/game-articles");class o extends r{render(){return{tag:"div",id:"games-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image game controller",src:`${n}game_controller.svg`}]},{tag:"h1",contents:"Jeux"},{tag:"p",contents:`Création de jeux vidéos indépendants.
-                                    <br/>Jeux web, PC et projets en cours de développement`}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(e,t,s){"use strict";const n=e("../../run-page");e=e("./games");n(e)},{"../../run-page":12,"./games":10}],12:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":14,"object-to-html-renderer":3}],13:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],14:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]);
\ No newline at end of file
+(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+function getServerUrl() {
+    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
+        }`;
+}
+
+module.exports = {
+    getServerUrl,
+    build: {
+        protected_dirs: ["assets", "style", "articles"],
+        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
+    },
+};
+
+},{}],2:[function(require,module,exports){
+const { getServerUrl } = require("./config");
+
+module.exports = {
+    images_url: `${getServerUrl()}assets/images/`,
+    articles_url: `${getServerUrl()}articles/`,
+};
+
+},{"./config":1}],3:[function(require,module,exports){
+"use strict";
+
+module.exports = {
+    setRenderCycleRoot(renderCycleRoot) {
+        this.renderCycleRoot = renderCycleRoot;
+    },
+    objectToHtml: function objectToHtml(obj) {
+        const { tag } = obj;
+
+        const node = document.createElement(tag);
+        const excludeKeys = ["tag", "contents", "style_rules", "state"];
+
+        Object.keys(obj)
+            .filter(attr => !excludeKeys.includes(attr))
+            .forEach(attr => {
+                if (attr === "class") {
+                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
+                } else {
+                    node[attr] = obj[attr];
+                }
+            });
+        if (obj.contents && typeof obj.contents === "string") {
+            node.innerHTML = obj.contents;
+        } else {
+            obj.contents &&
+                obj.contents.length > 0 &&
+                obj.contents.forEach(el => {
+                    switch (typeof el) {
+                        case "string":
+                            node.innerHTML = el;
+                            break;
+                        case "object":
+                            node.appendChild(objectToHtml(el));
+                            break;
+                    }
+                });
+        }
+
+        if (obj.style_rules) {
+            Object.keys(obj.style_rules).forEach(rule => {
+                node.style[rule] = obj.style_rules[rule];
+            });
+        }
+
+        return node;
+    },
+    renderCycle: function () {
+        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
+            mode: "replace",
+        });
+    },
+    subRender(object, htmlNode, options = { mode: "append" }) {
+        const insert = this.objectToHtml(object);
+        switch (options.mode) {
+            case "append":
+                htmlNode.appendChild(insert);
+                break;
+            case "override":
+                htmlNode.innerHTML = "";
+                htmlNode.appendChild(insert);
+                break;
+            case "insert-before":
+                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
+                break;
+            case "adjacent":
+                /**
+                 * options.insertLocation must be one of:
+                 *
+                 * afterbegin
+                 * afterend
+                 * beforebegin
+                 * beforeend
+                 */
+                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
+                break;
+            case "replace":
+                htmlNode.parentNode.replaceChild(insert, htmlNode);
+                break;
+            case "remove":
+                htmlNode.remove();
+                break;
+        }
+    },
+};
+
+},{}],4:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+
+class ImageCarousel {
+    constructor(props) {
+        this.props = props;
+        this.id = performance.now();
+        this.state = {
+            showImageIndex: 0,
+        };
+        this.RUN_INTERVAL = 5000;
+        this.props.images.length > 1 && this.run();
+    }
+
+    run() {
+        this.runningInterval = setInterval(() => {
+            let { showImageIndex } = this.state;
+            const { images } = this.props;
+            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
+            this.refreshImage();
+        }, this.RUN_INTERVAL);
+    }
+
+    setImageIndex(i) {
+        clearInterval(this.runningInterval);
+        this.state.showImageIndex = i;
+        this.refreshImage();
+    }
+
+    refreshImage() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    render() {
+        const { showImageIndex } = this.state;
+        const { images } = this.props;
+        return {
+            tag: "div",
+            id: this.id,
+            class: "image-carousel",
+            contents: [
+                {
+                    tag: "img",
+                    property: "image",
+                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
+                    src: images[showImageIndex],
+                },
+                images.length > 1 && {
+                    tag: "div",
+                    class: "carousel-bullets",
+                    contents: images.map((_, i) => {
+                        const active = showImageIndex === i;
+                        return {
+                            tag: "span",
+                            class: `bullet ${active ? "active" : ""}`,
+                            onclick: this.setImageIndex.bind(this, i),
+                        };
+                    }),
+                },
+            ],
+        };
+    }
+}
+
+module.exports = ImageCarousel;
+
+},{"object-to-html-renderer":3}],5:[function(require,module,exports){
+"use strict";
+
+const { fetchjson, fetchtext } = require("./fetch");
+
+function getArticleBody(text) {
+    return text.replaceAll("\n", "<br/>");
+}
+
+function getArticleDate(date) {
+    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
+}
+
+function loadArticles(dir_url) {
+    return new Promise((resolve, reject) => {
+        fetchjson(`${dir_url}/index.json`)
+            .then(json => {
+                Promise.all(
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
+                        tmpSplit.pop();
+                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
+                        return Object.assign(art, { path: absArtPath });
+                    })
+                )
+                    .then(articles => {
+                        populateArticles(articles)
+                            .then(completeArticles => resolve(completeArticles))
+                            .catch(e => reject(e));
+                    })
+                    .catch(e => reject(e));
+            })
+            .catch(e => console.log(e));
+    });
+}
+
+function populateArticles(articles) {
+    return new Promise((resolve, reject) => {
+        Promise.all(
+            articles.map(async article => {
+                if (article.body.indexOf("<file>") !== -1) {
+                    const txtPath = article.body.replace("<file>", "");
+                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
+                    article.body = textValue;
+                    article.date = article.date ? new Date(article.date) : undefined;
+                }
+                return article;
+            })
+        )
+            .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date)))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    loadArticles,
+    getArticleBody,
+    getArticleDate,
+    populateArticles,
+};
+
+},{"./fetch":6}],6:[function(require,module,exports){
+"use strict";
+
+function fetchjson(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.json())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+function fetchtext(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.text())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    fetchjson,
+    fetchtext,
+};
+
+},{}],7:[function(require,module,exports){
+"use strict";
+
+class WebPage {
+    constructor(args) {
+        Object.assign(this, args);
+    }
+}
+
+module.exports = WebPage;
+},{}],8:[function(require,module,exports){
+"use strict";
+
+const ImageCarousel = require("../../../generic-components/image-carousel");
+const { getArticleBody } = require("../../../lib/article-utils");
+
+class TeamMember {
+    constructor(props) {
+        this.props = props;
+    }
+
+    render() {
+        const { title, subtitle, body, images, path } = this.props;
+        return {
+            tag: "div",
+            class: "team-member",
+            typeof: "Person",
+            property: "author",
+            contents: [
+                {
+                    tag: "div",
+                    class: "team-member-img",
+                    contents: [
+                        {
+                            tag: "img",
+                            alt: `ìmage team member ${title}`,
+                            src: images.map(im => `${path}/images/${im}`)[0],
+                            property: "image",
+                        },
+                    ],
+                },
+                {
+                    tag: "h3",
+                    class: "team-member-title",
+                    contents: title,
+                    property: "name",
+                },
+                {
+                    tag: "strong",
+                    class: "team-member-subtitle",
+                    contents: subtitle,
+                    property: "jobTitle",
+                },
+                {
+                    tag: "p",
+                    class: "team-member-body",
+                    contents: getArticleBody(body),
+                    property: "description",
+                },
+            ],
+        };
+    }
+}
+
+class GameArticle {
+    constructor(props) {
+        this.props = props;
+    }
+
+    render() {
+        const {
+            title,
+            tags,
+            body,
+            subtitle,
+            images,
+            path,
+            team_subarticles,
+            image_banner,
+        } = this.props;
+        return {
+            tag: "article",
+            typeof: "VideoGame",
+            additionalType: "Article",
+            class: "game-article",
+            contents: [
+                {
+                    tag: "h2",
+                    property: "name",
+                    class: "game-title",
+                    contents: title,
+                },
+                {
+                    tag: "div",
+                    class: "game-banner",
+                    contents: [
+                        { tag: "img", class: "pixelated", src: `${path}/images/${image_banner}` },
+                    ],
+                },
+                {
+                    tag: "div",
+                    class: "game-tags",
+                    contents: tags.map(tag => {
+                        return { tag: "span", contents: tag, property: "about" };
+                    }),
+                },
+                {
+                    tag: "h3",
+                    class: "game-subtitle",
+                    contents: subtitle,
+                    property: "alternativeHeadline",
+                },
+                {
+                    tag: "div",
+                    class: "game-description",
+                    property: "description",
+                    contents: getArticleBody(body),
+                },
+                new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(),
+                {
+                    tag: "div",
+                    class: "game-team",
+                    contents: [
+                        {
+                            tag: "h2",
+                            contents: "L'équipe",
+                        },
+                        {
+                            tag: "div",
+                            class: "team-members",
+                            contents: team_subarticles.map(tsa =>
+                                new TeamMember({ ...tsa }).render()
+                            ),
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = GameArticle;
+
+},{"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5}],9:[function(require,module,exports){
+"use strict";
+
+const { articles_url } = require("../../../../constants");
+const { loadArticles, populateArticles } = require("../../../lib/article-utils");
+const objectHtmlRenderer = require("object-to-html-renderer")
+const GameArticle = require("./game-article");
+
+class GameArticles {
+    constructor(props) {
+        this.props = props;
+        this.state = {
+            articles: [],
+        };
+        this.id = performance.now();
+        this.loadArticles();
+    }
+
+    loadArticles() {
+        loadArticles(`${articles_url}games`)
+            .then(articles => {
+                Promise.all(
+                    articles.map(async a => {
+                        if (a.team_subarticles) {
+                            a.team_subarticles = await populateArticles(
+                                a.team_subarticles.map(sa => Object.assign(sa, { path: a.path }))
+                            );
+                        }
+                        return a;
+                    })
+                ).then(completeArticles => {
+                    this.state.articles = completeArticles;
+                    this.refresh();
+                });
+            })
+            .catch(e => console.log(e));
+    }
+
+    renderPlaceholder() {
+        return {
+            tag: "article",
+            class: "placeholder",
+            contents: [{ tag: "div" }, { tag: "div" }],
+        };
+    }
+
+    refresh() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    render() {
+        const { articles } = this.state;
+        return {
+            tag: "section",
+            class: "game-articles page-contents-center",
+            id: this.id,
+            contents:
+                articles.length > 0
+                    ? articles.map(article => new GameArticle({ ...article }).render())
+                    : [this.renderPlaceholder()],
+        };
+    }
+}
+
+module.exports = GameArticles;
+
+},{"../../../../constants":2,"../../../lib/article-utils":5,"./game-article":8,"object-to-html-renderer":3}],10:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+const WebPage = require("../../lib/web-page");
+const GameArticles = require("./components/game-articles");
+
+class GamesPage extends WebPage {
+    render() {
+        return {
+            tag: "div",
+            id: "games-page",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-header logo-left",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "page-contents-center grid-wrapper",
+                            contents: [
+                                {
+                                    tag: "div",
+                                    class: "logo",
+                                    contents: [
+                                        {
+                                            tag: "img",
+                                            alt: "image game controller",
+                                            src: `${images_url}game_controller.svg`,
+                                        },
+                                    ],
+                                },
+                                { tag: "h1", contents: "Jeux" },
+                                {
+                                    tag: "p",
+                                    contents: `Création de jeux vidéos indépendants.
+                                    <br/>Jeux web, PC et projets en cours de développement`,
+                                },
+                            ],
+                        },
+                    ],
+                },
+                new GameArticles().render(),
+            ],
+        };
+    }
+}
+
+module.exports = GamesPage;
+
+},{"../../../constants":2,"../../lib/web-page":7,"./components/game-articles":9}],11:[function(require,module,exports){
+"use strict";
+
+"use strict";
+const runPage = require("../../run-page");
+const GamesPage = require("./games");
+runPage(GamesPage);
+
+},{"../../run-page":12,"./games":10}],12:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+const Template = require("./template/template");
+
+module.exports = function runPage(PageComponent) {
+    const template = new Template({ page: new PageComponent() });
+    objectHtmlRenderer.setRenderCycleRoot(template);
+    objectHtmlRenderer.renderCycle();
+};
+
+},{"./template/template":14,"object-to-html-renderer":3}],13:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+
+const NAV_MENU_ITEMS = [
+    { url: "/games/", text: "Jeux" },
+    {
+        url: "/education/",
+        text: "Pédagogie",
+        // submenu: [
+        //     { url: "/gamedev", text: "Création de jeux vidéo" },
+        // ]
+    },
+    { url: "/software-development/", text: "Software" }
+];
+
+class NavBar {
+    constructor() {
+        this.initEventHandlers();
+    }
+
+    handleBurgerClick() {
+        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
+    }
+
+    initEventHandlers() {
+        window.addEventListener("click", event => {
+            if (
+                event.target.id !== "nav-menu-list" &&
+                !event.target.classList.contains("burger") &&
+                !event.target.parentNode.classList.contains("burger")
+            ) {
+                document.getElementById("nav-menu-list").classList.remove("responsive-show");
+            }
+        });
+    }
+
+    renderHome() {
+        return {
+            tag: "div",
+            class: "home",
+            contents: [
+                {
+                    tag: "a",
+                    href: "/",
+                    contents: [
+                        {
+                            tag: "img",
+                            alt: "Logo Kuadrado",
+                            src: `${images_url}logo_kuadrado.svg`,
+                        },
+                        {
+                            tag: "img",
+                            alt: "Kuadrado Software",
+                            class: "logo-text",
+                            src: `${images_url}logo_kuadrado_txt.svg`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+
+    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
+        return {
+            tag: "ul",
+            id: "nav-menu-list",
+            class: isSubmenu ? "submenu" : "",
+            contents: menuItemsArray.map(item => {
+                const { url, text, submenu } = item;
+                const href = `${parentUrl}${url}`;
+                return {
+                    tag: "li",
+                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
+                    contents: [
+                        {
+                            tag: "a",
+                            href,
+                            contents: text,
+                        },
+                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
+                };
+            }),
+        };
+    }
+
+    renderResponsiveBurger() {
+        return {
+            tag: "div",
+            class: "burger",
+            onclick: this.handleBurgerClick.bind(this),
+            contents: [{ tag: "span", contents: "···" }],
+        };
+    }
+
+    render() {
+        return {
+            tag: "nav",
+            contents: [
+                this.renderHome(),
+                this.renderResponsiveBurger(),
+                this.renderMenu(NAV_MENU_ITEMS),
+            ],
+        };
+    }
+}
+
+module.exports = NavBar;
+
+},{"../../../constants":2}],14:[function(require,module,exports){
+"use strict";
+
+const { in_construction } = require("../../config");
+const { images_url } = require("../../constants");
+const NavBar = require("./components/navbar");
+
+class Template {
+    constructor(props) {
+        this.props = props;
+    }
+    render() {
+        return {
+            tag: "main",
+            contents: [
+                {
+                    tag: "header",
+                    contents: [new NavBar().render()],
+                },
+                in_construction && {
+                    tag: "section",
+                    class: "warning-banner",
+                    contents: [
+                        {
+                            tag: "strong",
+                            class: "page-contents-center",
+                            contents: "Site en construction ...",
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    id: "page-container",
+                    contents: [this.props.page.render()],
+                },
+                {
+                    tag: "footer",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "logo",
+                            contents: [
+                                {
+                                    tag: "img",
+                                    alt: `logo Kuadrado`,
+                                    src: `${images_url}logo_kuadrado.svg`,
+                                },
+                                {
+                                    tag: "img",
+                                    class: "text-logo",
+                                    alt: "Kuadrado Software",
+                                    src: `${images_url}logo_kuadrado_txt.svg`,
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
+                        },
+                        {
+                            tag: "div",
+                            contents: [
+                                { tag: "strong", contents: "<blue>Contact : </blue>" },
+                                {
+                                    tag: "a",
+                                    href: "mailto:contact@kuadrado-software.fr",
+                                    contents: "contact@kuadrado-software.fr",
+                                },
+                            ],
+                        },
+                        {
+                            tag: "div",
+                            class: "social",
+                            contents: [
+                                {
+                                    tag: "strong",
+                                    contents: "<blue>Sur les réseaux : </blue>",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://www.linkedin.com/company/kuadrado-software",
+                                    target: "_blank",
+                                    contents: "in",
+                                    title: "Linkedin",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://twitter.com/KuadradoSoft",
+                                    target: "_blank",
+                                    contents: "t",
+                                    title: "Twitter",
+                                    style_rules: { fontFamily: "serif" },
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: `Copyright © ${new Date()
+                                .getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = Template;
+
+},{"../../config":1,"../../constants":2,"./components/navbar":13}]},{},[11]);
diff --git a/public/main.js b/public/main.js
index 82098e2..70aa45d 100644
--- a/public/main.js
+++ b/public/main.js
@@ -1,10 +1,501 @@
-!function n(r,a,o){function i(t,e){if(!a[t]){if(!r[t]){var s="function"==typeof require&&require;if(!e&&s)return s(t,!0);if(c)return c(t,!0);throw(s=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",s}s=a[t]={exports:{}},r[t][0].call(s.exports,function(e){return i(r[t][1][e]||e)},s,s.exports,n,r,a,o)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<o.length;e++)i(o[e]);return i}({1:[function(e,t,s){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,s){const{getServerUrl:n}=e("./config");t.exports={images_url:`${n()}assets/images/`,articles_url:`${n()}articles/`}},{"./config":1}],3:[function(e,t,s){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(s){var{tag:e}=s;const n=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(s).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?n.classList.add(...s[e].split(" ").filter(e=>""!==e)):n[e]=s[e]}),s.contents&&"string"==typeof s.contents?n.innerHTML=s.contents:s.contents&&0<s.contents.length&&s.contents.forEach(e=>{switch(typeof e){case"string":n.innerHTML=e;break;case"object":n.appendChild(t(e))}}),s.style_rules&&Object.keys(s.style_rules).forEach(e=>{n.style[e]=s.style_rules[e]}),n},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,s={mode:"append"}){var n=this.objectToHtml(e);switch(s.mode){case"append":t.appendChild(n);break;case"override":t.innerHTML="",t.appendChild(n);break;case"insert-before":t.insertBefore(n,t.childNodes[s.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(s.insertLocation,n);break;case"replace":t.parentNode.replaceChild(n,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,s){"use strict";const n=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){n.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:s}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[s].replace(/\.[A-Za-z]+/,"")}`,src:e[s]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${s===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",class:"kuadrado-values",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"<blue>Éthique</blue>"},{tag:"ul",class:"values-list",contents:[["<emoji>📖</emoji> <blue>Partage des connaissances</blue>",`Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, 
-                                    pour aller plus loin ensemble, le partage du savoir est fondamental.`],["<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>",`Toutes mes productions numériques, jeux vidéo, web, software, sont 
+(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+function getServerUrl() {
+    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
+        }`;
+}
+
+module.exports = {
+    getServerUrl,
+    build: {
+        protected_dirs: ["assets", "style", "articles"],
+        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
+    },
+};
+
+},{}],2:[function(require,module,exports){
+const { getServerUrl } = require("./config");
+
+module.exports = {
+    images_url: `${getServerUrl()}assets/images/`,
+    articles_url: `${getServerUrl()}articles/`,
+};
+
+},{"./config":1}],3:[function(require,module,exports){
+"use strict";
+
+module.exports = {
+    setRenderCycleRoot(renderCycleRoot) {
+        this.renderCycleRoot = renderCycleRoot;
+    },
+    objectToHtml: function objectToHtml(obj) {
+        const { tag } = obj;
+
+        const node = document.createElement(tag);
+        const excludeKeys = ["tag", "contents", "style_rules", "state"];
+
+        Object.keys(obj)
+            .filter(attr => !excludeKeys.includes(attr))
+            .forEach(attr => {
+                if (attr === "class") {
+                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
+                } else {
+                    node[attr] = obj[attr];
+                }
+            });
+        if (obj.contents && typeof obj.contents === "string") {
+            node.innerHTML = obj.contents;
+        } else {
+            obj.contents &&
+                obj.contents.length > 0 &&
+                obj.contents.forEach(el => {
+                    switch (typeof el) {
+                        case "string":
+                            node.innerHTML = el;
+                            break;
+                        case "object":
+                            node.appendChild(objectToHtml(el));
+                            break;
+                    }
+                });
+        }
+
+        if (obj.style_rules) {
+            Object.keys(obj.style_rules).forEach(rule => {
+                node.style[rule] = obj.style_rules[rule];
+            });
+        }
+
+        return node;
+    },
+    renderCycle: function () {
+        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
+            mode: "replace",
+        });
+    },
+    subRender(object, htmlNode, options = { mode: "append" }) {
+        const insert = this.objectToHtml(object);
+        switch (options.mode) {
+            case "append":
+                htmlNode.appendChild(insert);
+                break;
+            case "override":
+                htmlNode.innerHTML = "";
+                htmlNode.appendChild(insert);
+                break;
+            case "insert-before":
+                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
+                break;
+            case "adjacent":
+                /**
+                 * options.insertLocation must be one of:
+                 *
+                 * afterbegin
+                 * afterend
+                 * beforebegin
+                 * beforeend
+                 */
+                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
+                break;
+            case "replace":
+                htmlNode.parentNode.replaceChild(insert, htmlNode);
+                break;
+            case "remove":
+                htmlNode.remove();
+                break;
+        }
+    },
+};
+
+},{}],4:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+
+class ImageCarousel {
+    constructor(props) {
+        this.props = props;
+        this.id = performance.now();
+        this.state = {
+            showImageIndex: 0,
+        };
+        this.RUN_INTERVAL = 5000;
+        this.props.images.length > 1 && this.run();
+    }
+
+    run() {
+        this.runningInterval = setInterval(() => {
+            let { showImageIndex } = this.state;
+            const { images } = this.props;
+            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
+            this.refreshImage();
+        }, this.RUN_INTERVAL);
+    }
+
+    setImageIndex(i) {
+        clearInterval(this.runningInterval);
+        this.state.showImageIndex = i;
+        this.refreshImage();
+    }
+
+    refreshImage() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    render() {
+        const { showImageIndex } = this.state;
+        const { images } = this.props;
+        return {
+            tag: "div",
+            id: this.id,
+            class: "image-carousel",
+            contents: [
+                {
+                    tag: "img",
+                    property: "image",
+                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
+                    src: images[showImageIndex],
+                },
+                images.length > 1 && {
+                    tag: "div",
+                    class: "carousel-bullets",
+                    contents: images.map((_, i) => {
+                        const active = showImageIndex === i;
+                        return {
+                            tag: "span",
+                            class: `bullet ${active ? "active" : ""}`,
+                            onclick: this.setImageIndex.bind(this, i),
+                        };
+                    }),
+                },
+            ],
+        };
+    }
+}
+
+module.exports = ImageCarousel;
+
+},{"object-to-html-renderer":3}],5:[function(require,module,exports){
+"use strict";
+
+class KuadradoValues {
+    render() {
+        return {
+            tag: "section",
+            class: "kuadrado-values",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-contents-center",
+                    contents: [
+                        {
+                            tag: "h2",
+                            contents: "<blue>Éthique</blue>",
+                        },
+                        {
+                            tag: "ul",
+                            class: "values-list",
+                            contents: [
+                                [
+                                    "<emoji>📖</emoji> <blue>Partage des connaissances</blue>",
+                                    `Pour sortir de l'élitisme de l'ingénierie, pour sortir de la domination par l'obscurantisme et de la consommation aveugle, 
+                                    pour aller plus loin ensemble, le partage du savoir est fondamental.`,
+                                ],
+                                [
+                                    "<emoji>💻</emoji> <blue>Logiciels libres et open source</blue>",
+                                    `Toutes mes productions numériques, jeux vidéo, web, software, sont 
                                     <b><a href="https://fr.wikipedia.org/wiki/Logiciel_libre" target="_blank">libres et open source</a></b>.
-                                    <br/> ainsi que les outils engagés dans leur fabrication.`],["<emoji>🌿</emoji> <blue>Écologie</blue>",`Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament
+                                    <br/> ainsi que les outils engagés dans leur fabrication.`,
+                                ],
+                                [
+                                    "<emoji>🌿</emoji> <blue>Écologie</blue>",
+                                    `Nous vivons une époque ou l'utilisation de la technologie connaît une croissance exponentielle notament
                                     à travers internet.
                                     <br/>Il est primordial de construire le numérique dans une direction de légèreté et d'économie de 
-                                    ressources.`]].map(e=>{var[t,e]=e;return{tag:"li",contents:[{tag:"h3",contents:t},{tag:"p",contents:e}]}})}]}]}}}},{}],6:[function(e,t,s){"use strict";const{articles_url:n}=e("../../constants"),r=e("object-to-html-renderer"),a=e("../generic-components/image-carousel"),{loadArticles:o,getArticleDate:i,getArticleBody:c}=e("../lib/article-utils");t.exports=class{constructor(){this.id=performance.now().toString(),this.state={loading:!0,articles:[],showArticleIndex:-1},this.loadArticles()}loadArticles(){o(`${n}news`).then(e=>{this.state.articles=e,this.state.showArticleIndex=this.state.articles.length-1,this.refresh()})}refresh(){r.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}renderArticle(t){return{tag:"article",class:`${t.images?"grid-2":"grid-1"}`,typeof:"Article",contents:[{tag:"div",class:"date",contents:[{tag:"time",property:"datePublished",contents:i(t.date)}]},{tag:"div",class:"title",contents:[{tag:"h3",contents:t.title,property:"headline"}]},{tag:"div",class:"subtitle",contents:[{tag:"strong",contents:t.subtitle,property:"alternativeHeadline"}]},{tag:"div",class:"body",contents:[{tag:"p",contents:c(t.body),property:"articleBody"}]},t.images&&new a({images:t.images.map(e=>`${t.path}/images/${e}`)}).render()]}}renderArticlePlaceholder(){return{tag:"article",class:"article-placeholder",contents:[{tag:"div",class:"date"},{tag:"div",class:"title"},{tag:"div",class:"subtitle"},{tag:"div",class:"body"},{tag:"div",class:"image-carousel"}]}}handleChangeArticle(e){let{showArticleIndex:t,articles:s}=this.state;t="prev"===e?0<=t-1?t-1:0:t+1<=s.length-1?t+1:s.length-1,this.state.showArticleIndex=t,this.refresh()}render(){var{articles:e,showArticleIndex:t}=this.state,s=t<e.length-1,n=0<t;return{tag:"div",id:this.id,class:"articles-displayer page-contents-center",contents:0<e.length?[this.renderArticle(e[t]),{tag:"div",class:"prev-next-buttons",contents:[{tag:"button",class:`prev-btn ${n?"active":"disabled"}`,contents:"Précédent",onclick:this.handleChangeArticle.bind(this,"prev")},{tag:"button",class:`next-btn ${s?"active":"disabled"}`,contents:"Suivant",onclick:this.handleChangeArticle.bind(this,"next")}]}]:[this.renderArticlePlaceholder()]}}}},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(e,t,s){"use strict";const{images_url:n}=e("../../constants");t.exports=class{constructor(e){this.props=e}render(){return{tag:"a",class:"theme-card",href:this.props.href,contents:[{tag:"div",class:"card-img",contents:[{tag:"img",alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/,"")}`,src:`${n}${this.props.img}`}]},{tag:"div",class:"card-title",contents:[{tag:"h2",class:"section-title",contents:this.props.title}]},{tag:"div",class:"card-description",contents:[{tag:"p",contents:this.props.description}]}]}}}},{"../../constants":2}],8:[function(e,t,s){"use strict";t.exports=class{render(){return{tag:"section",id:"whoami",contents:[{tag:"div",class:"page-contents-center",contents:[{tag:"h2",contents:"Qui sommes-nous-je ?"},{tag:"div",class:"presentation-card",contents:[{tag:"div",class:"header",contents:[{tag:"div",class:"pic",contents:[{tag:"img",alt:"portrait Pierre Jarriges pixel art by Lucie Ventadour",src:"assets/images/pijar_profile_lt_square.png"}]},{tag:"div",class:"header-text",contents:[{tag:"h3",contents:"Pierre Jarriges"},{tag:"h4",contents:"Artiste, auteur BD, compositeur, développeur informatique"},{tag:"strong",contents:"Créateur de <blue>Kuadrado Software</blue> en Février 2021."}]}]},{tag:"div",class:"body",contents:[{tag:"p",contents:`
+                                    ressources.`,
+                                ],
+                            ].map(v => {
+                                const [title, body] = v;
+                                return {
+                                    tag: "li",
+                                    contents: [
+                                        { tag: "h3", contents: title },
+                                        { tag: "p", contents: body },
+                                    ],
+                                };
+                            }),
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = KuadradoValues;
+
+},{}],6:[function(require,module,exports){
+"use strict";
+
+const { articles_url } = require("../../constants");
+const objectHtmlRenderer = require("object-to-html-renderer");
+const ImageCarousel = require("../generic-components/image-carousel");
+const { loadArticles, getArticleDate, getArticleBody } = require("../lib/article-utils");
+
+class NewsArticles {
+    constructor() {
+        this.id = performance.now().toString();
+        this.state = {
+            loading: true,
+            articles: [],
+            showArticleIndex: -1,
+        };
+        this.loadArticles();
+    }
+
+    loadArticles() {
+        loadArticles(`${articles_url}news`).then(articles => {
+            this.state.articles = articles;
+            this.state.showArticleIndex = this.state.articles.length - 1;
+            this.refresh();
+        });
+    }
+
+    refresh() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    renderArticle(articleData) {
+        return {
+            tag: "article",
+            class: `${articleData.images ? "grid-2" : "grid-1"}`,
+            typeof: "Article",
+            contents: [
+                {
+                    tag: "div",
+                    class: "date",
+                    contents: [
+                        {
+                            tag: "time",
+                            property: "datePublished",
+                            contents: getArticleDate(articleData.date),
+                        },
+                    ],
+                },
+                {
+                    tag: "div",
+                    class: "title",
+                    contents: [
+                        {
+                            tag: "h3",
+                            contents: articleData.title,
+                            property: "headline",
+                        },
+                    ],
+                },
+                {
+                    tag: "div",
+                    class: "subtitle",
+                    contents: [
+                        {
+                            tag: "strong",
+                            contents: articleData.subtitle,
+                            property: "alternativeHeadline",
+                        },
+                    ],
+                },
+                {
+                    tag: "div",
+                    class: "body",
+                    contents: [
+                        {
+                            tag: "p",
+                            contents: getArticleBody(articleData.body),
+                            property: "articleBody",
+                        },
+                    ],
+                },
+                articleData.images &&
+                    new ImageCarousel({
+                        images: articleData.images.map(img => `${articleData.path}/images/${img}`),
+                    }).render(),
+            ],
+        };
+    }
+
+    renderArticlePlaceholder() {
+        return {
+            tag: "article",
+            class: "article-placeholder",
+            contents: [
+                { tag: "div", class: "date" },
+                { tag: "div", class: "title" },
+                { tag: "div", class: "subtitle" },
+                { tag: "div", class: "body" },
+                { tag: "div", class: "image-carousel" },
+            ],
+        };
+    }
+
+    handleChangeArticle(dir) {
+        let { showArticleIndex, articles } = this.state;
+        showArticleIndex =
+            dir === "prev"
+                ? showArticleIndex - 1 >= 0
+                    ? showArticleIndex - 1
+                    : 0
+                : showArticleIndex + 1 <= articles.length - 1
+                ? showArticleIndex + 1
+                : articles.length - 1;
+        this.state.showArticleIndex = showArticleIndex;
+        this.refresh();
+    }
+
+    render() {
+        const { articles, showArticleIndex } = this.state,
+            showNext = showArticleIndex < articles.length - 1,
+            showPrev = showArticleIndex > 0;
+        return {
+            tag: "div",
+            id: this.id,
+            class: "articles-displayer page-contents-center",
+            contents:
+                articles.length > 0
+                    ? [
+                          this.renderArticle(articles[showArticleIndex]),
+                          {
+                              tag: "div",
+                              class: "prev-next-buttons",
+                              contents: [
+                                  {
+                                      tag: "button",
+                                      class: `prev-btn ${!showPrev ? "disabled" : "active"}`,
+                                      contents: "Précédent",
+                                      onclick: this.handleChangeArticle.bind(this, "prev"),
+                                  },
+                                  {
+                                      tag: "button",
+                                      class: `next-btn ${!showNext ? "disabled" : "active"}`,
+                                      contents: "Suivant",
+                                      onclick: this.handleChangeArticle.bind(this, "next"),
+                                  },
+                              ],
+                          },
+                      ]
+                    : [this.renderArticlePlaceholder()],
+        };
+    }
+}
+
+module.exports = NewsArticles;
+
+},{"../../constants":2,"../generic-components/image-carousel":4,"../lib/article-utils":10,"object-to-html-renderer":3}],7:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../constants");
+
+class ThemeCard {
+    constructor(props) {
+        this.props = props;
+    }
+
+    render() {
+        return {
+            tag: "a",
+            class: "theme-card",
+            href: this.props.href,
+            contents: [
+                {
+                    tag: "div",
+                    class: "card-img",
+                    contents: [{ tag: "img", alt:`thematic image ${this.props.img.replace(/\.[A-Za-z]+/, "")}`,src: `${images_url}${this.props.img}` }],
+                },
+                {
+                    tag: "div",
+                    class: "card-title",
+                    contents: [{ tag: "h2", class: "section-title", contents: this.props.title }],
+                },
+                {
+                    tag: "div",
+                    class: "card-description",
+                    contents: [{ tag: "p", contents: this.props.description }],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = ThemeCard;
+
+},{"../../constants":2}],8:[function(require,module,exports){
+"use strict";
+
+class WhoAmI {
+    render() {
+        return {
+            tag: "section",
+            id: "whoami",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-contents-center",
+                    contents: [
+                        {
+                            tag: "h2",
+                            contents: "Qui sommes-nous-je ?",
+                        },
+                        {
+                            tag: "div",
+                            class: "presentation-card",
+                            contents: [
+                                {
+                                    tag: "div",
+                                    class: "header",
+                                    contents: [
+                                        {
+                                            tag: "div",
+                                            class: "pic",
+                                            contents: [
+                                                {
+                                                    tag: "img",
+                                                    alt:
+                                                        "portrait Pierre Jarriges pixel art by Lucie Ventadour",
+                                                    src: "assets/images/pijar_profile_lt_square.png",
+                                                },
+                                            ],
+                                        },
+                                        {
+                                            tag: "div",
+                                            class: "header-text",
+                                            contents: [
+                                                {
+                                                    tag: "h3",
+                                                    contents: "Pierre Jarriges",
+                                                },
+                                                {
+                                                    tag: "h4",
+                                                    contents:
+                                                        "Artiste, auteur BD, compositeur, développeur informatique",
+                                                },
+                                                {
+                                                    tag: "strong",
+                                                    contents:
+                                                        "Créateur de <blue>Kuadrado Software</blue> en Février 2021.",
+                                                },
+                                            ],
+                                        },
+                                    ],
+                                },
+                                {
+                                    tag: "div",
+                                    class: "body",
+                                    contents: [
+                                        {
+                                            tag: "p",
+                                            contents: `
                                             “ La création de <b><blue>Kuadrado Software</blue></b> vient de la volonté de développer différents axes ensembles :
                                             <br /><br />
                                             <emoji>🎮</emoji> D'une part exprimer une passion en créant des <b>jeux vidéo indépendants</b> sur un modèle léger et artisanal dans 
@@ -24,5 +515,467 @@
                                             dans le même état d'esprit, former des équipes de travail et de création, et s'inscrire dans un tissu 
                                             local de savoir-faire, tout en gardant un modèle d'entreprise basé sur l'indépendance, afin de rester aussi léger, libéral, 
                                             et modulaire que possible.”
-                                            `}]}]}]}]}}}},{}],9:[function(e,t,s){"use strict";const{images_url:n}=e("../constants"),r=e("./home-page-components/kuadrado-values"),a=e("./home-page-components/news-articles"),o=e("./home-page-components/theme-card"),i=e("./home-page-components/whoami");class c extends e("./lib/web-page"){render(){return{tag:"div",id:"home-page",contents:[{tag:"div",class:"page-header",contents:[{tag:"div",class:"big-logo page-contents-center",contents:[{tag:"img",alt:"logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",class:"logo-text",alt:"Kuadrado",src:`${n}logo_kuadrado_txt.svg`}]},{tag:"h1",contents:"Kuadrado Software",class:"page-contents-center"},{tag:"p",class:"page-contents-center",contents:"Créations numériques, jeux vidéo, pédagogie."},{tag:"ul",class:"philo-bubbles",contents:["Simplicité","Légèreté","Écologie"].map(e=>({tag:"li",contents:[{tag:"span",contents:e}]}))}]},{tag:"section",class:"page-contents-center poles",contents:[{title:"Jeux",img:"game_controller.svg",href:"/games/",description:"Créations vidéoludiques, jeux web et jeux PC, projets en cours."},{title:"Pédagogie",img:"brain.svg",href:"/education/",description:"S'approprier la technologie par le partage de connaissances."},{title:"Software",img:"meca_proc.svg",href:"/software-development/",description:"R&D, projets expérimentaux, web et outillage logiciel"}].map(e=>new o(e).render())},{tag:"section",class:"page-philo",contents:[{tag:"p",class:"page-contents-center",contents:"Travailler pour le plaisir de créer, de maîtriser et de comprendre."}]},{tag:"section",class:"page-contents-center",id:"news",contents:[{tag:"h2",contents:"Actu",class:"section-title"},(new a).render()]},(new r).render(),(new i).render()]}}}t.exports=c},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(e,t,s){"use strict";const{fetchjson:a,fetchtext:n}=e("./fetch");function o(e){return new Promise((t,s)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await n(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>s(e))})}t.exports={loadArticles:function(r){return new Promise((t,s)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var s=await a(`${r}/${t}`);const n=t.split("/");n.pop();e=`${r}/${n.join("/")}`;return Object.assign(s,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>s(e))}).catch(e=>s(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":11}],11:[function(e,t,s){"use strict";t.exports={fetchjson:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>s(e))})},fetchtext:function(e){return new Promise((t,s)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>s(e))})}}},{}],12:[function(e,t,s){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],13:[function(e,t,s){"use strict";var n=e("./homepage");const r=e("./run-page");r(n)},{"./homepage":9,"./run-page":14}],14:[function(e,t,s){"use strict";const n=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});n.setRenderCycleRoot(e),n.renderCycle()}},{"./template/template":16,"object-to-html-renderer":3}],15:[function(e,t,s){"use strict";const{images_url:n}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${n}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${n}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:s,submenu:n}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:s}].concat(n?[this.renderMenu(n,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],16:[function(e,t,s){"use strict";const{in_construction:n}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},n&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]);
\ No newline at end of file
+                                            `,
+                                        },
+                                    ],
+                                },
+                            ],
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = WhoAmI;
+
+},{}],9:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../constants");
+const KuadradoValues = require("./home-page-components/kuadrado-values");
+const NewsArticles = require("./home-page-components/news-articles");
+const ThemeCard = require("./home-page-components/theme-card");
+const WhoAmI = require("./home-page-components/whoami");
+const WebPage = require("./lib/web-page");
+
+class HomePage extends WebPage {
+    render() {
+        return {
+            tag: "div",
+            id: "home-page",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-header",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "big-logo page-contents-center",
+                            contents: [
+                                {
+                                    tag: "img",
+                                    alt: "logo Kuadrado",
+                                    src: `${images_url}logo_kuadrado.svg`,
+                                },
+                                {
+                                    tag: "img",
+                                    class: "logo-text",
+                                    alt: "Kuadrado",
+                                    src: `${images_url}logo_kuadrado_txt.svg`,
+                                },
+                            ],
+                        },
+                        { tag: "h1", contents: "Kuadrado Software", class: "page-contents-center" },
+                        {
+                            tag: "p",
+                            class: "page-contents-center",
+                            contents: `Créations numériques, jeux vidéo, pédagogie.`,
+                        },
+                        {
+                            tag: "ul",
+                            class: "philo-bubbles",
+                            contents: ["Simplicité", "Légèreté", "Écologie"].map(word => {
+                                return {
+                                    tag: "li",
+                                    contents: [{ tag: "span", contents: word }],
+                                };
+                            }),
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    class: "page-contents-center poles",
+                    contents: [
+                        {
+                            title: "Jeux",
+                            img: "game_controller.svg",
+                            href: "/games/",
+                            description:
+                                "Créations vidéoludiques, jeux web et jeux PC, projets en cours.",
+                        },
+                        {
+                            title: "Pédagogie",
+                            img: "brain.svg",
+                            href: "/education/",
+                            description: `S'approprier la technologie par le partage de connaissances.`,
+                        },
+                        {
+                            title: "Software",
+                            img: "meca_proc.svg",
+                            href: "/software-development/",
+                            description: `R&D, projets expérimentaux, web et outillage logiciel`,
+                        },
+                    ].map(cardProps => new ThemeCard(cardProps).render()),
+                },
+                {
+                    tag: "section",
+                    class: "page-philo",
+                    contents: [
+                        {
+                            tag: "p",
+                            class: "page-contents-center",
+                            contents: `Travailler pour le plaisir de créer, de maîtriser et de comprendre.`,
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    class: "page-contents-center",
+                    id:"news",
+                    contents: [
+                        { tag: "h2", contents: "Actu", class: "section-title" },
+                        new NewsArticles().render(),
+                    ],
+                },
+                new KuadradoValues().render(),
+                new WhoAmI().render(),
+            ],
+        };
+    }
+}
+
+module.exports = HomePage;
+
+},{"../constants":2,"./home-page-components/kuadrado-values":5,"./home-page-components/news-articles":6,"./home-page-components/theme-card":7,"./home-page-components/whoami":8,"./lib/web-page":12}],10:[function(require,module,exports){
+"use strict";
+
+const { fetchjson, fetchtext } = require("./fetch");
+
+function getArticleBody(text) {
+    return text.replaceAll("\n", "<br/>");
+}
+
+function getArticleDate(date) {
+    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
+}
+
+function loadArticles(dir_url) {
+    return new Promise((resolve, reject) => {
+        fetchjson(`${dir_url}/index.json`)
+            .then(json => {
+                Promise.all(
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
+                        tmpSplit.pop();
+                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
+                        return Object.assign(art, { path: absArtPath });
+                    })
+                )
+                    .then(articles => {
+                        populateArticles(articles)
+                            .then(completeArticles => resolve(completeArticles))
+                            .catch(e => reject(e));
+                    })
+                    .catch(e => reject(e));
+            })
+            .catch(e => console.log(e));
+    });
+}
+
+function populateArticles(articles) {
+    return new Promise((resolve, reject) => {
+        Promise.all(
+            articles.map(async article => {
+                if (article.body.indexOf("<file>") !== -1) {
+                    const txtPath = article.body.replace("<file>", "");
+                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
+                    article.body = textValue;
+                    article.date = article.date ? new Date(article.date) : undefined;
+                }
+                return article;
+            })
+        )
+            .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date)))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    loadArticles,
+    getArticleBody,
+    getArticleDate,
+    populateArticles,
+};
+
+},{"./fetch":11}],11:[function(require,module,exports){
+"use strict";
+
+function fetchjson(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.json())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+function fetchtext(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.text())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    fetchjson,
+    fetchtext,
+};
+
+},{}],12:[function(require,module,exports){
+"use strict";
+
+class WebPage {
+    constructor(args) {
+        Object.assign(this, args);
+    }
+}
+
+module.exports = WebPage;
+},{}],13:[function(require,module,exports){
+"use strict";
+
+const HomePage = require("./homepage");
+const runPage = require("./run-page");
+
+runPage(HomePage);
+
+},{"./homepage":9,"./run-page":14}],14:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+const Template = require("./template/template");
+
+module.exports = function runPage(PageComponent) {
+    const template = new Template({ page: new PageComponent() });
+    objectHtmlRenderer.setRenderCycleRoot(template);
+    objectHtmlRenderer.renderCycle();
+};
+
+},{"./template/template":16,"object-to-html-renderer":3}],15:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+
+const NAV_MENU_ITEMS = [
+    { url: "/games/", text: "Jeux" },
+    {
+        url: "/education/",
+        text: "Pédagogie",
+        // submenu: [
+        //     { url: "/gamedev", text: "Création de jeux vidéo" },
+        // ]
+    },
+    { url: "/software-development/", text: "Software" }
+];
+
+class NavBar {
+    constructor() {
+        this.initEventHandlers();
+    }
+
+    handleBurgerClick() {
+        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
+    }
+
+    initEventHandlers() {
+        window.addEventListener("click", event => {
+            if (
+                event.target.id !== "nav-menu-list" &&
+                !event.target.classList.contains("burger") &&
+                !event.target.parentNode.classList.contains("burger")
+            ) {
+                document.getElementById("nav-menu-list").classList.remove("responsive-show");
+            }
+        });
+    }
+
+    renderHome() {
+        return {
+            tag: "div",
+            class: "home",
+            contents: [
+                {
+                    tag: "a",
+                    href: "/",
+                    contents: [
+                        {
+                            tag: "img",
+                            alt: "Logo Kuadrado",
+                            src: `${images_url}logo_kuadrado.svg`,
+                        },
+                        {
+                            tag: "img",
+                            alt: "Kuadrado Software",
+                            class: "logo-text",
+                            src: `${images_url}logo_kuadrado_txt.svg`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+
+    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
+        return {
+            tag: "ul",
+            id: "nav-menu-list",
+            class: isSubmenu ? "submenu" : "",
+            contents: menuItemsArray.map(item => {
+                const { url, text, submenu } = item;
+                const href = `${parentUrl}${url}`;
+                return {
+                    tag: "li",
+                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
+                    contents: [
+                        {
+                            tag: "a",
+                            href,
+                            contents: text,
+                        },
+                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
+                };
+            }),
+        };
+    }
+
+    renderResponsiveBurger() {
+        return {
+            tag: "div",
+            class: "burger",
+            onclick: this.handleBurgerClick.bind(this),
+            contents: [{ tag: "span", contents: "···" }],
+        };
+    }
+
+    render() {
+        return {
+            tag: "nav",
+            contents: [
+                this.renderHome(),
+                this.renderResponsiveBurger(),
+                this.renderMenu(NAV_MENU_ITEMS),
+            ],
+        };
+    }
+}
+
+module.exports = NavBar;
+
+},{"../../../constants":2}],16:[function(require,module,exports){
+"use strict";
+
+const { in_construction } = require("../../config");
+const { images_url } = require("../../constants");
+const NavBar = require("./components/navbar");
+
+class Template {
+    constructor(props) {
+        this.props = props;
+    }
+    render() {
+        return {
+            tag: "main",
+            contents: [
+                {
+                    tag: "header",
+                    contents: [new NavBar().render()],
+                },
+                in_construction && {
+                    tag: "section",
+                    class: "warning-banner",
+                    contents: [
+                        {
+                            tag: "strong",
+                            class: "page-contents-center",
+                            contents: "Site en construction ...",
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    id: "page-container",
+                    contents: [this.props.page.render()],
+                },
+                {
+                    tag: "footer",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "logo",
+                            contents: [
+                                {
+                                    tag: "img",
+                                    alt: `logo Kuadrado`,
+                                    src: `${images_url}logo_kuadrado.svg`,
+                                },
+                                {
+                                    tag: "img",
+                                    class: "text-logo",
+                                    alt: "Kuadrado Software",
+                                    src: `${images_url}logo_kuadrado_txt.svg`,
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
+                        },
+                        {
+                            tag: "div",
+                            contents: [
+                                { tag: "strong", contents: "<blue>Contact : </blue>" },
+                                {
+                                    tag: "a",
+                                    href: "mailto:contact@kuadrado-software.fr",
+                                    contents: "contact@kuadrado-software.fr",
+                                },
+                            ],
+                        },
+                        {
+                            tag: "div",
+                            class: "social",
+                            contents: [
+                                {
+                                    tag: "strong",
+                                    contents: "<blue>Sur les réseaux : </blue>",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://www.linkedin.com/company/kuadrado-software",
+                                    target: "_blank",
+                                    contents: "in",
+                                    title: "Linkedin",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://twitter.com/KuadradoSoft",
+                                    target: "_blank",
+                                    contents: "t",
+                                    title: "Twitter",
+                                    style_rules: { fontFamily: "serif" },
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: `Copyright © ${new Date()
+                                .getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = Template;
+
+},{"../../config":1,"../../constants":2,"./components/navbar":15}]},{},[13]);
diff --git a/public/software-development/software-development.js b/public/software-development/software-development.js
index f17ce36..43b6a97 100644
--- a/public/software-development/software-development.js
+++ b/public/software-development/software-development.js
@@ -1,2 +1,811 @@
-!function s(r,a,o){function c(t,e){if(!a[t]){if(!r[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(i)return i(t,!0);throw(n=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",n}n=a[t]={exports:{}},r[t][0].call(n.exports,function(e){return c(r[t][1][e]||e)},n,n.exports,s,r,a,o)}return a[t].exports}for(var i="function"==typeof require&&require,e=0;e<o.length;e++)c(o[e]);return c}({1:[function(e,t,n){t.exports={getServerUrl:function(){return`${location.origin}${"/"!==location.origin.charAt(location.origin.length-1)?"/":""}`},build:{protected_dirs:["assets","style","articles"],default_meta_keys:["title","description","image","open_graph","json_ld"]}}},{}],2:[function(e,t,n){const{getServerUrl:s}=e("./config");t.exports={images_url:`${s()}assets/images/`,articles_url:`${s()}articles/`}},{"./config":1}],3:[function(e,t,n){"use strict";t.exports={setRenderCycleRoot(e){this.renderCycleRoot=e},objectToHtml:function t(n){var{tag:e}=n;const s=document.createElement(e),r=["tag","contents","style_rules","state"];return Object.keys(n).filter(e=>!r.includes(e)).forEach(e=>{"class"===e?s.classList.add(...n[e].split(" ").filter(e=>""!==e)):s[e]=n[e]}),n.contents&&"string"==typeof n.contents?s.innerHTML=n.contents:n.contents&&0<n.contents.length&&n.contents.forEach(e=>{switch(typeof e){case"string":s.innerHTML=e;break;case"object":s.appendChild(t(e))}}),n.style_rules&&Object.keys(n.style_rules).forEach(e=>{s.style[e]=n.style_rules[e]}),s},renderCycle:function(){this.subRender(this.renderCycleRoot.render(),document.getElementsByTagName("main")[0],{mode:"replace"})},subRender(e,t,n={mode:"append"}){var s=this.objectToHtml(e);switch(n.mode){case"append":t.appendChild(s);break;case"override":t.innerHTML="",t.appendChild(s);break;case"insert-before":t.insertBefore(s,t.childNodes[n.insertIndex]);break;case"adjacent":t.insertAdjacentHTML(n.insertLocation,s);break;case"replace":t.parentNode.replaceChild(s,t);break;case"remove":t.remove()}}}},{}],4:[function(e,t,n){"use strict";const s=e("object-to-html-renderer");t.exports=class{constructor(e){this.props=e,this.id=performance.now(),this.state={showImageIndex:0},this.RUN_INTERVAL=5e3,1<this.props.images.length&&this.run()}run(){this.runningInterval=setInterval(()=>{var{showImageIndex:e}=this.state,{images:t}=this.props;this.state.showImageIndex=e<t.length-1?++e:0,this.refreshImage()},this.RUN_INTERVAL)}setImageIndex(e){clearInterval(this.runningInterval),this.state.showImageIndex=e,this.refreshImage()}refreshImage(){s.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}render(){const{showImageIndex:n}=this.state,{images:e}=this.props;return{tag:"div",id:this.id,class:"image-carousel",contents:[{tag:"img",property:"image",alt:`image carousel ${e[n].replace(/\.[A-Za-z]+/,"")}`,src:e[n]},1<e.length&&{tag:"div",class:"carousel-bullets",contents:e.map((e,t)=>{return{tag:"span",class:`bullet ${n===t?"active":""}`,onclick:this.setImageIndex.bind(this,t)}})}]}}}},{"object-to-html-renderer":3}],5:[function(e,t,n){"use strict";const{fetchjson:a,fetchtext:s}=e("./fetch");function o(e){return new Promise((t,n)=>{Promise.all(e.map(async e=>{var t;return-1!==e.body.indexOf("<file>")&&(t=e.body.replace("<file>",""),t=await s(`${e.path}/${t}`),e.body=t,e.date=e.date?new Date(e.date):void 0),e})).then(e=>t(e.sort((e,t)=>e.date-t.date))).catch(e=>n(e))})}t.exports={loadArticles:function(r){return new Promise((t,n)=>{a(`${r}/index.json`).then(e=>{Promise.all(e.articles.map(async e=>{const t=`${e}/${e}.json`;var n=await a(`${r}/${t}`);const s=t.split("/");s.pop();e=`${r}/${s.join("/")}`;return Object.assign(n,{path:e})})).then(e=>{o(e).then(e=>t(e)).catch(e=>n(e))}).catch(e=>n(e))}).catch(e=>console.log(e))})},getArticleBody:function(e){return e.replaceAll("\n","<br/>")},getArticleDate:function(e){return`${e.getDate()}-${e.getMonth()+1}-${e.getFullYear()}`},populateArticles:o}},{"./fetch":6}],6:[function(e,t,n){"use strict";t.exports={fetchjson:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.json()).then(e=>t(e)).catch(e=>n(e))})},fetchtext:function(e){return new Promise((t,n)=>{fetch(e).then(e=>e.text()).then(e=>t(e)).catch(e=>n(e))})}}},{}],7:[function(e,t,n){"use strict";t.exports=class{constructor(e){Object.assign(this,e)}}},{}],8:[function(e,t,n){"use strict";const{articles_url:s}=e("../../../../constants"),i=e("../../../generic-components/image-carousel"),{loadArticles:r,getArticleBody:l,getArticleDate:d}=e("../../../lib/article-utils"),a=e("object-to-html-renderer");class o{constructor(e){this.props=e}render(){const{title:e,date:t,body:n,subtitle:s,images:r,path:a,technical:o,releases:c}=this.props;return{tag:"article",class:"software-article",typeof:"SoftwareApplication",additionalType:"Article",contents:[{tag:"h2",class:"software-title",contents:e,property:"name"},{tag:"time",class:"software-date",contents:d(t),property:"datePublished"},{tag:"h3",class:"software-subtitle",contents:s,property:"alternativeHeadline"},{tag:"div",class:"software-description",contents:l(n),property:"description"},new i({images:r.map(e=>`${a}/images/${e}`)}).render(),{tag:"div",class:"software-technical",contents:[{tag:"h2",contents:"Details"},{tag:"ul",class:"technical-details",contents:[{tag:"li",class:"detail",contents:[{tag:"label",contents:"Stack"},{tag:"div",contents:[{tag:"ul",contents:o.stack.map(e=>({tag:"li",contents:e,property:"about"}))}]}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Version actuelle"},{tag:"div",contents:o.version,property:"version"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"License"},{tag:"div",contents:o.license,property:"license"}]},{tag:"li",class:"detail",contents:[{tag:"label",contents:"Code source"},{tag:"a",href:o.repository,target:"_blank",contents:o.repository.replace(/https?:\/\/(www\.)?/g,""),property:"url"}]}]},c&&{tag:"h2",contents:"Releases"},c&&{tag:"ul",class:"releases",contents:[{tag:"li",class:"detail",contents:[{tag:"label",class:"label",contents:"Plateforme"},{tag:"label",class:"label",contents:"Téléchargement"}]}].concat(c.map(e=>({tag:"li",class:"release detail",contents:[{tag:"label",contents:e.platform},{tag:"a",download:e.download,href:`${a}/release/${e.download}`,contents:e.download,property:"url"}]})))}]}]}}}t.exports=class{constructor(e){this.props=e,this.state={articles:[]},this.id=performance.now(),this.loadArticles()}loadArticles(){r(`${s}software`).then(e=>{this.state.articles=e,this.refresh(),this.fixScroll()}).catch(e=>console.log(e))}renderPlaceholder(){return{tag:"article",class:"placeholder",contents:[{tag:"div",class:"title"},{tag:"div",class:"body"},{tag:"div",class:"details"}]}}refresh(){a.subRender(this.render(),document.getElementById(this.id),{mode:"replace"})}fixScroll(){window.location.href.includes("#")&&window.scrollTo(0,document.getElementById(window.location.href.match(/#.+/)[0].replace("#","")).offsetTop)}render(){const{articles:e}=this.state;return{tag:"section",class:"software-articles page-contents-center",id:this.id,contents:0<e.length?e.map(e=>new o({...e}).render()):[this.renderPlaceholder()]}}}},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants");var r=e("../../lib/web-page");const a=e("./components/software-articles");class o extends r{render(){return{tag:"div",id:"software-page",contents:[{tag:"div",class:"page-header logo-left",contents:[{tag:"div",class:"page-contents-center grid-wrapper",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"image mechanic electronic",src:`${s}meca_proc.svg`}]},{tag:"h1",contents:"Software"},{tag:"p",contents:"R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web."}]}]},(new a).render()]}}}t.exports=o},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(e,t,n){"use strict";const s=e("../../run-page");e=e("./software-development");s(e)},{"../../run-page":11,"./software-development":9}],11:[function(e,t,n){"use strict";const s=e("object-to-html-renderer"),r=e("./template/template");t.exports=function(e){e=new r({page:new e});s.setRenderCycleRoot(e),s.renderCycle()}},{"./template/template":13,"object-to-html-renderer":3}],12:[function(e,t,n){"use strict";const{images_url:s}=e("../../../constants"),r=[{url:"/games/",text:"Jeux"},{url:"/education/",text:"Pédagogie"},{url:"/software-development/",text:"Software"}];t.exports=class{constructor(){this.initEventHandlers()}handleBurgerClick(){document.getElementById("nav-menu-list").classList.toggle("responsive-show")}initEventHandlers(){window.addEventListener("click",e=>{"nav-menu-list"===e.target.id||e.target.classList.contains("burger")||e.target.parentNode.classList.contains("burger")||document.getElementById("nav-menu-list").classList.remove("responsive-show")})}renderHome(){return{tag:"div",class:"home",contents:[{tag:"a",href:"/",contents:[{tag:"img",alt:"Logo Kuadrado",src:`${s}logo_kuadrado.svg`},{tag:"img",alt:"Kuadrado Software",class:"logo-text",src:`${s}logo_kuadrado_txt.svg`}]}]}}renderMenu(e,a=!1,o=""){return{tag:"ul",id:"nav-menu-list",class:a?"submenu":"",contents:e.map(e=>{const{url:t,text:n,submenu:s}=e,r=`${o}${t}`;return{tag:"li",class:a||window.location.pathname!==r?"":"active",contents:[{tag:"a",href:r,contents:n}].concat(s?[this.renderMenu(s,!0,t)]:[])}})}}renderResponsiveBurger(){return{tag:"div",class:"burger",onclick:this.handleBurgerClick.bind(this),contents:[{tag:"span",contents:"···"}]}}render(){return{tag:"nav",contents:[this.renderHome(),this.renderResponsiveBurger(),this.renderMenu(r)]}}}},{"../../../constants":2}],13:[function(e,t,n){"use strict";const{in_construction:s}=e("../../config"),{images_url:r}=e("../../constants"),a=e("./components/navbar");t.exports=class{constructor(e){this.props=e}render(){return{tag:"main",contents:[{tag:"header",contents:[(new a).render()]},s&&{tag:"section",class:"warning-banner",contents:[{tag:"strong",class:"page-contents-center",contents:"Site en construction ..."}]},{tag:"section",id:"page-container",contents:[this.props.page.render()]},{tag:"footer",contents:[{tag:"div",class:"logo",contents:[{tag:"img",alt:"logo Kuadrado",src:`${r}logo_kuadrado.svg`},{tag:"img",class:"text-logo",alt:"Kuadrado Software",src:`${r}logo_kuadrado_txt.svg`}]},{tag:"span",contents:"32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France"},{tag:"div",contents:[{tag:"strong",contents:"<blue>Contact : </blue>"},{tag:"a",href:"mailto:contact@kuadrado-software.fr",contents:"contact@kuadrado-software.fr"}]},{tag:"div",class:"social",contents:[{tag:"strong",contents:"<blue>Sur les réseaux : </blue>"},{tag:"a",href:"https://www.linkedin.com/company/kuadrado-software",target:"_blank",contents:"in",title:"Linkedin"},{tag:"a",href:"https://twitter.com/KuadradoSoft",target:"_blank",contents:"t",title:"Twitter",style_rules:{fontFamily:"serif"}}]},{tag:"span",contents:`Copyright © ${(new Date).getFullYear()} Kuadrado Software | 
-                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`}]}]}}}},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]);
\ No newline at end of file
+(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+function getServerUrl() {
+    return `${location.origin}${location.origin.charAt(location.origin.length - 1) !== "/" ? "/" : ""
+        }`;
+}
+
+module.exports = {
+    getServerUrl,
+    build: {
+        protected_dirs: ["assets", "style", "articles"],
+        default_meta_keys: ["title", "description", "image", "open_graph", "json_ld"],
+    },
+};
+
+},{}],2:[function(require,module,exports){
+const { getServerUrl } = require("./config");
+
+module.exports = {
+    images_url: `${getServerUrl()}assets/images/`,
+    articles_url: `${getServerUrl()}articles/`,
+};
+
+},{"./config":1}],3:[function(require,module,exports){
+"use strict";
+
+module.exports = {
+    setRenderCycleRoot(renderCycleRoot) {
+        this.renderCycleRoot = renderCycleRoot;
+    },
+    objectToHtml: function objectToHtml(obj) {
+        const { tag } = obj;
+
+        const node = document.createElement(tag);
+        const excludeKeys = ["tag", "contents", "style_rules", "state"];
+
+        Object.keys(obj)
+            .filter(attr => !excludeKeys.includes(attr))
+            .forEach(attr => {
+                if (attr === "class") {
+                    node.classList.add(...obj[attr].split(" ").filter(s => s !== ""));
+                } else {
+                    node[attr] = obj[attr];
+                }
+            });
+        if (obj.contents && typeof obj.contents === "string") {
+            node.innerHTML = obj.contents;
+        } else {
+            obj.contents &&
+                obj.contents.length > 0 &&
+                obj.contents.forEach(el => {
+                    switch (typeof el) {
+                        case "string":
+                            node.innerHTML = el;
+                            break;
+                        case "object":
+                            node.appendChild(objectToHtml(el));
+                            break;
+                    }
+                });
+        }
+
+        if (obj.style_rules) {
+            Object.keys(obj.style_rules).forEach(rule => {
+                node.style[rule] = obj.style_rules[rule];
+            });
+        }
+
+        return node;
+    },
+    renderCycle: function () {
+        this.subRender(this.renderCycleRoot.render(), document.getElementsByTagName("main")[0], {
+            mode: "replace",
+        });
+    },
+    subRender(object, htmlNode, options = { mode: "append" }) {
+        const insert = this.objectToHtml(object);
+        switch (options.mode) {
+            case "append":
+                htmlNode.appendChild(insert);
+                break;
+            case "override":
+                htmlNode.innerHTML = "";
+                htmlNode.appendChild(insert);
+                break;
+            case "insert-before":
+                htmlNode.insertBefore(insert, htmlNode.childNodes[options.insertIndex]);
+                break;
+            case "adjacent":
+                /**
+                 * options.insertLocation must be one of:
+                 *
+                 * afterbegin
+                 * afterend
+                 * beforebegin
+                 * beforeend
+                 */
+                htmlNode.insertAdjacentHTML(options.insertLocation, insert);
+                break;
+            case "replace":
+                htmlNode.parentNode.replaceChild(insert, htmlNode);
+                break;
+            case "remove":
+                htmlNode.remove();
+                break;
+        }
+    },
+};
+
+},{}],4:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+
+class ImageCarousel {
+    constructor(props) {
+        this.props = props;
+        this.id = performance.now();
+        this.state = {
+            showImageIndex: 0,
+        };
+        this.RUN_INTERVAL = 5000;
+        this.props.images.length > 1 && this.run();
+    }
+
+    run() {
+        this.runningInterval = setInterval(() => {
+            let { showImageIndex } = this.state;
+            const { images } = this.props;
+            this.state.showImageIndex = showImageIndex < images.length - 1 ? ++showImageIndex : 0;
+            this.refreshImage();
+        }, this.RUN_INTERVAL);
+    }
+
+    setImageIndex(i) {
+        clearInterval(this.runningInterval);
+        this.state.showImageIndex = i;
+        this.refreshImage();
+    }
+
+    refreshImage() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    render() {
+        const { showImageIndex } = this.state;
+        const { images } = this.props;
+        return {
+            tag: "div",
+            id: this.id,
+            class: "image-carousel",
+            contents: [
+                {
+                    tag: "img",
+                    property: "image",
+                    alt: `image carousel ${images[showImageIndex].replace(/\.[A-Za-z]+/, "")}`,
+                    src: images[showImageIndex],
+                },
+                images.length > 1 && {
+                    tag: "div",
+                    class: "carousel-bullets",
+                    contents: images.map((_, i) => {
+                        const active = showImageIndex === i;
+                        return {
+                            tag: "span",
+                            class: `bullet ${active ? "active" : ""}`,
+                            onclick: this.setImageIndex.bind(this, i),
+                        };
+                    }),
+                },
+            ],
+        };
+    }
+}
+
+module.exports = ImageCarousel;
+
+},{"object-to-html-renderer":3}],5:[function(require,module,exports){
+"use strict";
+
+const { fetchjson, fetchtext } = require("./fetch");
+
+function getArticleBody(text) {
+    return text.replaceAll("\n", "<br/>");
+}
+
+function getArticleDate(date) {
+    return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
+}
+
+function loadArticles(dir_url) {
+    return new Promise((resolve, reject) => {
+        fetchjson(`${dir_url}/index.json`)
+            .then(json => {
+                Promise.all(
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
+                        tmpSplit.pop();
+                        const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
+                        return Object.assign(art, { path: absArtPath });
+                    })
+                )
+                    .then(articles => {
+                        populateArticles(articles)
+                            .then(completeArticles => resolve(completeArticles))
+                            .catch(e => reject(e));
+                    })
+                    .catch(e => reject(e));
+            })
+            .catch(e => console.log(e));
+    });
+}
+
+function populateArticles(articles) {
+    return new Promise((resolve, reject) => {
+        Promise.all(
+            articles.map(async article => {
+                if (article.body.indexOf("<file>") !== -1) {
+                    const txtPath = article.body.replace("<file>", "");
+                    const textValue = await fetchtext(`${article.path}/${txtPath}`);
+                    article.body = textValue;
+                    article.date = article.date ? new Date(article.date) : undefined;
+                }
+                return article;
+            })
+        )
+            .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date)))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    loadArticles,
+    getArticleBody,
+    getArticleDate,
+    populateArticles,
+};
+
+},{"./fetch":6}],6:[function(require,module,exports){
+"use strict";
+
+function fetchjson(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.json())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+function fetchtext(url) {
+    return new Promise((resolve, reject) => {
+        fetch(url)
+            .then(r => r.text())
+            .then(r => resolve(r))
+            .catch(e => reject(e));
+    });
+}
+
+module.exports = {
+    fetchjson,
+    fetchtext,
+};
+
+},{}],7:[function(require,module,exports){
+"use strict";
+
+class WebPage {
+    constructor(args) {
+        Object.assign(this, args);
+    }
+}
+
+module.exports = WebPage;
+},{}],8:[function(require,module,exports){
+"use strict";
+
+const { articles_url } = require("../../../../constants");
+const ImageCarousel = require("../../../generic-components/image-carousel");
+const { loadArticles, getArticleBody, getArticleDate } = require("../../../lib/article-utils");
+const objectHtmlRenderer = require("object-to-html-renderer")
+
+class SoftwareArticle {
+    constructor(props) {
+        this.props = props;
+    }
+
+    render() {
+        const { title, date, body, subtitle, images, path, technical, releases } = this.props;
+        return {
+            tag: "article",
+            class: "software-article",
+            typeof: "SoftwareApplication",
+            additionalType: "Article",
+            contents: [
+                {
+                    tag: "h2",
+                    class: "software-title",
+                    contents: title,
+                    property: "name",
+                },
+                {
+                    tag: "div", class: "software-image",
+                    contents: [
+                        {
+                            tag: "img", src: `${path}/images/${images[0]}`
+                        }
+                    ]
+                },
+                {
+                    tag: "h3",
+                    class: "software-subtitle",
+                    contents: subtitle,
+                    property: "alternativeHeadline",
+                },
+                {
+                    tag: "div",
+                    class: "software-description",
+                    contents: getArticleBody(body),
+                    property: "description",
+                },
+                {
+                    tag: "div",
+                    class: "software-technical",
+                    contents: [
+                        {
+                            tag: "h2",
+                            contents: "Details",
+                        },
+                        {
+                            tag: "ul",
+                            class: "technical-details",
+                            contents: [
+                                {
+                                    tag: "li",
+                                    class: "detail",
+                                    contents: [
+                                        { tag: "label", contents: "Stack" },
+                                        {
+                                            tag: "div",
+                                            contents: [
+                                                {
+                                                    tag: "ul",
+                                                    contents: technical.stack.map(tech => {
+                                                        return {
+                                                            tag: "li",
+                                                            contents: tech,
+                                                            property: "about",
+                                                        };
+                                                    }),
+                                                },
+                                            ],
+                                        },
+                                    ],
+                                },
+                                {
+                                    tag: "li",
+                                    class: "detail",
+                                    contents: [
+                                        { tag: "label", contents: "Version actuelle" },
+                                        {
+                                            tag: "div",
+                                            contents: technical.version,
+                                            property: "version",
+                                        },
+                                    ],
+                                },
+                                {
+                                    tag: "li",
+                                    class: "detail",
+                                    contents: [
+                                        { tag: "label", contents: "License" },
+                                        {
+                                            tag: "div",
+                                            contents: technical.license,
+                                            property: "license",
+                                        },
+                                    ],
+                                },
+                                {
+                                    tag: "li",
+                                    class: "detail",
+                                    contents: [
+                                        {
+                                            tag: "label",
+                                            contents: "Code source",
+                                        },
+                                        {
+                                            tag: "a",
+                                            href: technical.repository,
+                                            target: "_blank",
+                                            contents: technical.repository.replace(
+                                                /https?:\/\/(www\.)?/g,
+                                                ""
+                                            ),
+                                            property: "url",
+                                        },
+                                    ],
+                                },
+                            ],
+                        },
+                        releases && {
+                            tag: "h2",
+                            contents: "Releases",
+                        },
+                        releases && {
+                            tag: "ul",
+                            class: "releases",
+                            contents: [
+                                {
+                                    tag: "li",
+                                    class: "detail",
+                                    contents: [
+                                        {
+                                            tag: "label",
+                                            class: "label",
+                                            contents: "Plateforme",
+                                        },
+                                        {
+                                            tag: "label",
+                                            class: "label",
+                                            contents: "Téléchargement",
+                                        },
+                                    ],
+                                },
+                            ].concat(
+                                releases.map(rel => {
+                                    return {
+                                        tag: "li",
+                                        class: "release detail",
+                                        contents: [
+                                            {
+                                                tag: "label",
+                                                contents: rel.platform,
+                                            },
+                                            {
+                                                tag: "a",
+                                                download: rel.download,
+                                                href: `${path}/release/${rel.download}`,
+                                                contents: rel.download,
+                                                property: "url",
+                                            },
+                                        ],
+                                    };
+                                })
+                            ),
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+class SoftwareArticles {
+    constructor(props) {
+        this.props = props;
+        this.state = {
+            articles: [],
+        };
+        this.id = performance.now();
+        this.loadArticles();
+    }
+
+    loadArticles() {
+        loadArticles(`${articles_url}software`)
+            .then(articles => {
+                this.state.articles = articles;
+                this.refresh();
+                this.fixScroll();
+            })
+            .catch(e => console.log(e));
+    }
+
+    renderPlaceholder() {
+        return {
+            tag: "article",
+            class: "placeholder",
+            contents: [
+                { tag: "div", class: "title" },
+                { tag: "div", class: "body" },
+                { tag: "div", class: "details" },
+            ],
+        };
+    }
+
+    refresh() {
+        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
+            mode: "replace",
+        });
+    }
+
+    fixScroll() {
+        if (window.location.href.includes("#")) {
+            window.scrollTo(
+                0,
+                document.getElementById(window.location.href.match(/#.+/)[0].replace("#", ""))
+                    .offsetTop
+            );
+        }
+    }
+
+    render() {
+        const { articles } = this.state;
+        return {
+            tag: "section",
+            class: "software-articles page-contents-center",
+            id: this.id,
+            contents:
+                articles.length > 0
+                    ? articles.map(article => new SoftwareArticle({ ...article }).render())
+                    : [this.renderPlaceholder()],
+        };
+    }
+}
+
+module.exports = SoftwareArticles;
+
+},{"../../../../constants":2,"../../../generic-components/image-carousel":4,"../../../lib/article-utils":5,"object-to-html-renderer":3}],9:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+const WebPage = require("../../lib/web-page");
+const SoftwareArticles = require("./components/software-articles");
+
+class SoftwareDevelopment extends WebPage {
+    render() {
+        return {
+            tag: "div",
+            id: "software-page",
+            contents: [
+                {
+                    tag: "div",
+                    class: "page-header logo-left",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "page-contents-center grid-wrapper",
+                            contents: [
+                                {
+                                    tag: "div",
+                                    class: "logo",
+                                    contents: [
+                                        {
+                                            tag: "img",
+                                            alt: `image mechanic electronic`,
+                                            src: `${images_url}meca_proc.svg`,
+                                        },
+                                    ],
+                                },
+                                { tag: "h1", contents: "Software" },
+                                {
+                                    tag: "p",
+                                    contents: `R&D, projets expérimentaux, outillage logiciel pour le développement de jeu ou pour le web.`,
+                                },
+                            ],
+                        },
+                    ],
+                },
+                new SoftwareArticles().render(),
+            ],
+        };
+    }
+}
+
+module.exports = SoftwareDevelopment;
+
+},{"../../../constants":2,"../../lib/web-page":7,"./components/software-articles":8}],10:[function(require,module,exports){
+"use strict";
+
+"use strict";
+const runPage = require("../../run-page");
+const SoftwareDevelopment = require("./software-development");
+runPage(SoftwareDevelopment);
+
+},{"../../run-page":11,"./software-development":9}],11:[function(require,module,exports){
+"use strict";
+
+const objectHtmlRenderer = require("object-to-html-renderer")
+const Template = require("./template/template");
+
+module.exports = function runPage(PageComponent) {
+    const template = new Template({ page: new PageComponent() });
+    objectHtmlRenderer.setRenderCycleRoot(template);
+    objectHtmlRenderer.renderCycle();
+};
+
+},{"./template/template":13,"object-to-html-renderer":3}],12:[function(require,module,exports){
+"use strict";
+
+const { images_url } = require("../../../constants");
+
+const NAV_MENU_ITEMS = [
+    { url: "/games/", text: "Jeux" },
+    {
+        url: "/education/",
+        text: "Pédagogie",
+        // submenu: [
+        //     { url: "/gamedev", text: "Création de jeux vidéo" },
+        // ]
+    },
+    { url: "/software-development/", text: "Software" }
+];
+
+class NavBar {
+    constructor() {
+        this.initEventHandlers();
+    }
+
+    handleBurgerClick() {
+        document.getElementById("nav-menu-list").classList.toggle("responsive-show");
+    }
+
+    initEventHandlers() {
+        window.addEventListener("click", event => {
+            if (
+                event.target.id !== "nav-menu-list" &&
+                !event.target.classList.contains("burger") &&
+                !event.target.parentNode.classList.contains("burger")
+            ) {
+                document.getElementById("nav-menu-list").classList.remove("responsive-show");
+            }
+        });
+    }
+
+    renderHome() {
+        return {
+            tag: "div",
+            class: "home",
+            contents: [
+                {
+                    tag: "a",
+                    href: "/",
+                    contents: [
+                        {
+                            tag: "img",
+                            alt: "Logo Kuadrado",
+                            src: `${images_url}logo_kuadrado.svg`,
+                        },
+                        {
+                            tag: "img",
+                            alt: "Kuadrado Software",
+                            class: "logo-text",
+                            src: `${images_url}logo_kuadrado_txt.svg`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+
+    renderMenu(menuItemsArray, isSubmenu = false, parentUrl = "") {
+        return {
+            tag: "ul",
+            id: "nav-menu-list",
+            class: isSubmenu ? "submenu" : "",
+            contents: menuItemsArray.map(item => {
+                const { url, text, submenu } = item;
+                const href = `${parentUrl}${url}`;
+                return {
+                    tag: "li",
+                    class: !isSubmenu && window.location.pathname === href ? "active" : "",
+                    contents: [
+                        {
+                            tag: "a",
+                            href,
+                            contents: text,
+                        },
+                    ].concat(submenu ? [this.renderMenu(submenu, true, url)] : []),
+                };
+            }),
+        };
+    }
+
+    renderResponsiveBurger() {
+        return {
+            tag: "div",
+            class: "burger",
+            onclick: this.handleBurgerClick.bind(this),
+            contents: [{ tag: "span", contents: "···" }],
+        };
+    }
+
+    render() {
+        return {
+            tag: "nav",
+            contents: [
+                this.renderHome(),
+                this.renderResponsiveBurger(),
+                this.renderMenu(NAV_MENU_ITEMS),
+            ],
+        };
+    }
+}
+
+module.exports = NavBar;
+
+},{"../../../constants":2}],13:[function(require,module,exports){
+"use strict";
+
+const { in_construction } = require("../../config");
+const { images_url } = require("../../constants");
+const NavBar = require("./components/navbar");
+
+class Template {
+    constructor(props) {
+        this.props = props;
+    }
+    render() {
+        return {
+            tag: "main",
+            contents: [
+                {
+                    tag: "header",
+                    contents: [new NavBar().render()],
+                },
+                in_construction && {
+                    tag: "section",
+                    class: "warning-banner",
+                    contents: [
+                        {
+                            tag: "strong",
+                            class: "page-contents-center",
+                            contents: "Site en construction ...",
+                        },
+                    ],
+                },
+                {
+                    tag: "section",
+                    id: "page-container",
+                    contents: [this.props.page.render()],
+                },
+                {
+                    tag: "footer",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "logo",
+                            contents: [
+                                {
+                                    tag: "img",
+                                    alt: `logo Kuadrado`,
+                                    src: `${images_url}logo_kuadrado.svg`,
+                                },
+                                {
+                                    tag: "img",
+                                    class: "text-logo",
+                                    alt: "Kuadrado Software",
+                                    src: `${images_url}logo_kuadrado_txt.svg`,
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: "32 rue Simon Vialet, 07240 Vernoux en Vivarais. Ardèche, France",
+                        },
+                        {
+                            tag: "div",
+                            contents: [
+                                { tag: "strong", contents: "<blue>Contact : </blue>" },
+                                {
+                                    tag: "a",
+                                    href: "mailto:contact@kuadrado-software.fr",
+                                    contents: "contact@kuadrado-software.fr",
+                                },
+                            ],
+                        },
+                        {
+                            tag: "div",
+                            class: "social",
+                            contents: [
+                                {
+                                    tag: "strong",
+                                    contents: "<blue>Sur les réseaux : </blue>",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://www.linkedin.com/company/kuadrado-software",
+                                    target: "_blank",
+                                    contents: "in",
+                                    title: "Linkedin",
+                                },
+                                {
+                                    tag: "a",
+                                    href: "https://twitter.com/KuadradoSoft",
+                                    target: "_blank",
+                                    contents: "t",
+                                    title: "Twitter",
+                                    style_rules: { fontFamily: "serif" },
+                                },
+                            ],
+                        },
+                        {
+                            tag: "span",
+                            contents: `Copyright © ${new Date()
+                                .getFullYear()} Kuadrado Software | 
+                                Toutes les images du site ont été réalisées par mes soins et peuvent être réutilisées pour un usage personnel.`,
+                        },
+                    ],
+                },
+            ],
+        };
+    }
+}
+
+module.exports = Template;
+
+},{"../../config":1,"../../constants":2,"./components/navbar":12}]},{},[10]);
diff --git a/public/style/style.css b/public/style/style.css
index 450e8b2..26da894 100644
--- a/public/style/style.css
+++ b/public/style/style.css
@@ -1 +1,1277 @@
-body{font-family:Arial,Helvetica,sans-serif;margin:0}body *{box-sizing:border-box;color:#35393c;line-height:1.3em}body ul{margin:0;padding:0;list-style-type:none}body a{color:#4baabb;text-decoration:none}body a:hover{color:#72e3f0}body blue{color:#4baabb}body red{color:#9c3030}body green{color:#368736}body emoji{font-style:initial;font-size:25px}body .bg-blue{background-color:#4baabb;color:#fff}body .bg-dark{background-color:#3c4144;color:#aabbc8}body #seo-title{visibility:hidden}body img.pixelated{image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:crisp-edges}main{display:flex;flex-direction:column;align-items:center;min-height:100vh}main .warning-banner{background:url("/assets/images/wallpaper_warning.svg");width:100%;height:40px;padding:20px 10%;display:flex;justify-content:center;align-items:center;flex-direction:row}main .warning-banner strong{font-size:18px;color:#1c3db2}main .image-carousel{overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#000;position:relative}main .image-carousel img{position:absolute;max-width:100%;max-height:400px}main .image-carousel .carousel-bullets{position:absolute;bottom:0;padding:20px;display:flex;gap:10px}main .image-carousel .carousel-bullets .bullet{cursor:pointer;width:8px;height:8px;background-color:#6b7880;border-radius:100%;box-shadow:0 0 3px #000}main .image-carousel .carousel-bullets .bullet.active{background-color:#d4d9dd}@media screen and (max-width: 900px){main .image-carousel img{max-height:100%}main .image-carousel .carousel-bullets{gap:30px}main .image-carousel .carousel-bullets .bullet{width:12px;height:12px}}main header{width:100%;background-color:#fff;position:sticky;position:-webkit-sticky;top:0;z-index:10}main header nav{display:flex;align-items:center;height:60px}main header nav .home{margin:0 10px}main header nav .home a{display:flex;align-items:center;gap:10px}main header nav .home a img{height:40px;width:auto}main header nav .home a img.logo-text{width:120px;height:auto}main header nav ul{display:flex;padding:0;margin:0;list-style-type:none;height:100%}main header nav ul li{position:relative}main header nav ul li a{display:flex;align-items:center;height:100%;padding:10px 20px;color:#96a5ae;font-weight:800;text-decoration:none}main header nav ul li .submenu{visibility:hidden;overflow:hidden;position:absolute;height:auto;max-height:0;transition:max-height .6s;top:100%;left:50%;flex-direction:column;background-color:#fff;white-space:nowrap}main header nav ul li.active a{color:#3c4144;border-bottom:3px solid}main header nav ul li:hover a{color:#3c4144}main header nav ul li:hover .submenu{visibility:unset;max-height:1000px}main header nav ul li:hover .submenu a{color:#96a5ae;border:none}main header nav ul li:hover .submenu li:hover a{color:#3c4144}main header nav .burger{display:none}@media screen and (max-width: 560px){main header nav{justify-content:space-between}main header nav .burger{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;font-weight:bold;border:1px solid;margin:0 20px;cursor:pointer;border-radius:100%;width:35px;height:35px;color:#555d61;font-size:25px}main header nav ul{display:none}main header nav ul.responsive-show{display:flex;flex-direction:column;position:absolute;right:0;max-width:100vw;min-width:50vw;top:60px;background-color:#fff;box-shadow:0 4px 6px 2px #0000000a;height:unset}main header nav ul.responsive-show li.active a{border:none}main header nav ul.responsive-show li .submenu{display:flex;visibility:visible;position:relative;height:unset;max-height:unset;transition:max-height .6s;top:unset;left:unset;margin-left:20px}main header nav ul.responsive-show li .submenu li a{font-weight:400;font-size:14px;color:#96a5ae}}main #page-container{width:100%;flex:1}main #page-container .page-header{background-image:url("/assets/images/wallpaper_binary.png");padding:50px 0}main #page-container .page-header h1{padding:15px 40px 0;font-size:25px;color:#4baabb;margin:0 auto}main #page-container .page-header p{color:#72e3f0;font-style:italic;padding:15px 40px 15px 100px;margin:0 auto;font-size:18px}main #page-container .page-header p *{color:#72e3f0}main #page-container .page-header .big-logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px;padding:20px}main #page-container .page-header .big-logo img{width:200px;max-width:100%}main #page-container .page-header .big-logo img.logo-text{width:300px;max-width:100%}main #page-container .page-header .logo{padding-left:30px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container .page-header .logo img{width:100%}@media screen and (max-width: 560px){main #page-container .page-header h1{padding:15px 20px 0}main #page-container .page-header p{padding:20px 20px 30px 40px;text-align:justify}main #page-container .page-header .big-logo{flex-direction:column}}main #page-container .page-header.logo-left .grid-wrapper{display:grid;grid-template-columns:120px 1fr;grid-template-rows:auto 1fr}main #page-container .page-header.logo-left .grid-wrapper h1{width:100%}main #page-container .page-header.logo-left .grid-wrapper .logo{grid-column:1;grid-row:1;width:100%}main #page-container .page-header.logo-left .grid-wrapper p{margin:0;grid-column:1/span 2}@media screen and (max-width: 780px){main #page-container .page-header.logo-left .grid-wrapper h1{padding:0 20px}main #page-container .page-header.logo-left .grid-wrapper .logo{padding:0 20px}}main #page-container .page-philo{background-image:url("/assets/images/wallpaper_binary.png");padding:120px 30px}main #page-container .page-philo p{width:100%;max-width:600px;font-size:18px;color:#aabbc8;text-align:center;font-style:italic;font-weight:bold}main #page-container .page-philo p *{color:#aabbc8}main #page-container .page-contents-center{width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container .page-contents-center{padding:20px 20px 0}}main #page-container h2.page-section-title{color:#4baabb;padding:20px 0 10px;width:1300px;max-width:100%;margin:0 auto}@media screen and (max-width: 1300px){main #page-container h2.page-section-title{padding:20px 20px 0}}main #page-container #home-page{display:flex;flex-direction:column}main #page-container #home-page .section-title{padding:10px;margin:0;color:#aabbc8}main #page-container #home-page .page-header .philo-bubbles{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-wrap:wrap;gap:40px;margin:30px 20px}@media screen and (max-width: 780px){main #page-container #home-page .page-header .philo-bubbles{gap:20px}}main #page-container #home-page .page-header .philo-bubbles li{border-radius:100%;display:flex;justify-content:center;align-items:center;flex-direction:row;background-color:#d4d9dd;width:100px;height:100px}main #page-container #home-page .page-header .philo-bubbles li *{color:#6b7880}@media screen and (max-width: 560px){main #page-container #home-page .page-header .philo-bubbles li{width:75px;height:75px}main #page-container #home-page .page-header .philo-bubbles li *{font-size:12px}}main #page-container #home-page .page-header .philo-bubbles li:first-child{background-color:#6b7880}main #page-container #home-page .page-header .philo-bubbles li:first-child *{color:#fff}main #page-container #home-page .page-header .philo-bubbles li:last-child{background-color:#35393c}main #page-container #home-page .page-header .philo-bubbles li:last-child *{color:#96a5ae}main #page-container #home-page #news{padding:60px 20px}main #page-container #home-page #news .articles-displayer{margin:0 auto 40px}main #page-container #home-page #news .articles-displayer .prev-next-buttons{display:flex;justify-content:space-between}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn{border:none;background:none;display:flex;align-items:center;gap:10px;padding:5px 0}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled{visibility:hidden;pointer-events:none}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active{cursor:pointer;color:#6b7880}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover,main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover{color:#3c4144}main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(45deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before{content:" ";border-style:solid;border-width:2px 2px 0 0;width:8px;height:8px;transform:rotate(-135deg);display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #home-page #news .articles-displayer article{display:grid;gap:5px 50px;grid-template-rows:auto auto auto 1fr;position:relative;padding-left:20px}main #page-container #home-page #news .articles-displayer article.grid-1{grid-template-columns:1fr}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr 1fr}main #page-container #home-page #news .articles-displayer article .date{grid-column:1;grid-row:1;text-align:right}main #page-container #home-page #news .articles-displayer article .date time{color:#6b7880;font-style:italic;font-size:12px}main #page-container #home-page #news .articles-displayer article .title{grid-column:1;grid-row:2}main #page-container #home-page #news .articles-displayer article .title h3{margin:0 0 10px}main #page-container #home-page #news .articles-displayer article .subtitle{grid-column:1;grid-row:3;font-style:italic;font-size:15px}main #page-container #home-page #news .articles-displayer article .body{grid-column:1;grid-row:4;min-height:200px;padding-bottom:40px;text-align:justify}main #page-container #home-page #news .articles-displayer article .image-carousel{grid-row:1/span 4;grid-column:2}main #page-container #home-page #news .articles-displayer article .image-carousel img{max-height:100%}main #page-container #home-page #news .articles-displayer article.article-placeholder{padding:0}main #page-container #home-page #news .articles-displayer article.article-placeholder *{background-color:#d4d9dd}main #page-container #home-page #news .articles-displayer article.article-placeholder .date{height:10px}main #page-container #home-page #news .articles-displayer article.article-placeholder .title{height:40px}main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle{height:30px}@media screen and (max-width: 900px){main #page-container #home-page #news .articles-displayer article{gap:5px;padding:0}main #page-container #home-page #news .articles-displayer article.grid-2{grid-template-columns:1fr;grid-template-rows:300px auto auto auto 1fr}main #page-container #home-page #news .articles-displayer article.grid-2 .date{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-2 .title{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle{grid-row:4}main #page-container #home-page #news .articles-displayer article.grid-2 .body{grid-row:5}main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel{grid-row:1;grid-column:1}main #page-container #home-page #news .articles-displayer article.grid-1 .date{grid-row:1}main #page-container #home-page #news .articles-displayer article.grid-1 .title{grid-row:2}main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle{grid-row:3}main #page-container #home-page #news .articles-displayer article.grid-1 .body{grid-row:4}main #page-container #home-page #news .articles-displayer article .date,main #page-container #home-page #news .articles-displayer article .title,main #page-container #home-page #news .articles-displayer article .subtitle{padding:0 10px}main #page-container #home-page #news .articles-displayer article .body{padding:0 10px 30px}}main #page-container #home-page .poles{display:grid;grid-template-columns:1fr 1fr 1fr;gap:30px;padding:100px 0}main #page-container #home-page .poles .theme-card{display:flex;flex-direction:column;width:100%;cursor:pointer;transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{width:100%;height:240px;overflow:hidden;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;position:relative}main #page-container #home-page .poles .theme-card .card-img img{position:absolute;max-width:100%;height:100%;padding:10px}main #page-container #home-page .poles .theme-card .card-title h2{margin:0;text-align:center;padding:10px 20px;color:#4baabb;display:block;background-color:#fff}main #page-container #home-page .poles .theme-card .card-description{flex:1;padding:30px 20px}main #page-container #home-page .poles .theme-card .card-description p{margin:0;color:#4baabb;text-align:center}main #page-container #home-page .poles .theme-card:hover{transform:scale(1.03)}main #page-container #home-page .kuadrado-values{background-image:url("/assets/images/wallpaper_binary_light.png");padding:100px 0 120px}main #page-container #home-page .kuadrado-values *:not(a,blue){color:#d4d9dd}main #page-container #home-page .kuadrado-values h2{display:flex;justify-content:center;align-items:center;flex-direction:row;margin:0 auto 60px;width:120px;height:120px;background-image:url("/assets/images/wallpaper_binary.png");border-radius:100%;color:#72e3f0}main #page-container #home-page .kuadrado-values ul.values-list{display:grid;grid-template-columns:repeat(3, 1fr);gap:30px}main #page-container #home-page .kuadrado-values ul.values-list li{background-image:url("/assets/images/wallpaper_binary.png");padding:30px 20px 40px}main #page-container #home-page .kuadrado-values ul.values-list li h3{text-align:center}main #page-container #home-page .kuadrado-values ul.values-list li p{text-align:justify}main #page-container #home-page #whoami{padding:20px 0 50px}main #page-container #home-page #whoami .page-contents-center{padding:40px;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center h2{text-align:center;background-color:#6b7880;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:220px;height:220px;border-radius:100%;padding:30px;margin:40px 0;color:#72e3f0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:grid;grid-template-columns:auto 1fr;gap:30px;padding:50px 0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img{width:150px;height:auto;border-radius:100%}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3{font-size:22px;color:#96a5ae;margin:0}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{font-size:18px}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong,main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4{color:#96a5ae}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p{font-size:18px;font-style:italic;font-family:serif;color:#555d61}main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue,a){color:#555d61}@media screen and (max-width: 560px){main #page-container #home-page #whoami .page-contents-center .presentation-card .header{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column}main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text{text-align:center}}@media screen and (max-width: 900px){main #page-container #home-page .poles{grid-template-columns:1fr;gap:40px}main #page-container #home-page .poles .theme-card{transition:transform .3s}main #page-container #home-page .poles .theme-card .card-img{height:300px}main #page-container #home-page .poles .theme-card .card-img img{min-width:unset;height:100%}main #page-container #home-page .poles .theme-card .card-title h2{padding:5px 20px}main #page-container #home-page .poles .theme-card .card-description{padding:20px 30px}main #page-container #home-page .poles .theme-card:hover{transform:none}main #page-container #home-page .kuadrado-values ul.values-list{grid-template-columns:1fr}}@media screen and (max-width: 1300px){main #page-container #home-page .poles{padding:20px}main #page-container #home-page .articles-displayer{padding:0}}main #page-container #education-page h3.big{font-size:30px}main #page-container #education-page .title-banner{display:flex;justify-content:flex-end;flex-direction:column;height:20vw;min-height:250px;background-image:url("/assets/images/popularization_banner.png");background-size:cover;background-repeat:no-repeat;background-position:center}main #page-container #education-page .title-banner h2{color:#fff;font-size:2.5em;margin:40px;text-shadow:0 0 6px #0003}main #page-container #education-page .special-announcement{background-color:#ffd000}main #page-container #education-page .special-announcement .page-contents-center{padding:0 20px;display:flex;justify-content:center;align-items:center;flex-direction:row}main #page-container #education-page .special-announcement .page-contents-center p{color:#555d61;font-size:20px;font-weight:600;margin:0;padding:40px 0}main #page-container #education-page .edu-themes{display:grid;grid-template-columns:1fr 1fr;gap:50px;font-family:monospace;padding:70px 0}main #page-container #education-page .edu-themes .edu-theme{display:grid;grid-template-columns:auto 1fr}main #page-container #education-page .edu-themes .edu-theme *{border-style:dashed;border-color:lime;border-width:0 0 0 0}main #page-container #education-page .edu-themes .edu-theme h3{color:lime;grid-row:1;margin:0;padding:10px;display:flex;align-items:center;border-width:0 0 0 1px}main #page-container #education-page .edu-themes .edu-theme img{width:100%;grid-row:1/span 2;border-width:1px 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme p{text-align:justify;color:#72e3f0;grid-row:2;margin:0;padding:10px 30px 0 10px;border-width:1px 1px 1px 0}main #page-container #education-page .edu-themes .edu-theme p *{color:#72e3f0}main #page-container #education-page .practical-info{padding:50px 0}main #page-container #education-page .practical-info .page-contents-center{display:grid;grid-template-columns:1fr 1fr;gap:50px}main #page-container #education-page .practical-info .page-contents-center .info-block{display:grid;grid-template-rows:auto 1fr}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{color:#4baabb;margin:0;border-bottom:1px dashed #aabbc8;border-left:1px dashed #aabbc8;padding:10px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{margin:0;padding:20px 10px;border-right:1px dashed #aabbc8;border-bottom:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block ul{display:flex;flex-direction:column;gap:5px}main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth){display:grid;grid-template-columns:1fr 1fr;gap:10px}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span{padding:3px 0}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child{font-weight:bold;color:#6b7880}main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child{color:#4baabb}@media screen and (max-width: 1200px){main #page-container #education-page .edu-themes{grid-template-columns:1fr;gap:30px;padding:70px 0}}@media screen and (max-width: 780px){main #page-container #education-page .practical-info .page-contents-center{grid-template-columns:1fr;gap:30px}main #page-container #education-page .practical-info .page-contents-center .info-block .info-title{border-top:1px dashed #aabbc8}main #page-container #education-page .practical-info .page-contents-center .info-block .info-body{border-bottom:none}}@media screen and (max-width: 560px){main #page-container #education-page .edu-themes .edu-theme h3{border-width:0 0 1px 1px}main #page-container #education-page .edu-themes .edu-theme img{max-width:150px;height:auto;grid-row:1;border-width:1px 0 0 1px}main #page-container #education-page .edu-themes .edu-theme p{grid-row:2;grid-column:1/span 2;padding:20px 10px 30px 10px;border-width:0 1px 1px 1px}}main #page-container #games-page .game-articles article{display:grid;grid-template-columns:.7fr 1fr;gap:30px 50px;margin:20px 0}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(7, auto);width:100%}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1/span 2;margin:0;padding:30px 20px;color:#aabbc8;font-size:35px;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1/span 2;display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;background-color:#000;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-banner img{height:500px}main #page-container #games-page .game-articles article.game-article .game-tags{display:flex;gap:10px;flex-wrap:wrap;margin:10px 20px}main #page-container #games-page .game-articles article.game-article .game-tags span{font-size:12px;padding:4px;background-color:#d4d9dd;color:#6b7880;border-radius:5px;font-weight:600}main #page-container #games-page .game-articles article.game-article .game-subtitle{grid-column:1;margin:10px 20px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-description{grid-column:1;text-align:justify;margin:10px 20px 30px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:2;grid-row:3/span 4;height:100%}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team h2{color:#6b7880;padding:10px 20px;font-style:italic;font-size:20px;margin:0}main #page-container #games-page .game-articles article.game-article .game-team .team-members{display:flex;flex-direction:column}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{display:grid;grid-template-columns:80px 1fr;grid-template-rows:auto auto 1fr;margin:10px}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 3;overflow:hidden}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img{width:100%;padding:0 10px 0 0}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title{margin:0 0 5px;color:#6b7880}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle{margin:0 10px;font-size:14px;color:#96a5ae;font-style:italic}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{margin:10px 10px 20px 20px;text-align:justify}main #page-container #games-page .game-articles article.placeholder{height:400px}main #page-container #games-page .game-articles article.placeholder *{background-color:#d4d9dd}@media screen and (max-width: 900px){main #page-container #games-page .game-articles article{grid-template-columns:1fr}main #page-container #games-page .game-articles article.game-article{grid-template-rows:repeat(6, auto)}main #page-container #games-page .game-articles article.game-article .game-title{grid-column:1;padding:0;font-size:25px}main #page-container #games-page .game-articles article.game-article .game-banner{grid-column:1;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .image-carousel{grid-column:1;grid-row:3;height:400px;margin:0 -20px}main #page-container #games-page .game-articles article.game-article .game-team{grid-column:1}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member{grid-template-columns:70px 1fr}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img{grid-row:1/span 2}main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body{grid-column:1/span 2}}main #page-container #software-page .software-articles{margin:20px auto 50px}main #page-container #software-page .software-articles article.software-article{display:grid;grid-template-columns:1fr .7fr;margin:0 0 30px;gap:10px 30px}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1/span 2;color:#aabbc8;margin:0;padding:10px}main #page-container #software-page .software-articles article.software-article .software-date{margin:0;color:#96a5ae;font-style:italic;text-align:right;color:#6b7880;font-style:italic;font-size:12px}main #page-container #software-page .software-articles article.software-article .software-subtitle{grid-column:1;margin:10px;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-description{grid-column:1;text-align:justify;margin:10px}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:2;grid-row:2/span 6;min-height:250px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}main #page-container #software-page .software-articles article.software-article .software-technical h2{color:#6b7880;margin:0 10px;padding:10px 0 0;font-size:16px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul{display:flex;flex-wrap:wrap;gap:10px}main #page-container #software-page .software-articles article.software-article .software-technical ul.releases{margin:10px}main #page-container #software-page .software-articles article.software-article .software-technical .detail{display:grid;grid-template-columns:1fr auto;font-size:12px;border-bottom:1px solid #d4d9dd;padding:5px 0}main #page-container #software-page .software-articles article.software-article .software-technical .detail label{font-weight:bold;color:#6b7880}main #page-container #software-page .software-articles article.software-article .software-technical .detail .label{color:#aabbc8}main #page-container #software-page .software-articles article.software-article .software-technical .detail ul{display:flex;flex-wrap:wrap;gap:10px}@media screen and (max-width: 900px){main #page-container #software-page .software-articles article.software-article{grid-template-columns:1fr}main #page-container #software-page .software-articles article.software-article .software-title{grid-column:1}main #page-container #software-page .software-articles article.software-article .image-carousel{grid-column:1;grid-row:2;height:200px}main #page-container #software-page .software-articles article.software-article .software-technical{grid-column:1}}main #page-container #software-page .software-articles article.placeholder{display:flex;flex-direction:column;gap:10px;margin:30px}main #page-container #software-page .software-articles article.placeholder *{background-color:#d4d9dd}main #page-container #software-page .software-articles article.placeholder .title{height:60px}main #page-container #software-page .software-articles article.placeholder .body{height:400px}main #page-container #software-page .software-articles article.placeholder .details{height:200px}main footer{display:flex;justify-content:center;align-items:center;flex-direction:row;flex-direction:column;width:100%;background-image:url("/assets/images/wallpaper_binary.png");padding:40px 20px;gap:20px;font-size:12px}main footer span{color:#96a5ae;text-align:center}main footer .logo{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:10px}main footer .logo img{width:35px}main footer .logo img.text-logo{width:100px}main footer .social{display:flex;justify-content:center;align-items:center;flex-direction:row;gap:20px}main footer .social a{background-color:#555d61;display:flex;justify-content:center;align-items:center;flex-direction:row;width:25px;height:25px;font-weight:bold;font-size:16px;border-radius:100%}/*# sourceMappingURL=style.css.map */
+body {
+  font-family: Arial, Helvetica, sans-serif;
+  margin: 0;
+}
+body * {
+  box-sizing: border-box;
+  color: #35393c;
+  line-height: 1.3em;
+}
+body ul {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+body a {
+  color: #4baabb;
+  text-decoration: none;
+}
+body a:hover {
+  color: #72e3f0;
+}
+body blue {
+  color: #4baabb;
+}
+body red {
+  color: #9c3030;
+}
+body green {
+  color: #368736;
+}
+body emoji {
+  font-style: initial;
+  font-size: 25px;
+}
+body .bg-blue {
+  background-color: #4baabb;
+  color: white;
+}
+body .bg-dark {
+  background-color: #3c4144;
+  color: #aabbc8;
+}
+body #seo-title {
+  visibility: hidden;
+}
+body img.pixelated {
+  image-rendering: pixelated;
+  image-rendering: -moz-crisp-edges;
+  image-rendering: crisp-edges;
+}
+
+main {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  min-height: 100vh;
+}
+main .warning-banner {
+  background: url("/assets/images/wallpaper_warning.svg");
+  width: 100%;
+  height: 40px;
+  padding: 20px 10%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
+main .warning-banner strong {
+  font-size: 18px;
+  color: #1c3db2;
+}
+main .image-carousel {
+  overflow: hidden;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  background-color: black;
+  position: relative;
+}
+main .image-carousel img {
+  position: absolute;
+  max-width: 100%;
+  max-height: 400px;
+}
+main .image-carousel .carousel-bullets {
+  position: absolute;
+  bottom: 0;
+  padding: 20px;
+  display: flex;
+  gap: 10px;
+}
+main .image-carousel .carousel-bullets .bullet {
+  cursor: pointer;
+  width: 8px;
+  height: 8px;
+  background-color: #6b7880;
+  border-radius: 100%;
+  box-shadow: 0 0 3px black;
+}
+main .image-carousel .carousel-bullets .bullet.active {
+  background-color: #d4d9dd;
+}
+@media screen and (max-width: 900px) {
+  main .image-carousel img {
+    max-height: 100%;
+  }
+  main .image-carousel .carousel-bullets {
+    gap: 30px;
+  }
+  main .image-carousel .carousel-bullets .bullet {
+    width: 12px;
+    height: 12px;
+  }
+}
+main header {
+  width: 100%;
+  background-color: white;
+  position: sticky;
+  position: -webkit-sticky;
+  top: 0;
+  z-index: 10;
+}
+main header nav {
+  display: flex;
+  align-items: center;
+  height: 60px;
+}
+main header nav .home {
+  margin: 0 10px;
+}
+main header nav .home a {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+main header nav .home a img {
+  height: 40px;
+  width: auto;
+}
+main header nav .home a img.logo-text {
+  width: 120px;
+  height: auto;
+}
+main header nav ul {
+  display: flex;
+  padding: 0;
+  margin: 0;
+  list-style-type: none;
+  height: 100%;
+}
+main header nav ul li {
+  position: relative;
+}
+main header nav ul li a {
+  display: flex;
+  align-items: center;
+  height: 100%;
+  padding: 10px 20px;
+  color: #96a5ae;
+  font-weight: 800;
+  text-decoration: none;
+}
+main header nav ul li .submenu {
+  visibility: hidden;
+  overflow: hidden;
+  position: absolute;
+  height: auto;
+  max-height: 0;
+  transition: max-height 0.6s;
+  top: 100%;
+  left: 50%;
+  flex-direction: column;
+  background-color: white;
+  white-space: nowrap;
+}
+main header nav ul li.active a {
+  color: #3c4144;
+  border-bottom: 3px solid;
+}
+main header nav ul li:hover a {
+  color: #3c4144;
+}
+main header nav ul li:hover .submenu {
+  visibility: unset;
+  max-height: 1000px;
+}
+main header nav ul li:hover .submenu a {
+  color: #96a5ae;
+  border: none;
+}
+main header nav ul li:hover .submenu li:hover a {
+  color: #3c4144;
+}
+main header nav .burger {
+  display: none;
+}
+@media screen and (max-width: 560px) {
+  main header nav {
+    justify-content: space-between;
+  }
+  main header nav .burger {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-direction: row;
+    flex-direction: column;
+    font-weight: bold;
+    border: 1px solid;
+    margin: 0 20px;
+    cursor: pointer;
+    border-radius: 100%;
+    width: 35px;
+    height: 35px;
+    color: #555d61;
+    font-size: 25px;
+  }
+  main header nav ul {
+    display: none;
+  }
+  main header nav ul.responsive-show {
+    display: flex;
+    flex-direction: column;
+    position: absolute;
+    right: 0;
+    max-width: 100vw;
+    min-width: 50vw;
+    top: 60px;
+    background-color: white;
+    box-shadow: 0 4px 6px 2px #0000000a;
+    height: unset;
+  }
+  main header nav ul.responsive-show li.active a {
+    border: none;
+  }
+  main header nav ul.responsive-show li .submenu {
+    display: flex;
+    visibility: visible;
+    position: relative;
+    height: unset;
+    max-height: unset;
+    transition: max-height 0.6s;
+    top: unset;
+    left: unset;
+    margin-left: 20px;
+  }
+  main header nav ul.responsive-show li .submenu li a {
+    font-weight: 400;
+    font-size: 14px;
+    color: #96a5ae;
+  }
+}
+main #page-container {
+  width: 100%;
+  flex: 1;
+}
+main #page-container .page-header {
+  background-image: url("/assets/images/wallpaper_binary.png");
+  padding: 50px 0;
+}
+main #page-container .page-header h1 {
+  padding: 15px 40px 0;
+  font-size: 25px;
+  color: #4baabb;
+  margin: 0 auto;
+}
+main #page-container .page-header p {
+  color: #72e3f0;
+  font-style: italic;
+  padding: 15px 40px 15px 100px;
+  margin: 0 auto;
+  font-size: 18px;
+}
+main #page-container .page-header p * {
+  color: #72e3f0;
+}
+main #page-container .page-header .big-logo {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  gap: 20px;
+  padding: 20px;
+}
+main #page-container .page-header .big-logo img {
+  width: 200px;
+  max-width: 100%;
+}
+main #page-container .page-header .big-logo img.logo-text {
+  width: 300px;
+  max-width: 100%;
+}
+main #page-container .page-header .logo {
+  padding-left: 30px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
+main #page-container .page-header .logo img {
+  width: 100%;
+}
+@media screen and (max-width: 560px) {
+  main #page-container .page-header h1 {
+    padding: 15px 20px 0;
+  }
+  main #page-container .page-header p {
+    padding: 20px 20px 30px 40px;
+    text-align: justify;
+  }
+  main #page-container .page-header .big-logo {
+    flex-direction: column;
+  }
+}
+main #page-container .page-header.logo-left .grid-wrapper {
+  display: grid;
+  grid-template-columns: 120px 1fr;
+  grid-template-rows: auto 1fr;
+}
+main #page-container .page-header.logo-left .grid-wrapper h1 {
+  width: 100%;
+}
+main #page-container .page-header.logo-left .grid-wrapper .logo {
+  grid-column: 1;
+  grid-row: 1;
+  width: 100%;
+}
+main #page-container .page-header.logo-left .grid-wrapper p {
+  margin: 0;
+  grid-column: 1/span 2;
+}
+@media screen and (max-width: 780px) {
+  main #page-container .page-header.logo-left .grid-wrapper h1 {
+    padding: 0 20px;
+  }
+  main #page-container .page-header.logo-left .grid-wrapper .logo {
+    padding: 0 20px;
+  }
+}
+main #page-container .page-philo {
+  background-image: url("/assets/images/wallpaper_binary.png");
+  padding: 120px 30px;
+}
+main #page-container .page-philo p {
+  width: 100%;
+  max-width: 600px;
+  font-size: 18px;
+  color: #aabbc8;
+  text-align: center;
+  font-style: italic;
+  font-weight: bold;
+}
+main #page-container .page-philo p * {
+  color: #aabbc8;
+}
+main #page-container .page-contents-center {
+  width: 1300px;
+  max-width: 100%;
+  margin: 0 auto;
+}
+@media screen and (max-width: 1300px) {
+  main #page-container .page-contents-center {
+    padding: 20px 20px 0;
+  }
+}
+main #page-container h2.page-section-title {
+  color: #4baabb;
+  padding: 20px 0 10px;
+  width: 1300px;
+  max-width: 100%;
+  margin: 0 auto;
+}
+@media screen and (max-width: 1300px) {
+  main #page-container h2.page-section-title {
+    padding: 20px 20px 0;
+  }
+}
+main #page-container #home-page {
+  display: flex;
+  flex-direction: column;
+}
+main #page-container #home-page .section-title {
+  padding: 10px;
+  margin: 0;
+  color: #aabbc8;
+}
+main #page-container #home-page .page-header .philo-bubbles {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-wrap: wrap;
+  gap: 40px;
+  margin: 30px 20px;
+}
+@media screen and (max-width: 780px) {
+  main #page-container #home-page .page-header .philo-bubbles {
+    gap: 20px;
+  }
+}
+main #page-container #home-page .page-header .philo-bubbles li {
+  border-radius: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  background-color: #d4d9dd;
+  width: 100px;
+  height: 100px;
+}
+main #page-container #home-page .page-header .philo-bubbles li * {
+  color: #6b7880;
+}
+@media screen and (max-width: 560px) {
+  main #page-container #home-page .page-header .philo-bubbles li {
+    width: 75px;
+    height: 75px;
+  }
+  main #page-container #home-page .page-header .philo-bubbles li * {
+    font-size: 12px;
+  }
+}
+main #page-container #home-page .page-header .philo-bubbles li:first-child {
+  background-color: #6b7880;
+}
+main #page-container #home-page .page-header .philo-bubbles li:first-child * {
+  color: white;
+}
+main #page-container #home-page .page-header .philo-bubbles li:last-child {
+  background-color: #35393c;
+}
+main #page-container #home-page .page-header .philo-bubbles li:last-child * {
+  color: #96a5ae;
+}
+main #page-container #home-page #news {
+  padding: 60px 20px;
+}
+main #page-container #home-page #news .articles-displayer {
+  margin: 0 auto 40px;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons {
+  display: flex;
+  justify-content: space-between;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn,
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn {
+  border: none;
+  background: none;
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  padding: 5px 0;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.disabled,
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.disabled {
+  visibility: hidden;
+  pointer-events: none;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active,
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active {
+  cursor: pointer;
+  color: #6b7880;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active:hover,
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active:hover {
+  color: #3c4144;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .next-btn.active::after {
+  content: " ";
+  border-style: solid;
+  border-width: 2px 2px 0 0;
+  width: 8px;
+  height: 8px;
+  transform: rotate(45deg);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
+main #page-container #home-page #news .articles-displayer .prev-next-buttons .prev-btn.active::before {
+  content: " ";
+  border-style: solid;
+  border-width: 2px 2px 0 0;
+  width: 8px;
+  height: 8px;
+  transform: rotate(-135deg);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
+main #page-container #home-page #news .articles-displayer article {
+  display: grid;
+  gap: 5px 50px;
+  grid-template-rows: auto auto auto 1fr;
+  position: relative;
+  padding-left: 20px;
+}
+main #page-container #home-page #news .articles-displayer article.grid-1 {
+  grid-template-columns: 1fr;
+}
+main #page-container #home-page #news .articles-displayer article.grid-2 {
+  grid-template-columns: 1fr 1fr;
+}
+main #page-container #home-page #news .articles-displayer article .date {
+  grid-column: 1;
+  grid-row: 1;
+  text-align: right;
+}
+main #page-container #home-page #news .articles-displayer article .date time {
+  color: #6b7880;
+  font-style: italic;
+  font-size: 12px;
+}
+main #page-container #home-page #news .articles-displayer article .title {
+  grid-column: 1;
+  grid-row: 2;
+}
+main #page-container #home-page #news .articles-displayer article .title h3 {
+  margin: 0 0 10px;
+}
+main #page-container #home-page #news .articles-displayer article .subtitle {
+  grid-column: 1;
+  grid-row: 3;
+  font-style: italic;
+  font-size: 15px;
+}
+main #page-container #home-page #news .articles-displayer article .body {
+  grid-column: 1;
+  grid-row: 4;
+  min-height: 200px;
+  padding-bottom: 40px;
+  text-align: justify;
+}
+main #page-container #home-page #news .articles-displayer article .image-carousel {
+  grid-row: 1/span 4;
+  grid-column: 2;
+}
+main #page-container #home-page #news .articles-displayer article .image-carousel img {
+  max-height: 100%;
+}
+main #page-container #home-page #news .articles-displayer article.article-placeholder {
+  padding: 0;
+}
+main #page-container #home-page #news .articles-displayer article.article-placeholder * {
+  background-color: #d4d9dd;
+}
+main #page-container #home-page #news .articles-displayer article.article-placeholder .date {
+  height: 10px;
+}
+main #page-container #home-page #news .articles-displayer article.article-placeholder .title {
+  height: 40px;
+}
+main #page-container #home-page #news .articles-displayer article.article-placeholder .subtitle {
+  height: 30px;
+}
+@media screen and (max-width: 900px) {
+  main #page-container #home-page #news .articles-displayer article {
+    gap: 5px;
+    padding: 0;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 {
+    grid-template-columns: 1fr;
+    grid-template-rows: 300px auto auto auto 1fr;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 .date {
+    grid-row: 2;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 .title {
+    grid-row: 3;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 .subtitle {
+    grid-row: 4;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 .body {
+    grid-row: 5;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-2 .image-carousel {
+    grid-row: 1;
+    grid-column: 1;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-1 .date {
+    grid-row: 1;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-1 .title {
+    grid-row: 2;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-1 .subtitle {
+    grid-row: 3;
+  }
+  main #page-container #home-page #news .articles-displayer article.grid-1 .body {
+    grid-row: 4;
+  }
+  main #page-container #home-page #news .articles-displayer article .date,
+main #page-container #home-page #news .articles-displayer article .title,
+main #page-container #home-page #news .articles-displayer article .subtitle {
+    padding: 0 10px;
+  }
+  main #page-container #home-page #news .articles-displayer article .body {
+    padding: 0 10px 30px;
+  }
+}
+main #page-container #home-page .poles {
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+  gap: 30px;
+  padding: 100px 0;
+}
+main #page-container #home-page .poles .theme-card {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  cursor: pointer;
+  transition: transform 0.3s;
+}
+main #page-container #home-page .poles .theme-card .card-img {
+  width: 100%;
+  height: 240px;
+  overflow: hidden;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+  position: relative;
+}
+main #page-container #home-page .poles .theme-card .card-img img {
+  position: absolute;
+  max-width: 100%;
+  height: 100%;
+  padding: 10px;
+}
+main #page-container #home-page .poles .theme-card .card-title h2 {
+  margin: 0;
+  text-align: center;
+  padding: 10px 20px;
+  color: #4baabb;
+  display: block;
+  background-color: white;
+}
+main #page-container #home-page .poles .theme-card .card-description {
+  flex: 1;
+  padding: 30px 20px;
+}
+main #page-container #home-page .poles .theme-card .card-description p {
+  margin: 0;
+  color: #4baabb;
+  text-align: center;
+}
+main #page-container #home-page .poles .theme-card:hover {
+  transform: scale(1.03);
+}
+main #page-container #home-page .kuadrado-values {
+  background-image: url("/assets/images/wallpaper_binary_light.png");
+  padding: 100px 0 120px;
+}
+main #page-container #home-page .kuadrado-values *:not(a, blue) {
+  color: #d4d9dd;
+}
+main #page-container #home-page .kuadrado-values h2 {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  margin: 0 auto 60px;
+  width: 120px;
+  height: 120px;
+  background-image: url("/assets/images/wallpaper_binary.png");
+  border-radius: 100%;
+  color: #72e3f0;
+}
+main #page-container #home-page .kuadrado-values ul.values-list {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  gap: 30px;
+}
+main #page-container #home-page .kuadrado-values ul.values-list li {
+  background-image: url("/assets/images/wallpaper_binary.png");
+  padding: 30px 20px 40px;
+}
+main #page-container #home-page .kuadrado-values ul.values-list li h3 {
+  text-align: center;
+}
+main #page-container #home-page .kuadrado-values ul.values-list li p {
+  text-align: justify;
+}
+main #page-container #home-page #whoami {
+  padding: 20px 0 50px;
+}
+main #page-container #home-page #whoami .page-contents-center {
+  padding: 40px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+}
+main #page-container #home-page #whoami .page-contents-center h2 {
+  text-align: center;
+  background-color: #6b7880;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+  width: 220px;
+  height: 220px;
+  border-radius: 100%;
+  padding: 30px;
+  margin: 40px 0;
+  color: #72e3f0;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header {
+  display: grid;
+  grid-template-columns: auto 1fr;
+  gap: 30px;
+  padding: 50px 0;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .pic img {
+  width: 150px;
+  height: auto;
+  border-radius: 100%;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h3 {
+  font-size: 22px;
+  color: #96a5ae;
+  margin: 0;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 {
+  font-size: 18px;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text strong,
+main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text h4 {
+  color: #96a5ae;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .body p {
+  font-size: 18px;
+  font-style: italic;
+  font-family: serif;
+  color: #555d61;
+}
+main #page-container #home-page #whoami .page-contents-center .presentation-card .body p *:not(blue, a) {
+  color: #555d61;
+}
+@media screen and (max-width: 560px) {
+  main #page-container #home-page #whoami .page-contents-center .presentation-card .header {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-direction: row;
+    flex-direction: column;
+  }
+  main #page-container #home-page #whoami .page-contents-center .presentation-card .header .header-text {
+    text-align: center;
+  }
+}
+@media screen and (max-width: 900px) {
+  main #page-container #home-page .poles {
+    grid-template-columns: 1fr;
+    gap: 40px;
+  }
+  main #page-container #home-page .poles .theme-card {
+    transition: transform 0.3s;
+  }
+  main #page-container #home-page .poles .theme-card .card-img {
+    height: 300px;
+  }
+  main #page-container #home-page .poles .theme-card .card-img img {
+    min-width: unset;
+    height: 100%;
+  }
+  main #page-container #home-page .poles .theme-card .card-title h2 {
+    padding: 5px 20px;
+  }
+  main #page-container #home-page .poles .theme-card .card-description {
+    padding: 20px 30px;
+  }
+  main #page-container #home-page .poles .theme-card:hover {
+    transform: none;
+  }
+  main #page-container #home-page .kuadrado-values ul.values-list {
+    grid-template-columns: 1fr;
+  }
+}
+@media screen and (max-width: 1300px) {
+  main #page-container #home-page .poles {
+    padding: 20px;
+  }
+  main #page-container #home-page .articles-displayer {
+    padding: 0;
+  }
+}
+main #page-container #education-page h3.big {
+  font-size: 30px;
+}
+main #page-container #education-page .title-banner {
+  display: flex;
+  justify-content: flex-end;
+  flex-direction: column;
+  height: 20vw;
+  min-height: 250px;
+  background-image: url("/assets/images/popularization_banner.png");
+  background-size: cover;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+main #page-container #education-page .title-banner h2 {
+  color: white;
+  font-size: 2.5em;
+  margin: 40px;
+  text-shadow: 0 0 6px #0003;
+}
+main #page-container #education-page .special-announcement {
+  background-color: #ffd000;
+}
+main #page-container #education-page .special-announcement .page-contents-center {
+  padding: 0 20px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
+main #page-container #education-page .special-announcement .page-contents-center p {
+  color: #555d61;
+  font-size: 20px;
+  font-weight: 600;
+  margin: 0;
+  padding: 40px 0;
+}
+main #page-container #education-page .edu-themes {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 50px;
+  font-family: monospace;
+  padding: 70px 0;
+}
+main #page-container #education-page .edu-themes .edu-theme {
+  display: grid;
+  grid-template-columns: auto 1fr;
+}
+main #page-container #education-page .edu-themes .edu-theme * {
+  border-style: dashed;
+  border-color: #00ff00;
+  border-width: 0 0 0 0;
+}
+main #page-container #education-page .edu-themes .edu-theme h3 {
+  color: #00ff00;
+  grid-row: 1;
+  margin: 0;
+  padding: 10px;
+  display: flex;
+  align-items: center;
+  border-width: 0 0 0 1px;
+}
+main #page-container #education-page .edu-themes .edu-theme img {
+  width: 100%;
+  grid-row: 1/span 2;
+  border-width: 1px 0 1px 1px;
+}
+main #page-container #education-page .edu-themes .edu-theme p {
+  text-align: justify;
+  color: #72e3f0;
+  grid-row: 2;
+  margin: 0;
+  padding: 10px 30px 0 10px;
+  border-width: 1px 1px 1px 0;
+}
+main #page-container #education-page .edu-themes .edu-theme p * {
+  color: #72e3f0;
+}
+main #page-container #education-page .practical-info {
+  padding: 50px 0;
+}
+main #page-container #education-page .practical-info .page-contents-center {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 50px;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block {
+  display: grid;
+  grid-template-rows: auto 1fr;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block .info-title {
+  color: #4baabb;
+  margin: 0;
+  border-bottom: 1px dashed #aabbc8;
+  border-left: 1px dashed #aabbc8;
+  padding: 10px;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block .info-body {
+  margin: 0;
+  padding: 20px 10px;
+  border-right: 1px dashed #aabbc8;
+  border-bottom: 1px dashed #aabbc8;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block ul {
+  display: flex;
+  flex-direction: column;
+  gap: 5px;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block ul li:not(.fullwidth) {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 10px;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span {
+  padding: 3px 0;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:first-child {
+  font-weight: bold;
+  color: #6b7880;
+}
+main #page-container #education-page .practical-info .page-contents-center .info-block ul.tabled li span:last-child {
+  color: #4baabb;
+}
+@media screen and (max-width: 1200px) {
+  main #page-container #education-page .edu-themes {
+    grid-template-columns: 1fr;
+    gap: 30px;
+    padding: 70px 0;
+  }
+}
+@media screen and (max-width: 780px) {
+  main #page-container #education-page .practical-info .page-contents-center {
+    grid-template-columns: 1fr;
+    gap: 30px;
+  }
+  main #page-container #education-page .practical-info .page-contents-center .info-block .info-title {
+    border-top: 1px dashed #aabbc8;
+  }
+  main #page-container #education-page .practical-info .page-contents-center .info-block .info-body {
+    border-bottom: none;
+  }
+}
+@media screen and (max-width: 560px) {
+  main #page-container #education-page .edu-themes .edu-theme h3 {
+    border-width: 0 0 1px 1px;
+  }
+  main #page-container #education-page .edu-themes .edu-theme img {
+    max-width: 150px;
+    height: auto;
+    grid-row: 1;
+    border-width: 1px 0 0 1px;
+  }
+  main #page-container #education-page .edu-themes .edu-theme p {
+    grid-row: 2;
+    grid-column: 1/span 2;
+    padding: 20px 10px 30px 10px;
+    border-width: 0 1px 1px 1px;
+  }
+}
+main #page-container #games-page .game-articles article {
+  display: grid;
+  grid-template-columns: 0.7fr 1fr;
+  gap: 30px 50px;
+  margin: 20px 0;
+}
+main #page-container #games-page .game-articles article.game-article {
+  grid-template-rows: repeat(7, auto);
+  width: 100%;
+}
+main #page-container #games-page .game-articles article.game-article .game-title {
+  grid-column: 1/span 2;
+  margin: 0;
+  padding: 30px 20px;
+  color: #aabbc8;
+  font-size: 35px;
+  font-style: italic;
+}
+main #page-container #games-page .game-articles article.game-article .game-banner {
+  grid-column: 1/span 2;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+  background-color: black;
+  overflow: hidden;
+}
+main #page-container #games-page .game-articles article.game-article .game-banner img {
+  height: 500px;
+}
+main #page-container #games-page .game-articles article.game-article .game-tags {
+  display: flex;
+  gap: 10px;
+  flex-wrap: wrap;
+  margin: 10px 20px;
+}
+main #page-container #games-page .game-articles article.game-article .game-tags span {
+  font-size: 12px;
+  padding: 4px;
+  background-color: #d4d9dd;
+  color: #6b7880;
+  border-radius: 5px;
+  font-weight: 600;
+}
+main #page-container #games-page .game-articles article.game-article .game-subtitle {
+  grid-column: 1;
+  margin: 10px 20px;
+  color: #6b7880;
+}
+main #page-container #games-page .game-articles article.game-article .game-description {
+  grid-column: 1;
+  text-align: justify;
+  margin: 10px 20px 30px;
+}
+main #page-container #games-page .game-articles article.game-article .image-carousel {
+  grid-column: 2;
+  grid-row: 3/span 4;
+  height: 100%;
+}
+main #page-container #games-page .game-articles article.game-article .game-team {
+  grid-column: 1/span 2;
+}
+main #page-container #games-page .game-articles article.game-article .game-team h2 {
+  color: #6b7880;
+  padding: 10px 20px;
+  font-style: italic;
+  font-size: 20px;
+  margin: 0;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members {
+  display: flex;
+  flex-direction: column;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member {
+  display: grid;
+  grid-template-columns: 80px 1fr;
+  grid-template-rows: auto auto 1fr;
+  margin: 10px;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img {
+  grid-row: 1/span 3;
+  overflow: hidden;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img img {
+  width: 100%;
+  padding: 0 10px 0 0;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-title {
+  margin: 0 0 5px;
+  color: #6b7880;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-subtitle {
+  margin: 0 10px;
+  font-size: 14px;
+  color: #96a5ae;
+  font-style: italic;
+}
+main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body {
+  margin: 10px 10px 20px 20px;
+  text-align: justify;
+}
+main #page-container #games-page .game-articles article.placeholder {
+  height: 400px;
+}
+main #page-container #games-page .game-articles article.placeholder * {
+  background-color: #d4d9dd;
+}
+@media screen and (max-width: 900px) {
+  main #page-container #games-page .game-articles article {
+    grid-template-columns: 1fr;
+  }
+  main #page-container #games-page .game-articles article.game-article {
+    grid-template-rows: repeat(6, auto);
+  }
+  main #page-container #games-page .game-articles article.game-article .game-title {
+    grid-column: 1;
+    padding: 0;
+    font-size: 25px;
+  }
+  main #page-container #games-page .game-articles article.game-article .game-banner {
+    grid-column: 1;
+    margin: 0 -20px;
+  }
+  main #page-container #games-page .game-articles article.game-article .image-carousel {
+    grid-column: 1;
+    grid-row: 3;
+    height: 400px;
+    margin: 0 -20px;
+  }
+  main #page-container #games-page .game-articles article.game-article .game-team {
+    grid-column: 1;
+  }
+  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member {
+    grid-template-columns: 70px 1fr;
+  }
+  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-img {
+    grid-row: 1/span 2;
+  }
+  main #page-container #games-page .game-articles article.game-article .game-team .team-members .team-member .team-member-body {
+    grid-column: 1/span 2;
+  }
+}
+main #page-container #software-page .software-articles {
+  margin: 20px auto 50px;
+}
+main #page-container #software-page .software-articles article.software-article {
+  display: grid;
+  grid-template-columns: auto 1fr;
+  margin: 0 0 50px;
+  gap: 10px 30px;
+}
+main #page-container #software-page .software-articles article.software-article .software-title {
+  grid-column: 2;
+  color: #aabbc8;
+  margin: 0;
+  padding: 10px;
+}
+main #page-container #software-page .software-articles article.software-article .software-subtitle {
+  grid-column: 2;
+  margin: 10px;
+  color: #6b7880;
+}
+main #page-container #software-page .software-articles article.software-article .software-description {
+  grid-column: 2;
+  text-align: justify;
+  margin: 10px;
+}
+main #page-container #software-page .software-articles article.software-article .software-image {
+  padding: 20px;
+  background-color: black;
+  grid-column: 1;
+  grid-row: 1/span 3;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  width: 200px;
+  height: 200px;
+  overflow: hidden;
+  border-radius: 100%;
+}
+main #page-container #software-page .software-articles article.software-article .software-image img {
+  max-width: 100%;
+  max-height: 400px;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical {
+  grid-column: 1/span 2;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical h2 {
+  color: #6b7880;
+  margin: 0 10px;
+  padding: 10px 0 0;
+  font-size: 16px;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details {
+  margin: 10px;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail {
+  display: grid;
+  grid-template-columns: 1fr auto;
+  font-size: 12px;
+  border-bottom: 1px solid #d4d9dd;
+  padding: 5px 0;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail label {
+  font-weight: bold;
+  color: #6b7880;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical ul.technical-details .detail ul {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical ul.releases {
+  margin: 10px;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical .detail {
+  display: grid;
+  grid-template-columns: 1fr auto;
+  font-size: 12px;
+  border-bottom: 1px solid #d4d9dd;
+  padding: 5px 0;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical .detail label {
+  font-weight: bold;
+  color: #6b7880;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical .detail .label {
+  color: #aabbc8;
+}
+main #page-container #software-page .software-articles article.software-article .software-technical .detail ul {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+@media screen and (max-width: 900px) {
+  main #page-container #software-page .software-articles article.software-article .software-title {
+    display: flex;
+    align-items: center;
+  }
+  main #page-container #software-page .software-articles article.software-article .software-subtitle,
+main #page-container #software-page .software-articles article.software-article .software-description {
+    grid-column: 1/span 2;
+  }
+  main #page-container #software-page .software-articles article.software-article .software-image {
+    width: 100px;
+    height: 100px;
+    grid-row: 1;
+  }
+}
+main #page-container #software-page .software-articles article.placeholder {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  margin: 30px;
+}
+main #page-container #software-page .software-articles article.placeholder * {
+  background-color: #d4d9dd;
+}
+main #page-container #software-page .software-articles article.placeholder .title {
+  height: 60px;
+}
+main #page-container #software-page .software-articles article.placeholder .body {
+  height: 400px;
+}
+main #page-container #software-page .software-articles article.placeholder .details {
+  height: 200px;
+}
+main footer {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  flex-direction: column;
+  width: 100%;
+  background-image: url("/assets/images/wallpaper_binary.png");
+  padding: 40px 20px;
+  gap: 20px;
+  font-size: 12px;
+}
+main footer span {
+  color: #96a5ae;
+  text-align: center;
+}
+main footer .logo {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  gap: 10px;
+}
+main footer .logo img {
+  width: 35px;
+}
+main footer .logo img.text-logo {
+  width: 100px;
+}
+main footer .social {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  gap: 20px;
+}
+main footer .social a {
+  background-color: #555d61;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+  width: 25px;
+  height: 25px;
+  font-weight: bold;
+  font-size: 16px;
+  border-radius: 100%;
+}
+
+/*# sourceMappingURL=style.css.map */
diff --git a/src/lib/article-utils.js b/src/lib/article-utils.js
index 3a7d83f..2d182ca 100644
--- a/src/lib/article-utils.js
+++ b/src/lib/article-utils.js
@@ -48,7 +48,7 @@ function populateArticles(articles) {
                 return article;
             })
         )
-            .then(completeArticles => resolve(completeArticles.sort((a, b) => a.date - b.date)))
+            .then(completeArticles => resolve(completeArticles.sort((a, b) => b.date - a.date)))
             .catch(e => reject(e));
     });
 }
diff --git a/src/pages/software-development/components/software-articles.js b/src/pages/software-development/components/software-articles.js
index d33ac02..5ef3c6f 100644
--- a/src/pages/software-development/components/software-articles.js
+++ b/src/pages/software-development/components/software-articles.js
@@ -25,10 +25,12 @@ class SoftwareArticle {
                     property: "name",
                 },
                 {
-                    tag: "time",
-                    class: "software-date",
-                    contents: getArticleDate(date),
-                    property: "datePublished",
+                    tag: "div", class: "software-image",
+                    contents: [
+                        {
+                            tag: "img", src: `${path}/images/${images[0]}`
+                        }
+                    ]
                 },
                 {
                     tag: "h3",
@@ -42,7 +44,6 @@ class SoftwareArticle {
                     contents: getArticleBody(body),
                     property: "description",
                 },
-                new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(),
                 {
                     tag: "div",
                     class: "software-technical",
diff --git a/src/pages/software-development/software-development.scss b/src/pages/software-development/software-development.scss
index 87fdc63..c6f6670 100644
--- a/src/pages/software-development/software-development.scss
+++ b/src/pages/software-development/software-development.scss
@@ -3,43 +3,47 @@
         margin: 20px auto 50px;
         article.software-article {
             display: grid;
-            grid-template-columns: 1fr 0.7fr;
-            margin: 0 0 30px;
+            grid-template-columns: auto 1fr;
+            margin: 0 0 50px;
             gap: 10px 30px;
+
             .software-title {
-                grid-column: 1 / span 2;
+                grid-column: 2;
                 color: $light_2;
                 margin: 0;
                 padding: 10px;
             }
-            .software-date {
-                margin: 0;
-                color: $light_1;
-                font-style: italic;
-                text-align: right;
-                color: $medium_grey;
-                font-style: italic;
-                font-size: 12px;
-            }
 
             .software-subtitle {
-                grid-column: 1;
+                grid-column: 2;
                 margin: 10px;
                 color: $medium_grey;
             }
 
             .software-description {
-                grid-column: 1;
+                grid-column: 2;
                 text-align: justify;
                 margin: 10px;
             }
-            .image-carousel {
-                grid-column: 2;
-                grid-row: 2 / span 6;
-                min-height: 250px;
+
+            .software-image {
+                padding: 20px;
+                background-color: black;
+                grid-column: 1;
+                grid-row: 1 / span 3;
+                @include flex-center;
+                width: 200px;
+                height: 200px;
+                overflow: hidden;
+                border-radius: 100%;
+                img {
+                    max-width: 100%;
+                    max-height: 400px;
+                }
             }
+
             .software-technical {
-                grid-column: 1;
+                grid-column: 1 / span 2;
                 h2 {
                     color: $medium_grey;
                     margin: 0 10px;
@@ -91,17 +95,18 @@
                 }
             }
             @media screen and (max-width: $screen_l) {
-                grid-template-columns: 1fr;
                 .software-title {
-                    grid-column: 1;
+                    display: flex;
+                    align-items: center;
                 }
-                .image-carousel {
-                    grid-column: 1;
-                    grid-row: 2;
-                    height: 200px;
+                .software-subtitle,
+                .software-description {
+                    grid-column: 1 / span 2;
                 }
-                .software-technical {
-                    grid-column: 1;
+                .software-image {
+                    width: 100px;
+                    height: 100px;
+                    grid-row: 1;
                 }
             }
         }
-- 
GitLab