From 909d528995d9dfb77e22e5e324eb0935c017abca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Sat, 10 Dec 2022 23:07:50 +0100
Subject: [PATCH] Add main menu with first "demo" entry, clean/improve/fix code

---
 android/gradle.properties        |   4 +-
 assets/menu/demo.png             | Bin 0 -> 12112 bytes
 icons/build_application_icons.sh | 142 ++++++++++++-------------------
 icons/build_game_icons.sh        |  98 ---------------------
 icons/build_icons.sh             |   6 ++
 icons/build_repository_icons.sh  | 127 +++++++++++++++++++++++++++
 icons/menu_demo.svg              |   2 +
 lib/main.dart                    |  92 +++++++++-----------
 lib/provider/data.dart           |   3 +
 lib/screens/demo.dart            |  50 +++++++++++
 lib/screens/home.dart            |  65 ++++++++++++++
 pubspec.lock                     |  15 ++++
 pubspec.yaml                     |   5 +-
 13 files changed, 368 insertions(+), 241 deletions(-)
 create mode 100644 assets/menu/demo.png
 delete mode 100755 icons/build_game_icons.sh
 create mode 100755 icons/build_icons.sh
 create mode 100755 icons/build_repository_icons.sh
 create mode 100644 icons/menu_demo.svg
 create mode 100644 lib/provider/data.dart
 create mode 100644 lib/screens/demo.dart
 create mode 100644 lib/screens/home.dart

diff --git a/android/gradle.properties b/android/gradle.properties
index a910253..a6742fa 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=1.0.16
-app.versionCode=17
+app.versionName=1.0.17
+app.versionCode=18
diff --git a/assets/menu/demo.png b/assets/menu/demo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0285d549c885670d34aa0969a5ba200c113c317a
GIT binary patch
literal 12112
zcmeAS@N?(olHy`uVBq!ia0y~yU^oE6983%h40rea4q#wl;4JWnEM{PkJ_W*zaw{i@
zGcYhnmbgZg1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BgMd=ch}R!F{I+w+qs-u
zM4s+kw|dt^&u5NDI9)_sT|!g>n?FxE@}T8#;1%hEjJ#PzCV@?j5-}Aai*_FClxT9Z
z%@UY8!=YzEN2hWjlcS-GV@TRe%QwE|cW>?9y=vdb_4}*JzrVXTJ?eDa)vJ4F{`y#Z
z|NZZO`)`$&$yxWa$-FyP-!%8QUqhLkC_}*Qw3p4dwq{AyYoCAipHF=M&c^>Waew4j
zocwcsSHa_LzSc%x;u8Xvn_b>toKRZ)_}brAoB#IP|J`BiUpM=|%)zgB>>I@A?d;^>
zt=stF`QAU?KjV*mE(%}dzW!hN=ce+ow}wx?y5_IHeW!%s(;XY7o&6$-EuAat&on=B
z6fAoDCid3}Wj>{hSM`SdA6YJ*j9*zDJ$2F*7lu>KkBT2ZTCV8U=M|)4vu^f*uP*kV
zCWv(2VPO5_uOzrCeZ?=6mAe?ZSk)BVrpvFgy?A@a2Lr*PttqZg+r0z%G@I)M1y|Lt
zQ7T^@)}Ry?<C#C>kHdx;-*z~(FesF9Jt;E%)O6qRg5vqBE*$o2_Xn|F3#(<gD*U*u
ziupWiPsg7pf4L`!{M#G5Kx<ug<iwo^b_VpZd1{>ReeAIPky6XWmDOJ7%9%oBN*bb1
zK0k7$<Ij^$#aoY0t$Hl!+EKScL~4O^AWxE#iw9TX#dGCMR}@NuE?V-OW7Obs)9^~3
z6d?Kj(~mbt%W5Z7Rys-g9}1`lbW-=Y>@nffixh3a#a`?l&g^UoQf)k+7Pn-a7pN`B
zbmP)9<e7Nk@T1M1EeT%~pHJ-!e9F{v!b7p-3lGaxjS9|%%F{l2R0v)9uxHZoAeT}P
z0Y&~RAC`y-pZokGMOz~&T*IMb#*_{}xitYr335dyJ)ammcFo91Nt<NzM=UAs&i)I*
zEq%_L{S-VRg_;@MBKbdU5mtB>sp-OLv}Vf1qcS~#Arlod0<tF_o)XX))9y6+zv{|j
z#{WtxPq_{6?%yQ0i{r*B`+O7k)jADI4<D*?=(O}bNRo216mM2pXmoF>TiQkUBhQ{%
zI@O#@T=GNQxxK@;B~UExyHeYxUQO4jOahOTRRx6S3770BF6=oX;Op_|&}8{(Gyh+i
zx3h=+&If_Di<w`Sso4nm-*lV2sEa{E-&j-K`;Rv3i3Ce4t;far#Rn|T^zvV{@Y=m%
z`ibyzkHaBL*?A8n?Q|DixFN4x$-=^|a%SSQsn(vY;hX;7XHenhw^t0Bvi{XpgBI<|
zor+Jo)+#KqTIVW%LikF@g~|0NFZ?S^INd(&-G;pBt?l!t1a?UYFW{J1CAG<?qGhrS
zyXNdk^UPazC~!6#7&^L(+n&5?6L-uyL$_VSY0KZm)89p|af|$_GL?0uMl@fW6t4n9
z?;?jNRsK}XixJEx{NHu0u+6A>c&xmk;H%!t3B4SW$HjN#EjQh>%wgrG8<CG0LXP{+
z6N+v0adRs?Y2Nbcuu+usk>xTIa~Wf<7~N}9Slh#{D7DbpMdOUsLmSi82`L8pv5kL@
zhiv0ybP+h|6lP!;xpGqZhRTIgbf+iy)Ok2-{Qq9|@KD(8x-IH03+LRs@Iz-yeL&W+
zxAL7cb}6<69A2Kn%9Ws1tD>dt5Ky$~XaD|x7lRr%R6eacWjOtdl$)ZVljQlHGZih*
zmQMLNsa~-p<$RGx|8YH2cP^1ROT1({Pq7P35>v2LU}H=zN}kolmuc|n;hxAkhmJJv
z=)yyVx=-3eKdqBlBsyuzN9%Qmt~^WZN|=&*YKp7>YM})-dJ8{za9TB~IW9Z4qop>h
z(CV0ziS}br<;|;~+%2ePo4c?`&}s7eJFD0HRaVOg&U$9x=y=LIaHFIayMw~JCoee-
zl(<CV7>_L3@>0S<Wof^uOpjpH^bXHSE*y%g7Sq*F^FLrqZn;=^<s<8g+cPIlytMb<
zQjre3kVd7Frq`~iE1ob2RxPN1s@iU&$~EP(R!&Nvwz<U8Npi)9pR~7Sguk$>p7m|Q
zx-HAwGc=qUR92RVOSSQR*NMt1WL@MRyfkse76#WZ8@>o%jSpO~Em*;9g?louB@gGP
z#nV6flqQ*_GMEaTu4v|1Y3L!l^R|XSiFQD@>!uKwHZP6|ZvJMfKc}yAh@39+Gf7lz
zuhg`UIk(wPxH0;atkRO6>8k4Qyydw<#tIJCrMsO?*j5Yro@EqEV|}C-X4K}zI^j)>
z!e58~T`KOIjV~{dYgFwwm1&wdqn&9|$HbS1Lz3c>ZcosAa$x1nz}IDaD^G}Y+z=B|
zX$aBqKKgajBnFo~n)Bv~aNlyWo;dx>3cbrxPECJY7*CXX$T@wTo_*2d%MTHrH%C4c
zT=aAC$ozj`7Ppk-s{I}d`x+W1B`2)VD2@Ec=oF}?Y7y?y|0;gT*%Klf-5m>?s}e2z
zrJc5Pzi6HPq*YosLD1-=f5hHu6`qMIEyesf&X-x{KGqan?69P`Beut&#n_a`AC&dg
zrfyf)u2Qk?4qq^(#gB_MomaU%uk2jD^^xpTN!1s2Zm-g@<5rY<D_1h%SU}IFYg|ii
zPitHlBDOm4+G>sl0rLx+MXF5xpK4p1#o%@AMo7t%T|T=WGu>YCio-lAAiLso)+UGc
z7hxfF@~oL*T;dzJ&K?$F)OK+!HtbaVaHacR*o!k;XE1P9CA<3<2ziKq(C6xnxqX>!
z@!}o}1-C7$%3str^Zd=&HH+sSy9dujAx|c^Tel1i77HYFX>i7z>09_h>B15>W)88p
zTIOt3GwM?%O(Jiem>_a-)x7%+jqfL?-(p_ADyIF!yYxN6%r7SBIeqGL^sOk#*btp4
z9xP!rAtWL&Or}A@mO+q1*yGxic{&C<8XiIM7ca!R2#2ZfdGX@=#|NJ)Pn)J*(v3}+
z`_$r>t@)vI0yi@hx%!tlXkPkv(rwwaAc;dCC0jE3riYg`D2T<hIN0*9@m<88Fy(h-
zHfz%E`X?LRDmL@+@bX{m%zv-co?)<W#rktkKDHjMlMQWLRG9feE14rwRQDO{JR#Os
zN(?L)7Ji%=&%f7mf%-N*WdqK;N2`{4&b(fc&?ED6pX14C#U0-ni!`j3O_h$!lvcc*
zt$0SSWmdPLi<iNt7bmZuW|<&WJH^1|v*}{?Yw-aSra0tEU6IZ|&|r4ybK8WcvyApk
zoVmSTz|+v&uS0rgFe}p};i*r16xHmDzGzzTn2Ideb>2Gm`;1gi%jb?EbzA1NOfuCy
zzF{uorz@)61==NB<U9_0Xg-cTZ{btgEO7R8g{W+MpU#oLr$4l;7x$Lz(k}??J^y0j
zKE<ikn#tKIyi6M3Cq|#_Kf^m|=9(#W5wU5uE0%}u)v`YrVyeJ7{o^t_0qw_&x616|
zSU7RF*-s-)fda#}kSkXdKSnYg{gaWI(#k9{Yq~(g8adV(N>vrHYIaveJe<_s>H;L+
zU#j-m8B}oWS?lykM}JK3nYihRq*&w=O%C%8#lT)6+bF5XhYU~ce{Av0SNSjWskEcp
zg<ni%gOb^m*=tNzsK1cNQ$CXaKl%mF%)4y2Djv`0P&O;_FJ$eScD(y&c)`Tu=~Je>
z^j2d%6%m@k%EZFi;p$#}B$IOs!w;scXYqoe&)zAmfAx^*cbju^i>8bE8#d3<-7y>8
zU-O%aH?vyC6wiqNvba?)G{=Rz+jNr?gVNOSBQCeBgf8ClZRuPpAJQ@Lt>Y^<m&!E{
zr@Vfx6`>q>tV4H_|Hr?LXSTiY5piVB_^`&=-)-5cgp^hWk(v*UOiP8c`!5ug9M#lW
z`Rb<HrYV7qL2Jz4s@?bydZ+p4bd${V3lrAHRjk$8)$w@q9XX!`&XPY?WuBWQp)h5x
z>Pg3rC9zlEa2N(nIp)uN(olQCrr*m2FB&E;d3!yPOQhwIM~;W4Ueduzr}rmk^yrAF
zZ01m9>qt*`@_9J1qo8?i-zDXnlK1a*?P?V*?)cs_Y5P|0wN9^m%~T>=<yzH?XZf)O
z>}wHgQ8zMja@(Xg(a(QI?~`3V=9{`~d!8-59<z~0_05-nB%_JB7jvGNN+|gC*SPM;
z<8koX$Hv|BVpY~2&yIsry3b!NI501<OaGVPH}+@xk5pTqEjd$qV#=(}%9+)dIT<EB
zaTl1kYx*U_XQ|VaEWMnoHq@u8vaVXxtSxZsjOZ?jv!@SDa`N7|&~2LI`-ed(0t;Cf
z9ILLVgiN0$>0cJI(R1HEtFTq44=oR^3Sbrb&VK5`3gOaTQKwLco>_G~N-5kE6zqj;
zWdviM%og=<>{=JLxL4^#c4%$Db|yPfqbY}GTB)9M_vKO%d8K6dpv$u*hq0;S#EvCv
zdvqG~(|!p~dzX_awes|YdecVdGQ&-AJvLQ^#hpD$mWwK{#s<20XdPd}&{buhsrpwS
zyL(+g9#^kR(&SxhzFf&W|7OM6ZCRVWe@afeb(XbNu2E&y;>@NtPYvZSEo&Hr79M0c
zxh?fg823_{nO9f;l=6%7mY+Gje%r^d;`a6V=fZDqPi2$2{g-{Z{Ef=**PeD>HFA!q
z%a}X$Vb+qenNPI?T0~|DF{o^tml?6_nwYZ9Nu#Yh95=>%srmNsR(svQuw36S`PbG3
zcfVGbyPMh{d-{~Xy_(4jLT5~jvWw|bS<Q8L>q5g^#sIDvfl*&{S~#Z4zo=rHr!(ui
zM)vfhJGbSnlC1x^I@;{ogxA$y^S;mj&g-}IPEqB|JrakDrk(2$)O?t~>`sGxr`wm0
z42o(6Y(keyEdFz)wsG?xP`YA#e4Cqg^4YI%m_Nr?KP>*Z^z(Y_Co|rE*C>un3r}}V
zY?Yk6IPT)6%~KkK7R>8s<OqN7#l}>oc8Z_9)uf$kM%|Rgd7|Ft|F560yxC*JoOOBM
z&-3;5HLtgwJ$*Ppv6%DTr;`gpRJsJV=o&Iltg_=<;1I&1)+Btyu|uj@`^>aMlT|#D
zB(x5HZ2$QA-u&NNAM!4b-SYpt-s|9bx9rruq=?Kj(s55uiFX!M7mn*;GUfDK*nN~?
z%F`5%GPb7TC|`S#=_dJnH{BK)$z<=lRrLEq_~v7*bNBt}`Te+4H_B8yc>XQ5F9-I`
zpE2DyONeP(>mHve^Y3^YGF<%`F7<V8W{n^BIng=NPu&-|Z#0;;<MibVvwz+GS^WP`
z<(u2*_N{vV@%b06^YWgjj~X6%5OBs-gFo2q)21G=rOm?UIVLpm^`5`7^HPsWMc@I~
zxgUz>ol1_YyJ?ztW6i9$k`*62l=~v~)%-j)Rr}%5zTI1Y9i1W^oVne`O|5-ikD0gl
zTCTM8LtP6DCm0JVD?5a}aM^LdPJmT)?Wz8x+}^afe}=DTo?rIAPH^XsGsfp@KAlwG
zey>V<=fA^-?mQBA_SP_m-#oz+c2w(g4~tl;tCziyo0fw<kDY;&x~_@P<gNgguE@Fw
zA+GgPo;!cCdH(I;`ZfQGxcA&x9lpMmTRiXHo}2bJHzYFGtStY3Zt**-RXK-^=FNJl
z?bFi2lcH_k)ZOZTe$Hyfk~fW!*8hc0czB<iYG&HC<B!0$Q)b$+Ci!2R7vEPBSNEG!
z@%QWX-|F`NKK8%g{od}=E8WR`_xHNbF7k_Bni|ixnkjc)&j+?^Upw#RPn&Pm5Esl)
z_3uXWC;4<8t4SP&t3Ig<Okq%ntaC7o|Gp*Xxbps*?~Ci#Ib02Uea(Bi-rE}+7uUbr
z9kIXeuMK}_`hCmA&np-Ini|;RFxenkVBrM*j8MVcC*cB5)WsI}6kp5cW^L&EBKl%S
z^CqvCc}~aO=0Av1idkv8>rYO^_x*J>YG)6h*56-qX^H2<%a{G_|2~}_-<JPD`{(U>
zHak;ar%hFGaw<EQ5tlZ3%0+8W&-e4^Sf)R;R&qEmUq7M4?_P<H(-y~;8Qm*C1)qEK
zM&4Ndf5|a<dsXrKRj+mTvvAM%n{W4bPVqU#_maOB*EQE)*j#hE?SM~Lx4;znC5CK2
z4cjsvW_~!gIZl-E)tzTQtymB7Iv?`VvGR1`n0UqG(_`-Q`uel?)_pY#+WVW~p!Q6k
zXAR7JAAEV^-rQUK_Uz<7?a#Z6XXU!y-ZXK3M9&hnfOj8t;v27dG1!K$cUZ!8xar8e
zV~dqL1EhG(4MJ0=&hNh$@$<xv@)Jkf<?AYbe0cceQ46PVg>C)ayYBDHJ(hp!7Dzj~
z!0?f`k=uz?H)43g64Uo*F=+56@#;NT%;Z&}^=fiQ-@Y>%v3Wl~_O~C~v-iW?&<|d>
zx8+XPjecf7seE1B-d*YE=iT0(-!9H?U)O&+&vK8Ti^gKTJDpG54|;6WI>1}U^|<)m
zBCZQtg!#I1yg40w@_SyWaCtI@rvA3s7rFKAw$o{oA70;jJ?{7H`+wYO{%=S;Jg@4N
zW`*iq9n)_cg>RSVMP8dH@L@fRp!?wyGV?!Po-=pu=PtGjowXBlB{da4>;DpojAjzl
zTK;Fxk9ODk`d7w9h4=PUw#!wm`0?+0eEr`akNefd_t!_x57xi6e~!|WfVve@3;Py*
z3F&n_c)2*OK8J<lhe)a6wDt)HmbCs`C~D=<GN*`f%VM+Nr@hm2W7>6Iu2|eR%es8s
z!{s&G#B?GY+>*Edd&m;sb?VFWZ!`WJNjhTPB^kJ=MS|sz_9aEp1?ja73%<S3JN8+i
z|B{B(<>g5pTG^jJ^h%zdx9hueQQ@g6n*01E>s}pXmzOck64|<KHk(Z4r?{tiT3LeZ
z*OR`i6q|4S#dcQx&;1W}YB{KXP34rTfAVJ0@%zp5n>P6c&OP=)|NLjQ7{m0Z;<Fzf
zJvZ0-cWc$@Y0DfoXI@@b`|alOdX=w#&db@IE0w-{v_tCYUe1#LE>~3kD@}~tQSnZP
z*@5k?V7B3<ix-&%Udn&^wR*|F(9O1+Q<Kj=`)c|+JU@DK((6x0rSHxCt6F*ftoePL
zx<5Z|#J@TwoxkV%z3P)koA+PM{VtblU6y-uWA^H6Z_6_8rcJ+=JNx~uyy=r7W<OtY
zB&w%G<g8)G&6xr9npR7gOujzZw?V!+#m(o!mqkyKp4qglUAv+F{H<AUc1?{oUwi-E
z=ZE%rHv=}OCg;lPNxxc`b2nsnWwNhs+>68f@fH96zOOHTeNFe<_UL^zKN;C&0)m5+
zKc{D3Tow6x+gF>dx0m|<7R$Z$GsN`!`P*d~4;No6+&=BC)pnhP<?Q*aN1w<Y+&`r!
zXV;AXzU}*Tn64~6d*#5P3?3zJOCHXs!i^8En?%gc{ckY)<Gz12mnX5lwu}FAcGc79
zKS4E@&2LNptN%JRJnrWKX8s%dD?dFsd6d&6bNg$#-R~|hckZ{7{bs+V`)P}OnMmmB
zO&|0P-7mY!N}jqL5Z`z$gF({UKv#O^mgC2cUJ5(?taj<luV>PWm)GyBboMQ@O}rjk
zKG(kf-@WShxj+A<o}Tvg_4WMM*Vek0FaOJ4vhT_A_M>LgioD+izPtGMv{(BR1{Lun
zD+l%OXS3eQcT2QfDvVlt)I<NG9fR%9*ZlW>-4<7U>2Ck!LWiKT(BBiu{kCQ`KMFP-
zTdd*U&urbZ>-CG+S<BZX3%pk9`Wo(b_SQ#64s(uIIz7xL8@y*UzUi3gWuW`L<Ce3_
zxj*NB_3ziIefGaD<ct4m@9BEU$NOY0i&7ZvfB$&g|J&YMZH=p?pH=>TMP<IOk9K?g
zol8B=IJY_ZJl9N5v2%Ez#c=Ty$IR&$c%80>%@MiinQL{B<?%-Ad$Yfvn$G(_=hpW8
z`<ws0xV!uN0>|ckzwf@^mKXaYR=DiV4a4$xcedZJyL~((^6$p1tE)<1UrXJ5v+a)}
z``k^}kDBv&7+gMap>p}s4<9b*a`?A})vz`2iFN5XZxYP@VWIh`R$(^F+tdB}PHpBU
z+1J)&Utc%Zy8N5#QT=6qj-NYtaqGVqS5{80zj)`F=CzG=e}9!e`0;FZ{<U?nujj9c
z+<eUbqhj>Nq@&m4S6fT4^S`wGa;q-PGU^R;Bv=2z6H~;J-ko)hk6XY{a_XSrOZWAA
zj>z<$IUUdxxkVtps_0|9+~1aX`?p&zAM264yx6_}-QC^0^Gxp+oI3wNJf`4akEHPr
z@BbesJMXW(b+7EL%T|HQJwCn{yj+h>zHnjxY{o9_yIa*JEb?E{HeI@NBSY@(AnSka
z>+|j@guHottoO5I(W+NB_SODYogQP9d&}hCrFnaA-L0tqlk3n@XX1Zhik9nyBkTI(
zE~ztk%$X;($H&(`C|T-R#%#r7kG@~GGkLaFcB|8#9nWTEzuWnIUWrw#=$9XC<@YL|
z@BMU2+sWniolkAmeebU5+D&_Ee%_liio<-GszkTlIu(zT3|<2BFCXeU5}|+EFw2s)
zI{#dFzh8yF&OCqHuUD4Ot6CMiyG+#Y{Pg%b%ajun`0ai;ylC5=R|cw8cFw;Vueg85
znM*rQbRF?&UbKbRA*D@A<QrSVnn%Tl)B-Bb%>DOsGyfU!-}--lf3JVoD*ono<5T-*
zXJ?l`o0<NLGiu56uG@WYYCWDesU=N1cEdHZ&_bV4WN#LWhuoplnO6J$8GWhSV5j;^
z;@;e?e@@2N&$y{rF;jl&{OWf*8=2X|6m0G8OpmL2IZZeEhj;F+?K^&bbF6-U-|nVF
zOLotr49{#s(FHN0(?k?P5>;QRZfXe;Y54Q_@%He)iGTJ;WxCwjRr>nmWOaU7t1XLO
z%(N(cq`Uo&(zkZ2vRu=mL)&+~om(+Ko5$g!ru$nZsWe$%7KQ&2yE6X1KekudFX(U8
zJ^iz8{c^FKt+lziZ&w5^maBXs_%U?<vt6IUo2^PTmsp3IGK9`*b$xo~Rqo`vkLRX)
zn{}=KHMLLQb#2tvESD;?+*>6VUBx@k%Kd*)TrvH0zHG#YZ`ZoEZ0O>@xX0e)>9=~_
zS=*y(zTUq7@7tEl%VoE7x4SJ&KRHRYE+uY9!NMP}4DY`;{Bo<V^?v#aC+CvX=^r0W
zJX>*DE@r{qm^JSGa+jC;+y8jbeA?&y?EHO|-)^R_kJ}qnazjy>&!+H29q-St+IxD|
zA8}js^T+e}>3)0b8zW|wzPNC3eM6t+vl*K%8mFI|v-zA=x6a&ivS*{0>Hoc%*e<iT
znz_FFRfbB~IgP{5KJ=d1ZhZgBkxOs<>wjI&Ts}8!UeVq2wkiDCa!>Vi*Z+9BU~iT9
z!rPGt7x#3@EQ^xUo|gCP?v3*6HM(D-W|`;zd(^Ezui{as>eBRUYa-L<6t=}za<X2p
zd%JGW+5=6iz1mia?wND=-;F&BpMBrHcX!G^tA9bu{pO14Mm@2g)-kVF+Wgzg%kF1v
z|MtClW*sj0o<C;dX-lmN$H+y=?z!Lg*Z*a_zvHpI`Q4JsEu6w$EEndM-?Oaxl2KRt
zVZyxUJvKXb+}|8Hllzobxo7qxrR&A>sxuDGdH%n>Zdx;Yck+itGUD+yA20jc`!3%j
z{`UW0p*wf>J({*9?BAkaOnvF^e!q~{UsT#t`}^D94~O}^StiV{OFK7*b3LefKb$8O
z@aO(YCh@D`|F+Fz>a+Kc`||1Xi+|F`<*MJjxw+Y!1yp`7^O?!C{>Rf_9UG6%e-rj<
z+q|qB5i?#?JeX!~|MR+3#nV@-*Z+H)Umva1@NVz-d(!!PCh~Y4x2+5M$hhiAZ)@o8
ztv3t){Q0wga_9zryB`lk!(#%K8se(on%+~B`2R&S*LsUa5yPq@YtQ<=d&aeTTK>M;
zAFH1{lFr{#_++B{v~@l2FD>Pc+#LAlz3Yk_v$ah&-rl{(viN5G{pL?ar>E&&Ul)6O
zkt_G|l;aJI%+Jox?+>~@)Asz{Wiz&`tbcHOx5-**AKSv~zw`I+*^|R*Req=7Ft18-
z>HC}Cp0)RDuc{Ay#k*|Q4c&KnyK}zX5`FQHJ^5IVq<LP9C*v%$+*?1N&+kuvU&mv$
z)%W)^*Kg~&_8g53-gWZXudBC@@y&MCJ2%Jj^OMQ`dYTTa!`I(S?zcU$Z{q2C!w(md
z%k<~gho12@n|&d-?)lzNPm{~{u&+1CzLs-#mTB%Sm58c6Nk_YMqqlu|byfS~rHDG^
zbIIrLe7}>;r#GoS^h0jl>`T4Je#ZT3WM<#@^V#gMS6l1$&QDhJpSLIHrqS|$bv)v6
z6%YOEK284nZF3Y;+1=9X6RShtZp^<u-?k(s@X7K;`6l<K?0c1PXlikoj_d24HB9gJ
zeD?e7fA!imzgZ?P!}tH1x<0hV^u&pY%I^JgcXt+_xwbZae(kp=ZoLDBC-(lG8C;fo
z{encu%lOg@Df@C#Kex>?6yM`wCjaYW*@+2?ZSy~IZwXxNR{QCsdfWGs7Z(!W+}L<M
zrnomz`s=FD)!*(E`wKO@^;mzJuy~iKd!5#o(_ynNT(|wWKH#J20e+KN6+h&E`kLSU
zazxla;@_`!*|Hh=L2Yd*|Ns59|Mw%g;%Q59_1x0b`-@KaFRi;9Ed1-xPVu_!1>dgJ
z-{yH(JGbJ`$K$nCJJOHV%vo3c@u;}}9E-q~OVc%e)Rz9+c%Jd?|Ihml9-TV>)UQK3
zmwlN!egD3HUzc`YJFFcZTYB~H_xt|$wpDyg`ae1E#HR&$cX!<_JT7~<jaNDK)?|OX
z%9l&0FM6f<)^A2t)WhflTK~26XP=q=?%j&B|Guo5nNodhalhRwZnqyLx3}dAtNHBs
z{cbn!_UgR5Wz&Q8-rOzR9#&ub<#On0bLqO{!hRM9*Wdc}r8BHoH-6uq^z-wc<l6sQ
zzxbQ{g`F=x1v|#?x^1%W+wbn9((nFVjL|du{cd;uyP9J?lAzwfBvtP#|L+FBE3doo
z`Ag#O=daY}AFcnBdb7vAZdd7Kui5d7e}>MBU))+A^Ci2k=>J*8!~8Zc|J-B!R=4U=
z_WtGd&mE+H8n$Hk*Vwam2r|29Oj`87@a4hx&tDy%GF3bLmwJ5d*Qx&{e=j`#;c@l1
ztn!Dvf4{%H+!*uy<<HMg{O`@!c%>jce*X_C`?^1>(_<dZkFR*x8ob=kwfI`{?*AX2
zyNgVldsjz9&arOAR>$Xu7BQ_kE3$}J$>d2Xv%`)m^CS^v`>s$;C6RXqM}k5cCVos^
zqdvFf(&zK`_2+HB->G~)ceeTJv?uIS-p5``|1e=*+tv5;Yqxy!|9)0oR;}pA{=2c|
zcfW4m|M%^*=sZW6_xFB@_s@%%QK=ZPV&ch9iz8<5<>=JEI(G)cCwtv{ET1lHX*89%
zsc<Ga|ACT9eByO(gH6BlY7YOO@lbUCy>Fr#*TcfN-zS&Zmp?fuyX)Bf&V%J!Zl2ex
zeA#)_^w;<NB|$3>^V|QqTYg_P`0DQefA*&BULrJG{BY9;m!%x1`%i0`dQH-B60#~)
zpC_pB-(`yYEmJXN!K&tis~(7QE@+dy`Sx(UX?k4I55vkArhk8_zWKB^cH`HZ>|#0<
z*{O@>e-b@$eIeUy@zQk?^A`MZ=uKRBJk+b)BPe!;F|$j1Skf;>zSccwbew|XzGX13
zw~0D^;rzLIKlewMNBsRix2)fO`Sq9L@8dtz?eG7$GwGJI{QBt3-%BOU?-ZZeS8ILC
z@9xGw7moLw3Kp59@{{oz+nNbsSxi|w<Bu>Ygin;$aXsWZZ?0?7rI1(?)=!h#7v>!M
z{qg(1q|cl`<)5%#|Nj2o=3M6I!TToe{qp3|&EV-B-%AyaU)^5+dO>6CWH<TiYa9ZW
z8X4L+s?F%`6c@}|m(Cb)_qf7svEEA!iVM#!juljOZ&a&jj{cr;^1_SHakn;I{8DQ7
z)@rN8<Nq=iFRtwEuK2xaYJ5&z;-%x<_u^9PZu`sITwDJs=f%q3Gi*<|%Q!HIgy(Qe
zO1TErh`rUh-`~N?ac;>IjoeLIvs#YC$VgWe^>?UT?^>w-uI~Ta{rckZx0Y6(`o3ne
z{)^ZG_Zu}ezy8g7F8?oLcXHJ7ytVmri<&B%i|5Jl7e4Mv64v(6;9U7h`O2T9K(Qaw
zWgXTXjy`;0+mbhHo~0_eN@+)ZQB<kS<8h8Qzv{E2i0`LWn*3a4|68x8{C|;K%>SNk
zt;N?p^?QF^)jqHHGwCCnk@fDZKMI@cuU>p?n3r@|V7Zp?Y2kOwoH?Am`PVnIt+;no
z>Gq_@d>dDps4DMqD%x`6$IALO&CVTm4s|+`QAYK5yMx7aXa4W~-}r7@`0T^}Hy&H3
zf62JKuQmAC<9fS)&*s<1&XPX))pC#b|HZp!KbM#?uR&Uop>k*OR^1jM6LIN}UdMu)
z0#y<Mz3;Lu@MtMu6Plv=r{`doL9@usC25C*Q%{^bU3MkyZ$k7D>s3?UF`QGqC@e5p
zBY5>8VYNqVCJVXe1hEzEZDDx2Xv@846J0zES58nlFHsxvvoKI`TF1gw78bUGV)GVv
zPEh38X=J|XVBpU{Dc6h@>6`-Vo-e+)Wzuxh&zn|nj`-r3U);&3y8860hItE~HQf?c
za!v89GU1+-mtymG!a0={_k@|Jh$|+A3OR3jqT+QnFCqGkQmRJ%MmtVc|J76Hb<CDA
zIT)<rv11;8hJtHd&9Z5%n#qqeSvvk~6lPHAm@s3yZp20o+YbI)j9hzqcF*u#v(Duq
zr;7WB^#^uJ*edyWDos3i!sA!q6Lm=kmzE=`@j-oV&styUOjHbCvD1OA>kgNS;u43_
z@Kx?zpC&yvWaYZd|8eUBrKiWPY<R|ysI%#o&HT8B_5V^BJe8JsP5c|vbX>tpC_&@I
zbsniT4pa4AJt{UZ3C;+bxZc&nG4Bkc#=$Sl-2Q9+sIYZRNoF$4yuEGHg^aRf2`Af(
zH%W?ykqaD3zdT7O(iWJz%PzTZ>Kvw}n`D$9#4mg@<K;)8ZIVlmELK(g_<oXv!bZcj
zo024oc3QlX@F)^(OW-^vs<9{N{N!LsiL1rJ6=57*o{b_^HrjbRwoaTlvr%j9*E<0X
z3CU6KjiT*d*&O_#b2Y}o;`B4orwh3bbSx4+*?;iF2BV9+d^#`1<uGiTu#|__=T;zx
z!xF>AOVS=M_Fn8C;PbJ}_*l22vnU6*f9#YpK{vm5GJi|Gt@u~}uB~C3V`E-fB9jp3
z(Ivv_)O+N>&M9i9+|J*)os5k9*M)~P91^Tu6uHYPw*2D>riVfveiedgb3HOeScMFW
zK0W_g5u!Bd)14>HejO7V`WzcQn!Xv>ZqVx%5KPq45NiA`(Z|Fnba{*9;uYtLR42u(
zaa*_XnU|~K%v+L5Y>6TUEt5*)CeQg5F3k~atNOLSa__>*nY$tu`1o`MMZPGM5RaQ)
z8BuD}DeWI8kR+s%T&Bn5py4b2Ny0$!X!;oeFQ*qPSI-EKIGo%glab>0PxFAr|ML?b
zb2c;{{A7^EX!x_7vE<bb&UFqwN+lEi7$`S$&YF^Z=G+kt-7~L*-IUDR=Cd)dT$`o(
z^2?5zg2qS2Q)TA0#H?~S)Y&KK!hR|Ed*^PR=@Yc%x<2Q-dR+Zq?EQ(^VA92ds(Vk1
zo(R6wuYN(8O^tI|O6;N=iyav{_h!z?aS?y4vT*slZatwTpH8KRDJYojls~gjK-r1!
z(n1^lMeAFunzyR|kqoVybKvNvNjjcfQ<zT9TDnN#d&R0(0(mVbS1(_dDa|0oB_KQX
zct~82iul?e6Qf%L8M=ZMrY)Fj@!#oA!sktzKVti(BvnqnN$Q)nI9a4)iTouEroda1
zcYMroJ+bxC@`DT$yLx=DY~ADY*m%;M2exrLdPE(C4;<nCA)~6fGOzz!^9deLuCGT*
z8@6eDa(3m&^gj@A#J6v)f}^l_w}apk4R)4896!QMl(}nrFFEg+__*&<%NCn1hJcWX
zn!!Pbf-UUDC4##2BO9+=n!Bz3&@b+V%*Fhd6vH{rJv+rM&>X{4Ae_YFA+);c{Ds&j
z21`{Oopw~L`SEGX%UYHRf8FC{8g9(epSfIMmd={xM`m%)n6kpbtL9kk^AC%f|8kc#
z%Ww&s>Mv#zRBpcDayR{s$C-uG?9XqySK>28jf>?{zZ3r@(WRcg#X(GUT`Utcd3N?G
z+BvrgXg}nS(hAtIYHHGv3yP)H78~7DYwTRSw+JjMc-N@J5_@LhIalTY4e!YF7h*+3
zI<BO0**Z=6CM8na#UCKj7PIo1l1eAf#z)?q=XQNq(vkl1#gm#-tsf(e^rv5H{<qZT
z>Inm@d2NDD?N2fmGZoIruvELKT;y!VqiWm58DNn<_4-07$tLm2=K-M#6BfvtIk+00
zFzlQVbnNt(3-vlHd(2PxZxP~XUnnElR~Rr~DP-clMb8_T_85NY;FjXH=;9IJxRT<j
zsJs4A_PPSunN}Z!X0@{{-m~4Q#OWmCoeu)J!6%isPIoRj;2Uz1S-e=Jq=iAH=j4N=
zqdRu>h$hKJhtB=V^?OG*f54AK<w-h{T;YWoc~gHcedR9`?t5X!U*!dhx7OP@^WPE`
z;rzDPQS!XBla?EkRfC+mh}<Q=7EUXPX&Xb9TxxdO67KOuQ_(@txu(8V&2m!rO|5{0
zl)i3*N2xXI&K=she4eyKbHKaK-@6p}71+}gcP^i?#G%w?VGsKYiz9n-L_9w0t9k5b
za9`ccW#`2tpmj<|lF2`kQ|%ki)05Mc`|itL@mTZ!@kIgIIFpn8!rD&rl-n}cx7B}=
znD}r{^1Qy8A{;snm*4hWU~bGl5vbMRk;rcz_+VFTq2Z<!pIKXylNN;^Znay}#;)RO
ze5FA;=vcJ5P+(JEj<y14pJ{=;)ttVk=Qr;$dF*>s!D6%OhE4UI=bnnjZJ92r!0i0#
zpF{ZU*cs~ar%uf6(XY6Bu3O*yf?)V``M{Pv4<;R7zDiD9<#5Dd!L!<V0sM=5_9$;O
z`7%XD;p*v_S4nKFtE96N9u~&rrG)fOm~NR<(|F6CK`JAzO7*;T&kSh>-xfZJY>Oj1
zH@uplCU9xFL)sZGmp`Yq_Z3g&S2#CegT28-riXSDn%h^FJYAS9q{uQkC+^j`O&+Bp
z%8OMBe-?h3+7)>xr$_pVFzcd!tf#g-x)iL|P!Y>k7B)fEE-23I-F3%#Qzr!%?~wBl
zQ4H|f85hHU>q0-@#6!uII`)1?xXxeMd42}pE8gApK3pP6DsNtBJPK56D5&RnyXM3v
zN!PBbX$m$efArktFa7Hb%WL?zQ2KK7w#aje-xu48_lG=Wsy;5#aG~YuNvmg$w(*6>
zx@x{`+2Q_^p^4{W*upI<uk3hmLG*Q*mgSP-6RsS`(=D90-nSF0QIVU`;i*!X_aV)2
zp`wb<@hiCwCDq!Q#?#v76)}tOh<Q90$p0!7)e%tfqE2>F^@%#!$sC=Ew~9<>Zd&HU
zdy(yD;SVp@m7F2lzd1`>S)Ssq{5AZ*ir~Kt3umq_jNZL1FyM`;`|k>wXYr1k-E*Y9
zQf;(eKIZ&1VIpVhp2IsFYhCrvTuGSTZ<f0?OyN!ZQfn#p1$S=o&s(e;WNd15+-Bd3
z`Qa!2wYJC4%ZL;EBcNRTGsCB3W5MS(qiY3MWO8S(be`c=Wg_LEBE-qH<jRM(U9#6d
zFw6}o5^!TQso{F&wPFX~Rq4b;?Vd|EF2+9#9|#$XHMFd{cOztq$ciiO$xKI-Cu*8L
zp13>tR&C?OKo<|K$I7x@YoENFWfWMg;K}y0aLYrRHHTW*l5>{n9lm&i!O?ngwXTQT
zGwXYvzmG4x=srni`q6ZT-bB-xCO%iQesHMW>i@Pw;iAEl4{ZW>|320TV!5s{?d=MV
zh7e7qLz5RJDNld5ML_treMOtr%<0dMwJYpd=A-l2cFU2T(3D5#D*O7BpJbE<#GhLn
z#NZT^a%cTv+tUqwI!;cK@;dxNb5C3N9DS+2KX7UWf9w^<C&vx%HXIb}44l>V)Lx5Q
zLCZDa$-5oL{+{0WV!}86W;e~pYr{%Tq}J?sebd;yC8cLe?D;;s75P&ZKVn!EwB%aM
zg1^ds`|fbKuQHcVONiK6&t~pc=OW0pukQL+4WFOkk#bJ^+^$tvBsqJmeIosFML>hh
z@x<;YxnAX4;?Bq{aumP#b<(#5y?<X!P&W$=jX6^xt$2L$dpFU&H*azVtXcf@b=hfY
z^$FklWfrySeq2<!b43Ds-qTDsH?xzg6{B)FUYaMI$WP1lIls!N;f%z>kGqpEH;eu8
zHqZ|*(Q+>}^EWhlloV3eQdhFV?a;r&T+Yj9F)Wg}*{{EY<7slhmiLD)S6|@#)_O8^
z4|`e0k<<NWBNkuk%VOe4TGFR~A=l*KTML<|b$Tm$+_$BEPTYCp+#>nK29<B#mCul_
zVrElh4t*9_%fKlZ?b7~S?xmfBM?2SwC$?+l-)=m6ZqlCvb3Z?-wb4>gGxu#!>OR=!
zs%$K-sOciSJ?Wh2X5GV6^S&yzXSmkMY&s@)Cu8HG{#R@rla9P!eBgGQlcfA9{&^GB
zZi%z)@wq6saO;Y@I~I5KsWDAR$c<?+Fn{PXPhy(PoUe0NZu(%6<Jzu#*JIWRe^EJK
zUWIpgP4y3dGkBVZ6bPFMP5cm$<niU9Uf9`o9_R}3qFF~0pSl;8GjFoIbK~B`7geEk
zI(K&DUheDJ`~1C4nVi^v?zc8&a@LHuDyRJZQGa#KAF*uFc6|m01_n=8KbLh*2~7ZO
C#7GeU

literal 0
HcmV?d00001

diff --git a/icons/build_application_icons.sh b/icons/build_application_icons.sh
index 27dbe26..e8512e7 100755
--- a/icons/build_application_icons.sh
+++ b/icons/build_application_icons.sh
@@ -1,118 +1,88 @@
 #! /bin/bash
 
 # Check dependencies
-command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
-command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
-command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
+command -v inkscape >/dev/null 2>&1 || {
+  echo >&2 "I require inkscape but it's not installed. Aborting."
+  exit 1
+}
+command -v scour >/dev/null 2>&1 || {
+  echo >&2 "I require scour but it's not installed. Aborting."
+  exit 1
+}
+command -v optipng >/dev/null 2>&1 || {
+  echo >&2 "I require optipng but it's not installed. Aborting."
+  exit 1
+}
 
 CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
 BASE_DIR="$(dirname "${CURRENT_DIR}")"
-
-SOURCE_ICON="${CURRENT_DIR}/icon.svg"
-SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg"
-SOURCE_LAUNCH_IMAGE="${CURRENT_DIR}/icon.svg"
+ASSETS_DIR="${BASE_DIR}/assets"
 
 OPTIPNG_OPTIONS="-preserve -quiet -o7"
+ICON_SIZE=192
 
-if [ ! -f "${SOURCE_ICON}" ]; then
-  echo "Missing file: ${SOURCE_ICON}"
-fi
+#######################################################
 
-if [ ! -f "${SOURCE_FASTLANE}" ]; then
-  echo "Missing file: ${SOURCE_FASTLANE}"
-fi
+# Menu images
+AVAILABLE_MENU_IMAGES="
+demo
+"
 
-if [ ! -f "${SOURCE_LAUNCH_IMAGE}" ]; then
-  echo "Missing file: ${SOURCE_LAUNCH_IMAGE}"
-fi
+#######################################################
 
+# optimize svg
 function optimize_svg() {
-  SVG="$1"
+  SOURCE="$1"
 
-  cp ${SVG} ${SVG}.tmp
+  cp "${SOURCE}" "${SOURCE}.tmp"
   scour \
-      --remove-descriptive-elements \
-      --enable-id-stripping \
-      --enable-viewboxing \
-      --enable-comment-stripping \
-      --nindent=4 \
-      --quiet \
-      -i ${SVG}.tmp \
-      -o ${SVG}
-  rm ${SVG}.tmp
+    --remove-descriptive-elements \
+    --enable-id-stripping \
+    --enable-viewboxing \
+    --enable-comment-stripping \
+    --nindent=4 \
+    --quiet \
+    -i "${SOURCE}.tmp" \
+    -o "${SOURCE}"
+  rm "${SOURCE}.tmp"
 }
 
-# optimize source svg files
-optimize_svg ${SOURCE_ICON}
-optimize_svg ${SOURCE_FASTLANE}
-optimize_svg ${SOURCE_LAUNCH_IMAGE}
-
 # build icons
-function build_application_icon() {
-  ICON_SIZE="$1"
+function build_icon() {
+  SOURCE="$1"
   TARGET="$2"
 
   echo "Building ${TARGET}"
 
-  TARGET_PNG="${TARGET}.png"
+  if [[ ! -f "${SOURCE}" ]]; then
+    echo "Missing file: ${SOURCE}"
+    exit 1
+  fi
 
-  inkscape \
-      --export-width=${ICON_SIZE} \
-      --export-height=${ICON_SIZE} \
-      --export-filename=${TARGET_PNG} \
-      ${SOURCE_ICON}
-
-  optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
-}
+  if [[ ! -d "$(dirname ${TARGET})" ]]; then
+    mkdir -p "$(dirname ${TARGET})"
+  fi
 
-# build fastlane image
-function build_fastlane_image() {
-  WIDTH="$1"
-  HEIGHT="$2"
-  TARGET="$3"
-
-  echo "Building ${TARGET}"
-
-  TARGET_PNG="${TARGET}.png"
+  optimize_svg "${SOURCE}"
 
   inkscape \
-      --export-width=${WIDTH} \
-      --export-height=${HEIGHT} \
-      --export-filename=${TARGET_PNG} \
-      ${SOURCE_FASTLANE}
+    --export-width="${ICON_SIZE}" \
+    --export-height="${ICON_SIZE}" \
+    --export-filename="${TARGET}" \
+    "${SOURCE}"
 
-  optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
+  optipng ${OPTIPNG_OPTIONS} "${TARGET}"
 }
 
-# build launch images (splash screen)
-function build_launch_image() {
-  ICON_SIZE="$1"
-  TARGET="$2"
-
-  echo "Building ${TARGET}"
-
-  TARGET_PNG="${TARGET}.png"
-
-  inkscape \
-      --export-width=${ICON_SIZE} \
-      --export-height=${ICON_SIZE} \
-      --export-filename=${TARGET_PNG} \
-      ${SOURCE_LAUNCH_IMAGE}
-
-  optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG}
-}
+#######################################################
 
-build_application_icon  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher
-build_application_icon  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher
-build_application_icon  96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher
-build_application_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher
-build_application_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher
-build_application_icon 512 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon
+# Create output folders
+mkdir -p "${ASSETS_DIR}"
 
-build_launch_image  72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/launch_image
-build_launch_image  48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/launch_image
-build_launch_image  96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/launch_image
-build_launch_image 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/launch_image
-build_launch_image 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/launch_image
+# Delete existing generated images
+find "${ASSETS_DIR}" -type f -name "*.png" -delete
 
-build_fastlane_image 1024 500 ${BASE_DIR}/fastlane/metadata/android/en-US/images/featureGraphic
+# build menu images
+for MENU_IMAGE in ${AVAILABLE_MENU_IMAGES}; do
+  build_icon "${CURRENT_DIR}/menu_${MENU_IMAGE}.svg" "${ASSETS_DIR}/menu/${MENU_IMAGE}.png"
+done
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
deleted file mode 100755
index 218080d..0000000
--- a/icons/build_game_icons.sh
+++ /dev/null
@@ -1,98 +0,0 @@
-#! /bin/bash
-
-# Check dependencies
-command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
-command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
-command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
-
-CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
-BASE_DIR="$(dirname "${CURRENT_DIR}")"
-ASSETS_DIR="${BASE_DIR}/assets"
-
-OPTIPNG_OPTIONS="-preserve -quiet -o7"
-ICON_SIZE=192
-
-#######################################################
-
-# Game images
-AVAILABLE_GAME_IMAGES="
-"
-
-# Settings images
-AVAILABLES_GAME_SETTINGS="
-"
-
-#######################################################
-
-# optimize svg
-function optimize_svg() {
-  SOURCE="$1"
-
-  cp ${SOURCE} ${SOURCE}.tmp
-  scour \
-      --remove-descriptive-elements \
-      --enable-id-stripping \
-      --enable-viewboxing \
-      --enable-comment-stripping \
-      --nindent=4 \
-      --quiet \
-      -i ${SOURCE}.tmp \
-      -o ${SOURCE}
-  rm ${SOURCE}.tmp
-}
-
-# build icons
-function build_icon() {
-  SOURCE="$1"
-  TARGET="$2"
-
-  echo "Building ${TARGET}"
-
-  if [ ! -f "${SOURCE}" ]; then
-    echo "Missing file: ${SOURCE}"
-    exit 1
-  fi
-
-  optimize_svg "${SOURCE}"
-
-  inkscape \
-      --export-width=${ICON_SIZE} \
-      --export-height=${ICON_SIZE} \
-      --export-filename=${TARGET} \
-      ${SOURCE}
-
-  optipng ${OPTIPNG_OPTIONS} ${TARGET}
-}
-
-function build_settings_icons() {
-  INPUT_STRING="$1"
-
-  SETTING_NAME="$(echo "${INPUT_STRING}" | cut -d":" -f1)"
-  SETTING_VALUES="$(echo "${INPUT_STRING}" | cut -d":" -f2 | tr "," " ")"
-
-  for SETTING_VALUE in ${SETTING_VALUES}
-  do
-    SETTING_CODE="${SETTING_NAME}_${SETTING_VALUE}"
-    build_icon ${CURRENT_DIR}/${SETTING_CODE}.svg ${ASSETS_DIR}/icons/${SETTING_CODE}.png
-  done
-}
-
-#######################################################
-
-# Create output folders
-mkdir -p ${ASSETS_DIR}/icons
-
-# Delete existing generated images
-find ${ASSETS_DIR}/icons -type f -name "*.png" -delete
-
-# build game images
-for GAME_IMAGE in ${AVAILABLE_GAME_IMAGES}
-do
-  build_icon ${CURRENT_DIR}/${GAME_IMAGE}.svg ${ASSETS_DIR}/icons/${GAME_IMAGE}.png
-done
-
-# build settings images
-for GAME_SETTING in ${AVAILABLES_GAME_SETTINGS}
-do
-  build_settings_icons "${GAME_SETTING}"
-done
diff --git a/icons/build_icons.sh b/icons/build_icons.sh
new file mode 100755
index 0000000..915a16c
--- /dev/null
+++ b/icons/build_icons.sh
@@ -0,0 +1,6 @@
+#! /bin/bash
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+
+"${CURRENT_DIR}/build_application_icons.sh"
+"${CURRENT_DIR}/build_repository_icons.sh"
diff --git a/icons/build_repository_icons.sh b/icons/build_repository_icons.sh
new file mode 100755
index 0000000..b50cfc2
--- /dev/null
+++ b/icons/build_repository_icons.sh
@@ -0,0 +1,127 @@
+#! /bin/bash
+
+# Check dependencies
+command -v inkscape >/dev/null 2>&1 || {
+  echo >&2 "I require inkscape but it's not installed. Aborting."
+  exit 1
+}
+command -v scour >/dev/null 2>&1 || {
+  echo >&2 "I require scour but it's not installed. Aborting."
+  exit 1
+}
+command -v optipng >/dev/null 2>&1 || {
+  echo >&2 "I require optipng but it's not installed. Aborting."
+  exit 1
+}
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
+BASE_DIR="$(dirname "${CURRENT_DIR}")"
+
+SOURCE_ICON="${CURRENT_DIR}/icon.svg"
+SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg"
+SOURCE_LAUNCH_IMAGE="${CURRENT_DIR}/icon.svg"
+
+OPTIPNG_OPTIONS="-preserve -quiet -o7"
+
+if [ ! -f "${SOURCE_ICON}" ]; then
+  echo "Missing file: ${SOURCE_ICON}"
+fi
+
+if [ ! -f "${SOURCE_FASTLANE}" ]; then
+  echo "Missing file: ${SOURCE_FASTLANE}"
+fi
+
+if [ ! -f "${SOURCE_LAUNCH_IMAGE}" ]; then
+  echo "Missing file: ${SOURCE_LAUNCH_IMAGE}"
+fi
+
+function optimize_svg() {
+  SVG="$1"
+
+  cp "${SVG}" "${SVG}.tmp"
+  scour \
+    --remove-descriptive-elements \
+    --enable-id-stripping \
+    --enable-viewboxing \
+    --enable-comment-stripping \
+    --nindent=4 \
+    --quiet \
+    -i "${SVG}.tmp" \
+    -o "${SVG}"
+  rm "${SVG}.tmp"
+}
+
+# optimize source svg files
+optimize_svg "${SOURCE_ICON}"
+optimize_svg "${SOURCE_FASTLANE}"
+optimize_svg "${SOURCE_LAUNCH_IMAGE}"
+
+# build icons
+function build_application_icon() {
+  ICON_SIZE="$1"
+  TARGET="$2"
+
+  echo "Building ${TARGET}"
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+    --export-width="${ICON_SIZE}" \
+    --export-height="${ICON_SIZE}" \
+    --export-filename="${TARGET_PNG}" \
+    "${SOURCE_ICON}"
+
+  optipng ${OPTIPNG_OPTIONS} "${TARGET_PNG}"
+}
+
+# build fastlane image
+function build_fastlane_image() {
+  WIDTH="$1"
+  HEIGHT="$2"
+  TARGET="$3"
+
+  echo "Building ${TARGET}"
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+    --export-width="${WIDTH}" \
+    --export-height="${HEIGHT}" \
+    --export-filename="${TARGET_PNG}" \
+    "${SOURCE_FASTLANE}"
+
+  optipng ${OPTIPNG_OPTIONS} "${TARGET_PNG}"
+}
+
+# build launch images (splash screen)
+function build_launch_image() {
+  ICON_SIZE="$1"
+  TARGET="$2"
+
+  echo "Building ${TARGET}"
+
+  TARGET_PNG="${TARGET}.png"
+
+  inkscape \
+    --export-width="${ICON_SIZE}" \
+    --export-height="${ICON_SIZE}" \
+    --export-filename="${TARGET_PNG}" \
+    "${SOURCE_LAUNCH_IMAGE}"
+
+  optipng ${OPTIPNG_OPTIONS} "${TARGET_PNG}"
+}
+
+build_application_icon 72 "${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher"
+build_application_icon 48 "${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher"
+build_application_icon 96 "${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher"
+build_application_icon 144 "${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher"
+build_application_icon 192 "${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher"
+build_application_icon 512 "${BASE_DIR}/fastlane/metadata/android/en-US/images/icon"
+
+build_launch_image 72 "${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/launch_image"
+build_launch_image 48 "${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/launch_image"
+build_launch_image 96 "${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/launch_image"
+build_launch_image 144 "${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/launch_image"
+build_launch_image 192 "${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/launch_image"
+
+build_fastlane_image 1024 500 "${BASE_DIR}/fastlane/metadata/android/en-US/images/featureGraphic"
diff --git a/icons/menu_demo.svg b/icons/menu_demo.svg
new file mode 100644
index 0000000..f1ae7ea
--- /dev/null
+++ b/icons/menu_demo.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><defs><radialGradient id="radialGradient876" cx="51" cy="51" r="51" gradientUnits="userSpaceOnUse"><stop stop-color="#94bc4f" offset=".53489"/><stop stop-color="#e84e34" offset="1"/></radialGradient></defs><rect x="1" y="1" width="100" height="100" ry="0" fill="url(#radialGradient876)" stroke="#000" stroke-width="2"/><path d="m50.952 32.393c1.3622-0.0046 4.9652 11.398 6.07 12.195 1.1048 0.79696 13.062 0.61914 13.487 1.9133s-9.3059 8.2444-9.7225 9.5414c-0.41657 1.297 3.4475 12.614 2.3481 13.418-1.0993 0.80441-10.717-6.3028-12.079-6.2982-1.3622 0.0046-10.931 7.1767-12.036 6.3797s2.6827-12.14 2.2574-13.434c-0.42533-1.2941-10.203-8.1785-9.7868-9.4754 0.41657-1.297 12.375-1.2 13.474-2.0044s4.6252-12.231 5.9874-12.236z" fill="#fff" stroke="#030303" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="6" stroke-width="3.3"/></svg>
diff --git a/lib/main.dart b/lib/main.dart
index a8c43d2..1075151 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,65 +1,49 @@
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:provider/provider.dart';
+
+import 'package:random/provider/data.dart';
+import 'package:random/screens/demo.dart';
+import 'package:random/screens/home.dart';
 
 void main() {
-  runApp(MyApp());
+  WidgetsFlutterBinding.ensureInitialized();
+  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
+      .then((value) => runApp(MyApp()));
 }
 
 class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    return MaterialApp(
-      title: 'Flutter Demo',
-      theme: ThemeData(
-        primarySwatch: Colors.blue,
-      ),
-      home: MyHomePage(title: 'Flutter Demo Home Page'),
-    );
-  }
-}
-
-class MyHomePage extends StatefulWidget {
-  MyHomePage({Key? key, required this.title}) : super(key: key);
-
-  final String title;
-
-  @override
-  _MyHomePageState createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State<MyHomePage> {
-  int _counter = 0;
-
-  void _incrementCounter() {
-    setState(() {
-      _counter++;
-    });
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      appBar: AppBar(
-        title: Text(widget.title),
-      ),
-      body: Center(
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.center,
-          children: <Widget>[
-            Text(
-              'You have pushed the button this many times:',
-            ),
-            Text(
-              '$_counter',
-              style: Theme.of(context).textTheme.headline4,
-            ),
-          ],
-        ),
-      ),
-      floatingActionButton: FloatingActionButton(
-        onPressed: _incrementCounter,
-        tooltip: 'Increment',
-        child: Icon(Icons.add),
-      ),
+    return ChangeNotifierProvider(
+      create: (BuildContext context) => Data(),
+      child: Consumer<Data>(builder: (context, data, child) {
+        return MaterialApp(
+          title: 'Jeux de mots et lettres',
+          theme: ThemeData(
+            primarySwatch: Colors.blue,
+          ),
+          home: Home(),
+          onGenerateRoute: (settings) {
+            switch (settings.name) {
+              case '/demo':
+                {
+                  return MaterialPageRoute(
+                    builder: (context) => DemoPage(),
+                  );
+                }
+
+              default:
+                {
+                  print("Unknown menu entry: " + settings.name.toString());
+                }
+                break;
+            }
+
+            return null;
+          },
+        );
+      }),
     );
   }
 }
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
new file mode 100644
index 0000000..6b8cf9f
--- /dev/null
+++ b/lib/provider/data.dart
@@ -0,0 +1,3 @@
+import 'package:flutter/foundation.dart';
+
+class Data extends ChangeNotifier {}
diff --git a/lib/screens/demo.dart b/lib/screens/demo.dart
new file mode 100644
index 0000000..82e0985
--- /dev/null
+++ b/lib/screens/demo.dart
@@ -0,0 +1,50 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+import 'package:random/provider/data.dart';
+
+class DemoPage extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    Data myProvider = Provider.of<Data>(context);
+
+    Scaffold pageContent = Scaffold(
+      appBar: AppBar(
+        elevation: 0,
+        actions: <Widget>[
+          IconButton(
+            icon: const Icon(Icons.loop),
+            onPressed: () => print(myProvider),
+          ),
+        ],
+      ),
+      backgroundColor: Colors.blue,
+      body: Center(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            Text('TOP'),
+            SizedBox(height: 2),
+            Text('BOTTOM'),
+          ],
+        ),
+      ),
+    );
+
+    return SizedBox.expand(
+      child: Container(
+        child: FittedBox(
+          fit: BoxFit.contain,
+          alignment: Alignment.center,
+          child: SizedBox(
+            height: (MediaQuery.of(context).size.height),
+            width: (MediaQuery.of(context).size.width),
+            child: pageContent,
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
new file mode 100644
index 0000000..d8705c7
--- /dev/null
+++ b/lib/screens/home.dart
@@ -0,0 +1,65 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+import 'package:random/provider/data.dart';
+
+class Home extends StatelessWidget {
+  static const String id = 'home';
+
+  Future<void> resetGame(Data myProvider) async {}
+
+  @override
+  Widget build(BuildContext context) {
+    Data myProvider = Provider.of<Data>(context);
+
+    Container _buildMenuItemContainer(String code, Color color) {
+      double imageSize = 150;
+
+      String imageAsset = 'assets/menu/' + code + '.png';
+
+      return Container(
+        margin: EdgeInsets.all(2),
+        decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(8),
+          border: Border.all(
+            color: Colors.teal,
+            width: 8,
+          ),
+        ),
+        child: TextButton(
+          style: TextButton.styleFrom(
+            padding: EdgeInsets.all(15),
+            backgroundColor: color,
+          ),
+          child: Image(
+            image: AssetImage(imageAsset),
+            width: imageSize,
+            height: imageSize,
+            fit: BoxFit.fill,
+          ),
+          onPressed: () {
+            resetGame(myProvider);
+            Navigator.pushNamed(
+              context,
+              '/' + code,
+            );
+          },
+        ),
+      );
+    }
+
+    return Scaffold(
+      backgroundColor: Colors.blue,
+      body: Center(
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+          crossAxisAlignment: CrossAxisAlignment.center,
+          mainAxisSize: MainAxisSize.max,
+          children: <Widget>[
+            _buildMenuItemContainer('demo', Colors.pink),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/pubspec.lock b/pubspec.lock
index e15edce..8fc5a8b 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -74,6 +74,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.8.0"
+  nested:
+    dependency: transitive
+    description:
+      name: nested
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
   path:
     dependency: transitive
     description:
@@ -81,6 +88,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.8.2"
+  provider:
+    dependency: "direct main"
+    description:
+      name: provider
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "6.0.4"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -137,3 +151,4 @@ packages:
     version: "2.1.2"
 sdks:
   dart: ">=2.17.0-0 <3.0.0"
+  flutter: ">=1.16.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 7d2d72d..35e4ed1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,6 @@
 name: random
 description: A random application.
-publish_to: 'none'
+publish_to: "none"
 version: 1.0.0+1
 
 environment:
@@ -9,6 +9,7 @@ environment:
 dependencies:
   flutter:
     sdk: flutter
+  provider: ^6.0.2
 
 dev_dependencies:
   flutter_test:
@@ -16,3 +17,5 @@ dev_dependencies:
 
 flutter:
   uses-material-design: true
+  assets:
+    - assets/menu/
-- 
GitLab