From 0045501c5ef876e4bf3af8e2c7020f62806b77d3 Mon Sep 17 00:00:00 2001 From: Alex Hirsch Date: Mon, 31 Dec 2018 15:26:22 +0100 Subject: [PATCH] Initial commit --- README.md | 71 +++++ example_input.md | 16 ++ images/fib_ast.png | Bin 0 -> 33903 bytes specification.md | 647 +++++++++++++++++++++++++++++++++++++++++++++ submission.md | 66 +++++ 5 files changed, 800 insertions(+) create mode 100644 README.md create mode 100644 example_input.md create mode 100644 images/fib_ast.png create mode 100644 specification.md create mode 100644 submission.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f35586 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Compiler Construction + +| Date | Deadline | +| ---------- | --------------- | +| 2019-03-15 | [Example Input] | +| 2019-04-05 | Milestone 1 | +| 2019-05-03 | Milestone 2 | +| 2019-05-24 | Milestone 3 | +| 2019-06-14 | Milestone 4 | +| 2019-06-21 | Milestone 5 | +| 2019-06-30 | Final | + +[Example Input](example_input.md) + +- [mC Compiler Specification](specification.md) +- [Getting Started Code-base](https://git.uibk.ac.at/c7031162/mcc) +- [Submission Guideline](submission.md) + +## Structure + +The ultimate goal of this course is to build a working compiler according to the given specification. + +You are not allowed to use code from other people participating in this course or code that has been submitted previously by somebody else. +However, a *getting started* code-base is provided. + +You will be able to work on your compiler during the lab. +I'll be present for questions all the time, yet a big part of this course is to acquire the necessary knowledge yourself. + +Please note that minor modifications may be made to the specification until 1 week before the final deadline. +Therefore, double check for modifications before submitting β€” Git provides you the diff anyway. + +Apart from this, there will be one *required* submissions near the beginning of the semester. +You have to submit an additional example input, which may be added to the set of example inputs β€” this way the number of integration tests is extended. + +Furthermore, there are five *optional* milestones. +They provide a golden thread and enable you to receive feedback, plus you get a feel for my reviewing scheme. + +You can work together in teams of 1–3 people. Teams may span across pro-seminar groups. + +## Grading + +Your final grade is determined mostly by the final submission. +A positive grade for your final submission is required to pass this course. + +In addition to this, I'll do short QA sessions during the course which influence your final grade. + +Other submissions are not graded. + +Be sure to adhere to the specification, deviating from it (without stating a proper reason) will negatively impact your grade. + +### Evaluation System + +I'll be using a virtualised, updated Ubuntu 18.04 LTS (64 bit) to examine your submissions. +The submitted code has to compile and run on this system. +This information tells you which software versions I'll be using. + +### Absence + +You must not be absent more than three times to pass this course. +You do not have to inform me of your absence. + +## Contacting Me + +If you have questions or want to know more about a certain topic, I am always glad to help. +You can find me in room 2W05 of the ICT building. + +You can also contact me by email, just be sure to send it from your university account. +Please keep your email informal and include the course number in the subject. +Preferably use the following link. + +πŸ“§ [send email](mailto:alexander.hirsch@uibk.ac.at?subject=703807%20-%20) diff --git a/example_input.md b/example_input.md new file mode 100644 index 0000000..695859f --- /dev/null +++ b/example_input.md @@ -0,0 +1,16 @@ +# Example Input + +Some example inputs for the compiler are already provided. +These examples are to be used as integration tests. + +Your initial task is to create another example which may be added to the set. + +Try to use as many features of the mC language as possible. +The example may read form `stdin` and write to `stdout` using the built-in functions. + +Provide an `.stdin.txt` and `.stdout.txt` for verification purposes. + +The getting started code-base provides a stub for the mC compiler. +It converts mC to C and compiles it using GCC. + +See [Submission Guideline](submission.md). diff --git a/images/fib_ast.png b/images/fib_ast.png new file mode 100644 index 0000000000000000000000000000000000000000..35a61fa589e7e17893b8e09de26dd414227c42db GIT binary patch literal 33903 zcmcG$2|Sl?zcqSG8Yrbmiliu0WGa*)QHIDol&Fv*Gi9bhgUS?AnKFhDDP(LAl9DmW zOl69Una{drFFUhC54+q#6m%HG>&+)sf12K^XY$Astp@4-&rKS&KrX>>na6XW#mj8QlbZiG6N zcb}2`8G44<5r33!rI*4VCxcp@DJm!-B4XoETTzSis*WVOrAr^%w!Tab z5dk!@5vLjdUSO>sJFc_)h61_zMn$gW_+wRE5H0>#rd2_MKd$g%*(l!w|I>Z_FMcd^ zMO7$Y_xOBrLc-7ZK-tT!`|58>XsH+RXX9S5$r@4gp-l~e!*|T{j{W!;6&4Zk7~j`cUrf`XuUSD8%8w=6BzESu_jE67 zVq#+7&(HCjL{47~7dl}j{dJeeOkeWEtL2cFq@EsgB_*X4t@uOIPT!A2JH=o8^^H%(s{Zlk z)xFh$eci`vRvA=DFZ=xYb8e0umB+RxjXU}gZS0py>6G2uwsj@t21}ga$_;$}q`dKo zQGEFp4?&OVEVFXm5^t~RnHhc&k>A%|xTV>ex6rxS3^b72qVwk3 z>WR9eawoBpi=v?`9CD)gZV zHMxy_)01}o8Px5KPvKF)uVuB&8MD6%gv;mgP^vS-mGK7qd=?71S^8H-W!QV#?Ks#d zQX##A>NtXANPOS0{gth)kN2wZ9@7oqT|&&u{8@PB-9*oxa`=y{DleP;-uT$D2c6ta ztSl^H-3u8f3b^MlUj1VwVO1Z*T~=PsdM;xw@BMFeW#u4ly-btVvy4>YdgSJ4=Z_yd zRUXLscs~l@X7$4gpDPdGP(}3MBgC!hc~!Inx5zl2kh4}*vmL97D$@%X?tF8dXMQSz z@)bh{Gg~(mBu%8#uUZv4ZrMCBIeDSqps4+)wRJ;k*sqdBZ#NH*G@F(e(w={wV!s}- znz(W`4av=oya`E|pPgboc5So8=pPflfsN)I>nZykC`&!v)qC6PD}uM{6kc+xkYSH~+ql8uH20_Evyu3VxqOYnBA(4?!`1MkG#l>}>S$--` zu^CyQvlrONwcJ;Gu#D9-w4lHvMJNQd?_R5IlbUdmxir16wm(W)qG9y|2?^V8l0{=5 z_a((|9Q#!;Z1pYAA=T(vQXem+%GVUVb|uB@h#aC{vt}>Hn+Us-`9|lZR3iKK|9Z9i zFBQq`hp4nhr_Ib**x1fVFSCDxzmkQj6QP)O5LQC3+S^TogM;ZA8TW9|A*GuUP` zrOJ;$3SAOz(KpihroZOVl~mmn?Z+*}p3~Vojz&MZF!YsW<^@fx_*0{Bi~Ec;6z{QD zuU1La-?{9zO}aY{`g_Q-7+~k%AajR zE3b0+e>60CzVRyIlE(&_Cb(3{k|j%W+{V5SmakjC{%@T8>AFSFz@XEVae`&ThNP=k zuMWBhnG`;L`gFJ7wQE*gZ*RKyCEg1S2??41Q_ku0#Ig5%<(X&a&^+E(R0MJFGRjtr zj*dQ7=$bWVB1q*)VqfI>*0Qq;s(dZ+De<1^+j(b;%rP1F@fwshW?TV5YyBx&CeHqIi#I64;{Kzytv?j>>OB_9X1&IUj6*!t0m3n_i)I#>)zQU z5%Q+9BKn}LLzkj@^nRn|Yqsd#-J#B{vQs0n2A$yf=`#B5LAtVGxBOVkIKFagEcb~13W4d{S8%F0S}LV^wGw? z#076Z+>d@+pQ4kDF22Y1+v8uY1+2er(fFPYAbI`GCbxBmO6rM%3l~xXZr-ePi9%`l ziEj^CV5cdG#&)^6yIakS_st;V>yy+sHxErJ99ct^agv3||MJC9MH|ch?C|TRCq{P% zq@(s-)JI`*I=u^-mxLhk)3$@F56g#9E++A>xDTf<4q-dm-=d( z<94vX;aITbWve$;R8^^|KM?;s*!;}mS+j12u@rjmx!MF3_tDCo4Nr{3@(T*m&7$*q&}y9*}}`bG&%*9%(!$PP}yf z>`Ozts>GeLS4WSO=L?ch*uuorIqn5O^jPWE1`^Tl!vube&(r#*nE^(|DpyDCGuVDO zAmKKx{FaF9B^0kST0Q;h)eU90SbOay$*R=_Q>7Mwr1)BI)x9P^2G*YM-;)y6?xh~N zFPgNS#<%M9Rd!1ACm!@d_45xjRK6Mh`@aoM&Hq(4T@l6mT!!0D+!HqaXc8VBEu=C! zGE!lp|Khw+`te+isWy+yI z8YnB@Sihcz8hy=luQ6CjYL z9Fm-zjLQg^nwlQ0q$mTjysEsMoSYMb&0^)x%ZDx$xKI63XIoCODj>qw4c^=tjk0rS z(hD$oXSD0*HIqW(}aV&O4gYGT_wMtDE<`KCP{-4ULY@IB;dz{Qz1j&!4aw-kSitIUZBCbt2p< z_wU~y{rx+b8@a_NDq3qFC--kW$Jc>m;I`doYqst(E&k@b>fRpv4td1y2j^AP?f^ak zN^>bY<8{QgxzUDPW7`7<4xm#cEk2-1d2k2+|8=-BT~E)#Xs=15R<|Ef{0143=l8Uz z+f|);mSUXmXjKz?>Co+skI+gKj?hyTf#jJ>tJ$O+6M)f=ooy*_?h6TEmx@E)5R^Ux zu0e0pLirYwBq^)Ewt6$S3InT9Ju=1Is1cu=EeIe>V0%cy#6T0P>LIFh0st>ILi*yb zNNzrEZbcN>+(H>_xXeVoj?|0Q6t6oF1#eRJp|>*o_tV=v#5RQ_eE9G|p=AfP)rWlT zTFBkIJSrCNL;1#SEW<{hcu|!91_ZA^Q&qO}ie zGLtz2C}G!T41(DN^}^rN zhthl?a-E$r{?=kwl8$cQ2TW5Lqb`|IjIj-5x(ojdn(AfsTsVte4vqNz49 zj^&i;r@%}(am@4ra#W)KzTi$G>!TyC4Y zn#a^Hy(`OBA1Tkz`0(Kf)QDrxt(zKIO+8QHnV3D$6{stdzgp7(!K~1X%i?aUg*<%t zFzLwsI7lT{ct*0CS>;&GjUnOTNxr_+^q)UJAKDf3T`*N^M?*yr3h?u*5~Yfr;(g)Y zlq^SuZYAOqsmyC+|HOU?bLjgdyc@;ko_>b$Ica)|*&3+Gm&RjqPzzU(@S1VHvr*)= zbL2zPm4;di3;@PMTW$B^$^Cio7~tk z)~0Bp@p!6fNpYW~UsvxvQ+-Fr>@y!D|K6w?+4Y?&5a94(X)U$|>ZV>3dRd$tCADdp z#i_aN-p3CIum{J)#E=_!vKxIzW3*&(w#5I=oraQyiOh9+?|Ax#eHIJe-xJQnDnAHV zLX|P1>O^jpmOi#P_d^aBwa7 zgOoq_o}XE_S2~(!`}TuKcY`$j^zq;2oDUIsWhC-6-@Xgv%)GnvsMY5G8l9mlYmnu>($dHl*hjLyTx#`g7@Wgv8igsWGV zwmN;1*|hJ%lS6@9Y^2XTnuXk0kLqRf<>>)%hmTH0>vw8A22O)^63oacJNWk_|30+& z+@If2!)^y~%4L+y57`mg$(^E|sOtXxzNI)S6tE7PhS8rbo+Ae)ettfsJcb8mMjl6io1 z{ix(0Orl-rHeG*nihmQ8x3oBAJ!Sj3ePMF1*TVD)a)mX-OB_XM-o3kz4@o(n2EfQ{{<}O2D z^?;VeIasJjLZWj|0!H=MCf*7cHqGehI9cal{1uT<|IG5JO?&Z)p_W{dWX8*|F}Ah1 z)p}6M=T;4>0{TyOb0iyrZQre}tDC?cM4%oBU6Jac?C-vQ{n{B3SN!MuvLjK_dZ>(b zs9b+T;}z=fx2u`OGpcChdWwoyxA@FC)H(Qv#l~*s*zc;joRK}~ANBHfd=PEvY9fC> zJ5yc%=-_hFKAj^^{~!;Iotglt2Q7~l#r^%`duIkr7gHsy8-F7H0W-yLf9}8Xf8;p! zs?LvA2@_C`+IEuJ3H!C|iP5t|oSq|>00<7VmC!+NQB_r~1&t=R*-d1{CFI)VLNy21 z^g;U<NQqHG^Wp+VurlCI)X^DLAQq)L$4hRpLXU-%g9gVS-R=wHX+4-o+)aL}J z&s-Kh)(qWoBU$twvxZbX2*33ui}Q9elV8k|xBzeB#Bh#;MaaTsu2$Oc{Hz(iA;>RwZauKP82CKosuUnDj*-?6l zG<3!-`yZ=@@w2HKxbFv-@xOJe4m1%01-D9NWhHr{@ju;x07(7U)-RF&e3DVhS9|#L zVNSjInTh9+QwA*r3^H^P9nh4N*)E3cZF4=??ll#)ZTt2xP{)gHZik_ce1`1I!o+k+ zdJDzOhAt3l1u#!|d4k*z(KQg!5N4?m^<&$LJgi?`rn|O2T!@Q{>+91~SKf#3N&|X9 z`FP*jdICd(x>+kZ=3tW zRdClXbpR*v&{co=r+kWYPX$wyte13o_LIJKWUPs3a`_Q;@xcxKRGIObgZ}>h=%ry9 ze7(35&)>Mr0b*v?**l^B$r6owvpgkJ@+N^S+{0l5A0nl6R&U;;dtcPT83Ef5zLp>ShBh`7-HnPogQ~Pi z&b#nqq*Ofe_}t)^tmeSP&5T_$y+zFwDyo11srHU%`}roOu56a04Jn3>;U z6FXEgH+lc*nYTVxO7w5HZZP=CLHGAPip{o{HfEK2RAb>5fMQ@zsG$JkkBuLM!vEfI;L+O@g5)ps*2?>@g0=&fd&|oz@rxaSmo}H zkOZW^H89-h)Kn9Ab>wFK=^xdiX75(vGu1j$p$V>FH zM4_)9DiMFu;d5-&xv8X?;=#*CS>b>)k^Z877RFJ z{ud6EfA?dgelTZw9v%s2sbiTSx4=of^?lxMb ziuU$)%!rqL5voV?4a1hP)n0DH$|xmqS>-DvP;Iwdd=|4$ecjZJV(W~`1{G5fP>AC z7hFi+;@Uw&R4k0dc3EHuv=dY~h?^8H_)xU}DGNi-sQ&wzbV*OBL}PRgEX{NC%5`L@ zDO@;mnJhpkKeJ;j^FDCcnaQCvXlw(wgo`yX0aQP{go>?y6hxa?4>22)xQKZRInw+8 z{*)@TCDljB1w}H81vYq&IR&OK#1nN%`)#%$JwP9gNXbXgakbaTj0cggbu8|-pyTa) zVb`94QX>GSUvP0a3E|Oknzu)Oy#Jv&q2^Q#ZAel6Qd0py~_G{n+wT zbbnh>0g>u4(vq}k$Aqo1r}Az?#)*A;DcWV{X6dNd1Z-iMAvP)6d*&PooAo=6)BybT z^!E1FuOdy=&@h64E8uf!m-ZcR-@SVffEYc6Clqn{^-YTO4CK|ZtkZt4-@LhF@q2VM z1VuJ$eqR+diPXP}4}1crBvaP&5@4Q*2&({wM@(Bm6X;XsX+xSefaFTCGlIiYJgc_j zqsN*pV+bKak228J)eR7hhLnWnb*>_a3r`aYj`kQ`sv=uZMH@480Fz{ri3s}sug}xK zdZ9dQt;!~Z6GnmeC?Lo(GKeL`8}hL(V%TQV`#<#(bd8&7MP&B5%l_%0MVu*@%uhbN zwuVy(*$%#b_Cth7>hatRVtWGtNrlQrCM@UoJj8GAK8%dqXNPi~1n(vwL;LRRZL5I^ zDjm_023R2tE%Fg(e63JPccERotV>_55*&FXdyI`E$wMINi2NFAVT5K=+rGGP5t!3} z+`-J$a3+#D4Pbg^@Y$zPFJW$O?v36Pz)uYFSwZ*jpM%_6jRD0oc>JA>A9Ww@uaU5OcDSDPAd{4(wm-VMd zdv~cc4rG?t0v{W4dW{G3RFbf>FbYR!wS9iB?j4cI!*Fd(SU|+zqF?7mP6w}JW;RD{ z$<;K`IiQk_{eo%0;zY4$GpSgJEDM!vsKKY9*1d9vBQ6~S%mD}`dEZ@)iy)w!Y7CTH zi0~@G0)``&;IVUEe|V|EEQB;cl_r^wAg+xd1Qrcx2A|+U%*LO>1IaPo7-eLm0zSci zA4lju=QjEzw^%p~-aUB#aXtl-i?P_u% z+O1lM3;O1uMPFZEBi6-^tOpPR77nJ2kG~5sJwG1u#G(5gp2`T2@`KhUF)=YRD6Xoj ztHWJ9knwoIQ#k|UhU58UOjk98dr-p+9u+2CewiI)S^4#Xv9WPLFYFyJ@yPjt($Zf; zLI-RBx%P%K|M zRMVSKmeMk4kg7x)hklTTtnBk+HK}kZLc}T)iSgMzG|TykOdljb7y+0nA%THM1AfT- z>9`V-fGAPc4&Y-kni7D%nv)~0Qu}WK}69uNfFz+Ak63s^nmqf`^hA^|T z8pKZA($=SW+0bOJfZXxMoW=M@n^V`>PW}pqj~_nNe~v#){9ArkukuPrOuTGKhsW&i z@XwERgM13GsWEZnl7Yx$#0nWCkh(HFv+Gz+5I4rFQson+W*8|UzX!Ftp=I^Bnl!pR z-*@qsajfy3&3iw(?AxIWGeT{8Nz!JFaI|74vb_x}_%C2)PMnV1M&XHwHOrXuu8CwA z1Y+SAu@M`)_@`X1KGRgLXmMed$cZLyy*bEn1M+a zw-G=kiE8@s!uZ31$FTIzxQ*7x%{`T{{K#$%2bBKVvyU-$eFAMG4HdEx96H+U;{=%T z6A)(0817@q8XRiclPe!0TJan?+(wuNHDbR6F||vB#?$DtFvdB6$s0+IT~Owc0N_8b zWwyGlpr_A9BpC2!ro{F)W!gbs`X~*xcQX5ljj7kD33?_^9FKsB_$*12p_!L;PSBs^D_bq zsx%3gSd^2Ik@0B8ZKXqEIWZ>Nt*AlmeJ}H^C-){*!3FX|yKGg>a!$`!qT43kGvOck zHi(O-TpVtbb{~IC=8#H<4-XK#Zz!J*IvNi=5X25iS^+eG=NE@fF!|96@9&n9@)a=ho=$-OTuEI`B*atdOoL`=jUm7CYa z1gvsQl9;gFyKe5R2ksb@>cw2M33*1~aO;H@o0mVLJ;V_|m~~V(H5m|EjJ+zJ{=OMH z^-)CdbTKQ{;eI}R!iSZ2*-4U24arA2=OK%c^>~&XvGpRbOGpBs^c$6q)NR|giGz8w zypwZ6YBZAD;B8srn+9}kPXq3QyB~t={THs~-L>#Kb<{f-sPAC_+@6nkdwfqZY!D>L z4*_WnG18{$BnR{3od37y8^^LQd<9oic9H4fKivA1d&*SBDNjU z)GbliSw~Uj=z}ec$kdx`4PGdMy2V+a#iNkl#F>~VM<}8h z-DGfz3IkB&Qf&qjUyG?gs|OMcR+OV5A)mO(oszC@^6MXP-3styldNZ+ex`{! zo3H|L{yp4d)AK!i>Tr1V86B`hJ(Sa(JFW;w_jl ziMx-Vg();j&c}q9OTi*TLqiivOXaI0L=J)oHh#D-Hnz*3mmMN_cJp~RS@>KsU`yM% z<8m4slvqrU#yr0PCZiRW*p|#+*qOA%cOYJga&rY-W9H-(uF59PEm#3k?b?e8|3E#@ zaT(C3k6n+0CB3tG7Dl9C-K{NUnVz0b0RwRh2x&RLXCa2JBLsITe z^cPZ5U~47j4}9G2h^OO_+uzsh(g}EwoUls4b_A!ihT{=g*Me zo6ef`NB5uFjc37+!swYlIJ;%bmj0I9Obq1hcC%1DcN7@sVlW;wfxJ_-u&g2t;0y5p z^W0eobu(zu#QwQ6SrPIc1h*)!5}b;0hb+Dt0l;_s#S>bB_J^WR3aK==iueN(IUc++8^TL7wYK`R;AVKtPr7 z@gH*|s49Jc!TOlu^diLZ&-^&H5-2knfw_;hq|N7>H*fOox#xrdduU)_AUCmTp^{x& z&vFDPvcECiTKZ6MJ}^E|tw;6Buq2p*^x=0-B$H>+;b72}0hkSTbI|(U$}*acD!Qiq z=FOY!?NxIJ2uo5Ozvury&SAwXZboW_?>c@4pE(WR+VqS1fu}7)Zqdn0V#lF8a?eli z3MCdM!K$wCs$Byc!^~kkfL`*BXzoa>{0|ilT9q?CZ^yGPG_;VV>XJK5eIt&a|C00t z_2=KtlKt-~X2uVy&)ls(BgR2X`EEP-FV+7|Z0a{Ot!}(glRn8i4NohY#W$3~qVZf5=J3h6~3&-eKQ@cB8~~U5zv; zqNt)Jo*E^F2IM5+TrOT#f1 zax8)PJjl=zwN8wKiEcOWJG6HXX^+V#MC%6-5}M7rFJ@_l6@0TC`f`ffBJhYT z4#|-rG^q)aOt$afMGyzM9h`*@P`xk)qk*8xv2633f9;#ZD)jwRj4;gq_}q{Ar^0;N z1j)YQNENpVK_?<+*U*!y?amu(dh6WF&^45+p^-m@iMP-xfC6&o8+IK_fIfWg?G2`{ zu&4AH<`I3#O?DE{TrC9SW3GZ$ArxI;>`DO65a-bzm1OfmZEv?{#1mIOk70l+npcSb zwsjOaK=+2{HUKCFAPuOU;wZ;Tii$tUu?KW|aRB*wz=5RgaTJP$OREbC2!5k;Io;Mh zV{ZPfwm4I^Zwh)ylb6PU(V3Zc%Z)pqagpv>t+PbJ_6w@ zUsf1?(ZARf9oN*!=J)^0xPYRk!3;^~zcMcHdlcv{A?_+-8ryD zrTLJKt_U&4*u0MH>y)k00kuH*9SMp?b76IDA)$sd4Hy@M{g6g!_>6G@ePr5Jx3S~b zLzYv#N8qwU@%nEZLj89mfdB0}*sQ+Xci=`q03aAD;4+w7`C&(QzP*lb&mMggF;R{; ze6DMHg&?G05+DSVhe`;XPGn+&G2O#}t`KxMc)?Dg@)Jq%Uq)EIED(Q7X@%fat@vw$ z7xoQ5^87OkMnIL)HUFI^_ztM4sp$Y77ys#EAjgTozl3Y&=i!-n335nC8q~xb}D~ z0>vQ+bNr*CLMkRECLu&WWSK6eLiZcRa2Un#C=H>JHiFW-biG{(?d_1<;@mTxNrqVS z*r4sEC5sCML=;8M?L+Qp0memTn?lw<-Z`isq=FKr%S6dpZ#vt1H8Xve68ly%@E{FG&c$-yh+W6kQ`RLS9X5)ZuYgJp{qqkktmw+Bsv#UV zZ!ll;i`;ru-q3I(#^L@xi?i*9g{~s?R?`Qs_(k4GRaJpi$i!nv;%!+O*WSIXLPA24 zZlei<%8ChFM~}0rB-Zuq1|jx@Bw(2Dm>9<>dzx!!T&nglSgRlkbfeXsZF#ZFef;Mo zm?z%{C@RvwQZTt?VQIO2>sAVfq-b#}YAvefK5Zt!9z|U}RYCZHEiJF(M3ouFEgL26 zw-ztVST_gXP^NLsySU3`alva9yX0DoAj;6yKc^qx+Z^nF>hDFZfL)xNoID|Ey25d} z8%O0L_g!QpBigqamle5}Gq~+??tZu0)x%@^u3f9Iui-odx1jl9ekKMfCcUr_1}W;X zF8@`z^DV>w@&fqzJwgZBDCfQ3wyp3cAnlg$@bK(-rr@P>PKDu89+QHQTZ3X^0-?k4 zy|_(Fp20;`xW|u-SqH!6uLpa*cK!PDUu{JK`_?h3l;YvpW!#xT%IqB-Ut@;xxzNq2 zIru$}e{*bb+?E>h1kr&m}w#1iD>Tb_>G!dRm$QT&jY&INMr0|I;(ooBqtqY{Tk< ze2P9W)&9He@AToXh5moz=FLm^iTyG%S*PAC!>U)v8&;@)gN8K%A8Z#i*|Ll6Udz)P zT?4u;$fAqBgX^uavGEVcJrg_oZ4gnV6PqvJunPE{BbLg{wY1G+SVqvKa3e6#8yNL1 z4yTHf=j1or)kDR8KKm4KC&#*pu`c;&IrN>U@bJWcja5(#dvi2*<@@StB~8t>-V4)~ zii(O`@z#I~3H*QeTJ*bu37nYBNbz#Wkt4u@W*FMxuxIq3p`tErUX}mN%8Cl#z`!+- z5-wrB%4Wm1+_2*20sX$X^LQ59hCpJ-oy0(#|VTF0;4G zu>8Gc9ljn4gqxM*!p@z`kqfBRa^{D(#aX>mu-ztPT6`O+zmg?OjzYNaC>m@yyBrlU4Vf1A|Jb_Aanfu zPGJ~nn01;CT|WR{Z_e`XkPd(BXjpNlK7>bY?b@}zaJzJX<=?n*<8l3{!U{p7?4{7P z6rpQ%e*b=r9DmaMnwp}_HC&s>055@7=MR`UxJUuPLCF0svfH$iUc0=5^?UdEFT0KEunS0uwq#*O02KFneSN)^&*}`bo2#z)eXCf(wRXdXYY6aDAjy)D zP{N`uaV#@J%#x85cd~A0zdYrF%_az^maA{3Wo+{+#40__$$2v3q;X%A&SznIr?d2l z{4xH%qOEcM0>+kw!1{W}+BP-@`oVo>51ecK(s?D`Ebs$+#hNwc&}Rgm$9aB3OX}$9S(>iTaQygjXmxaeaKP8wQ>9!QST>BJI)zJr!jp)= zXG1TCfg2AdVursw4Kj?i>OBr9vKZujd~90c9TvX#+C+CZ8H*q=U)9#G%gD%3R#txe z;>UOC@QU47`?nB8MF6tr5U*cex(Hyc(v#hb-@bjjZ8;6z_ize?EDzkF?oj$3iTpKg zMxlR9)@qfpWQe7@YbJ|4;f(3|`SS)|NkR;RKbxQJMA1gs3==7gQM`uGUy4e69eO4_ z0F0#I<>p?zKW1rRaSG0-6^xAUaI!!c0zwz2OO!8$cV^&Xu75_j08c~!_K!sDrU4=; zgK24^F0}O9H+JeNjy~sDHPAO@nqDs`*awDj2_L*oRCFDH;{oDas#?J{0+;I=%rIV~ zt^hXEgsCQ$$ov8b85tY9QdA^EKuddS4jj2%Y!Q}A@>Raz0NkI5~X*-tP4f09Kh;PU7tOG*O7;N(!WR+`Yaar_{fAMJW;Ua zA1Dv0Pe0BIC4HmVnN@Rhb5G4HLqvZFTc3C0P%}SynRy5@LL8by9E8IzSm${@(#q!m z@A$}ZbCd3*;REeZ4O+5tLSkar%OmIN%wM{VB~e=i1qGK@?FFy0GX9E4XlbJEV)@GV3VgMdKVx^gbQPng2tDjL;hu=KZ^so?q8f6+a@BCRX@GOGz;TT28yQ**VOM4wNSsyCm^6ktqlkW zSmLX!qQW=o3WX%=0}eSVBx>J`jAZA!x)zLm1EmP;Ha^C@kX_T~j5TnUj(VD#%c`%h zKjRiUX`<xI--0Gy4GRm~2xM9D;e(({aqYW3O<9W9-ki{9=0}4?8$Vl@ zv>Jy?KEpFbzw2I5kS{PUW7lWS<4U#|B0cV`Z>W0xdWqG9+`;;`w&IFzo)atHR8=u3 ztRTgT8ed*Ci3s^p==UjIKkf6=QwL30>Q?~#WGZwQAtNKCoOT3kk@3H0>Ye{(j5&bL z+S+w;T7Oo&fg|@FG6k-+ zSp0fjbtHN}8p<|TlWV`j&`H< z-D#gR99Iwa+L?%Tro1z^ut1s0Hhd(WIANxgpO?24bpz~&U=`A>aj4wy}czwh|Y+^YSstqU{yDm;6^HhsW)SqQ%UtSycdThX1 zI#SAM83rJ2D}>*>Sr|KLz%V?aVo5rEUnRTn zr`s`RAL;_t(bs2G^eE+>g@r{}-Y@azxKWw04`PyzJu5(Bui_&Q*ZBL??_~LH%7y+V4|g&8)NfuWDgl--r%TXDyM%9 z1$A<;`3m00w4TI`tE(h%((2gptZEm*U>Y{}WEXxRIXP1zbDtI8l!e#t&c2wI_i;jiXvDTAsTBH zZa`hQ35W0vJX}LX$ulyrzFJgNw9vj65+YoRE9cGdM746080q-KUqE2eXJEq9%g;+m zO5UibQ2tHc){qRdjz2{2EOeIn9MsEONOIB_j603=-)|bmW~^gmWIT=5G}DXoSG%Yi zXubn$Mg;e-u)(pbE(nTUpfp`%I;VW}C@ZELU3ZVl@;R`Fh>{~vXjktOngaFoG&Q#( zkj(HDZxMuel8q=C^s(#W*3HstKCh~*JOE6K4*C>sF-QVc0SUY~Yq`$T({lvYq_BON zYnR{{1jny$`BxwwE^!^7=qJe7XVIG=jy#lg^}{=8SFTt=QNUla6Hag;(x8ApuK%T# zV2tA~G$e^|=;?hxoFQmGX^$eX?maQiUw7urnO>ncB(pk&1lC!Yo0m2XlO{V+`Yk^kmFU+#|a4#GY2VH zK!PJ8$o{-)Y<%&-A}@d^RcilZoe(HmdHMOB06bqxeB`QJ`S^7z%*-&7#LUwr*mNUa zT~dm&`INj`q*D2vu$b8T(s;R$%0F2_21hW9VcNX;7T_EM%3(P=-}}gz0mHZlZxn=H z!ShYfB6bjvC(PBv+&w|m&l3zjV!xXx1_OQ&nI2)@gp#DQcJti7jfZ5h!o=5Y2S@nhBBwUX^w7LL-669TcI zgXk&CfyH?Dg~VY1_UgljRdDy-j_BMuOcfGWI( zz4!um+%do76{~rrr8hy0a7A#!kXkKjLKD^uz`xXghLqEacAi1HN10VJ2&@I zB>ihhzq{c8Zw|h_ju6xh3~m$lE-qzw?~6USeBR5K1Qum)XSy%AVRRE3&`or=(@;-u z`1`*G95z2JdW=w1Bf*}AWbimrfg>X$Yo1#h0KZlQD4K`h(VKB3uLepNDXVZP9Dp`! zaah#qUq6@z{pd@bx8>uw8K?YXuW0f5m2DCdEZ}gv#l#M3XfT2xQWOC7D?pImYdlw^KtrJ=lFB%r z^EzwfPooqx%E7PC8OR~4S7IUTc7?x}!Tw6y@!9a{)2H$#CRvF7o184F!d?K$>J|L z=hkCABptezA}{T6f?*C8JCwXVj*gB&@K6h%w0gb?4B}p7=&H(BuV`>kp`xOqrX61% zH;W$$4+&YaeEITbhe}`a^1G7agC-`?-sjO^Hv7y^uwp861sI=Q&fC~gyKW2?nQZ`Z z$I>@|%JUSLV_-NkGExc}g0mQ+TLgP7)+%g;$UsO)a`H~06E72d&i|9r6bu*N!t8zY zvRs2X9uMr<;-ikHrZ3mQYa4l)_zpns`2E#7Gi+K)Cq);p3Sxja=Uk~dcMHazRjq#N ziQ1B6 z+@-4(RwN`R$3p_k^PZR9p%Hll<~*w1b8I!4^XyAfVUzWA&2JaaIp4evF4Ntb+qC_G z;6xV<>&}Y9b|rdpoAzaZtPM~`g`Bo9FfgDEZRXV)(t)GueCtaV!l`geS?8NY;cYqv zW9-aoBjEgU0Cn!2JlaAVMzxXQX21hV#q{b>OrQy8L0KX+7BbA;$l7tkFppZZnlpEV5cM%fME z0Q$0Z$Bv|mjBDs;hcq+-dJ+`hzf~~thjV!uT*pGAdS?-Yw%_tD;XQUV04Bi^A9LW$ z`)Sa16!K9S(ATQS8=roAdMX%Hyy8 z>Cg1|SrD~>fc+|}`m>}W!<BJUvq~hXY!S3f@u#0NnBo1IvF;ri-E_mJJhW>Ts*AB(MLS^Df zO!a~sa~0#xds0WSjG3bj3tF(!7x_&pDecL+{XkX1=*SVFFl`g; zUZxFk6(RlxL~PTYqz`tY4OSA6yRAx{72lUDEJOeZZ{5GY@a>f=AF8W?+d6hXJ%yE|0hT2p_c6@;}^-c(+R`xSBisY$9YHXT-eROKL! zTg)d(&eD261XUsDgl%JwRiHX!SKa_+k6?n{3H!J_MwjCyM;THYtneNZzvKhlGmC~5 zizVRrW^g0ntz&hIN{h8>!l%&6aKzyq8nqjpJgvuEzdL^zJ&y6-MQWW!mcw?hg!q9W zz@nVX?X#D2d%G=l2#gjV*ASrL;hIuuKSkJcqN=^8k|*2A=xhbbXFNED32$8I-Hyq6U))LfL)j4Bgz089B>}k+|sfe9{Q_MQ76)i z?R9MCycBrW9{qw5994RpZEw2%Y){J>$DCv7<5Na`xj+?F3nFawpy7!nKU7P|A&AMq z%B^|c9e;RN&K_*Adp+q&XPIy@GkJ|F`^6ArOf(Nd@Pg~u6W&V+sRrm0E{(ya7(EFK~RNewh;ukj) zFc*FWD*~L5U+c1h*8hL^4gNR_;fvSEbO3uCMl_u~cW$MnrRCLY*SgT(v%8@uS5#KM z!W&vY<7~g7kHXy#l|F)4j(8pguA;BI#F~Dp%7#6cI>++JbrKC$R&EKBmg$= ziJ`Kr1J7A&Tem9r!E*%sN=GqbH!MD~u3bx^&|rXX;IWK9!0d{Zzy?R{1YEZR-j9PYnx3?= zxdY4_hxQDSo1)n9{;xy&ZxwaN@J5ei9a@jF@Z5g}a9Hs)905d4eUhGD6^U8SOZ$r# z%Ylgkq5W>+J@xn2!@B6FyJx+2VS@7U<41zIkeOMSl2rC7zd$=);+hlFiCV>-%yqEq z<*PiFg*jb*BK}kI>H4hqO==5Snpq{mtk5ub5Ul3m;jwh-(heZL#E+aTEPi0jD5JW( z1!#$ozt^&`=slWFag^M11H6L450XAQL7waHZ4h`IKl^&H&snYEeV_M!e)n&34=^ ze%@9ko|BFnnwnlye4NDc{XL;z>F+FbuzL~*k;LR<0M{0>7f`}LnDha(ueID|+MO75 ziH4e_5CN?TU#C4gTQPuL)(K}4#B82>U4AHH(}X_%daXaNW_U5%S9Qq6R-0* zr!M|%&jZDx`{)unYP`l&&bG{t-^tNSaHz4ViEr1A(sfocymy%w zC+477F1HPZhE0tEU=M9e0G1C7+AJLxLCs7YgiD>L6$O@-$u6Wm@nvWOx4r{Nrb6 z=PwV_6sZ(Y5TRuc3(b1uSvs1pO|?5|7KulTC-Iv2eQ?CG9}TznO#e<&mW3H?3i~3z z%6~?%?M}GxoDn=h(fT$Oq3)qEV?<1KA43~pg^}KgD!$O{yS~I(mhs{@C-x24<`wq{ z<7OS88;0Ft=Dwe1h($$#8%gOOnzQHI=%wBK`$gVOS{>K^x?RHQJJ42@Z{u3OZUz^C8P(BKNCxlZAjXfVD^xU+w-cCw$VoJ3Rh zoc_Y|+E{e6ss{s{df)x%4}@U2H+1<>Q8>|7N-6%d-u zs|#CL+UjRrenY$TXydeqm>B)-w;;$a02Tvo7T{Q4!a5P9vh4T~waN|FHr$GUw6A-y zOTro>prouU27K7opr#;m<-RbAI136JI?D?W0)hrV&A1!JvceBu&<1gm{zam1Ma7BG zgal9jofH8DAOG0u|NAd^obs&{i4L)}yBo_YEAPj-P65|S5~6!Th^Cg-wiipI%E~N> z@AnrCeLZkyoA;CcmRTWLJyEhfAk{5$>YzZ+w^m6<)_7{8l=o^-c=?!qp%0&wzl_ym z?;?a4xSit#Xu2sXN#e%?#=P#_RdV$_$5?K>#J7Xl+}M&OSu>L*Evm#pWA|PLt8WDE zrK?_X4!0{l3`_i;Z3L%c@BiSkD1J}Eu>N0X1kg48f4#_mdLJKGi_gdMIT0q=53;IY zQ~hMZF@TyKbvg1FMai12Xj@TW&fz^0TAtWz>2=)*p51-;Q2hIsS2n17J}7qBu&d*2 zq_H3!d{brB)s1z5kIF&DuK(>fK_`!nHm5HVWwupls z#LUbrYSBl0s><9zn)PqXW&Z*G4R7d1fFtpq7aoJeK~!f!1``8Rjaw7=ns4rrXDS7B z#}PzHJAP-4v~c6|=ll#@&*~cDy7T@0r!y#5TC{qNP4$wq%Ld^uq`%x)6#vluHhvfn zc5DnNXP0yHqC*x&Nu`wQ%UeQ;o^ z_tH=9TedtbFpnyqkaXd3|c$?KMuV6Yk!zkP-9u1a?N^h6J(3FjR3SYZju zArTQBURKuDZb${R*KZ9%p0{;~ia>FDo{Dsuj&sL+?9QX6f z$Z*NPAi7=v`*55!5OkE2aRvSQ;JAuNXq&>wCguk#N}tyx@&#DB2{y z7BlBUf79HZ~#_KuNx04X5g z55!nI>V3Xsff}x>qa#H9S^y9Y3(@)L$8f!wD2!?~O`#;F28!G{@uMdl8&U zUg7t`ex!qceZEC5vA|Tfk?aZPvd6-Kb=rZ;*}FQuR!v8zDmXHtx`OuybcO+dm!aRJ zYn%+X_t_cXv+oD4{u@o9r%KCHA(xuut9etpvJwUd1{7z4;sHmAfl~IZs+$yJ1x}tk zxe){5!aOV|!ttT5o{mI=VD2CNKgLc|6eGBSeTU6PuL`T6^vH^F7OqdT?4_lplH=$Z zib;u$6$A6O>cZi|9kpoMqmRGMPjJpDhsHEfQ(aG)_Z^DxP0cf($fj)oLyat*EgC@J zxPzdjWpv+!dp1{8Si2dYZKZvnDhsnAPQ%DHFo;`2-Y=lciRaZPjz>6#h{o@Jvy`pl zlyr@x?C<^hgOx5WcaYdBnK;eRFg_!iVem-Vknr?9H#hh7r%wide`yEJA=wwO1G3Yu zfB;)NOO7iz9wdwIK)c7s2?+@W13AKpQx1+h_KvTgJ2tZQR5jiQvY4osAu23 z-3rUziJp5LagpjK=va*mt^5#7gg!fVl;I)v#DMc@zxuyR?&F(*7ZZ`io-M$D-C{r> z@iVATIvajRSD^shm82XhV=<9)<1C+)l)VCIk~=xdDcFBM?9AXUMz2}`tlwxPvl%O< zA2rFdQZ2k?@+1`0iQ&KHNm_I{-`R|NZ1u3q{uo#w5C{uL6m#S71>tJdt;O3wU%U z7#&Vs|0bv2lp{xUeq?G^!a=$2{g=J34W>_*V<0j)w&fMUfU>d3rTE9&W1d0Nu~(y$ znDisll5@v^z~3iu*OD?aVeoXLG`nIuF!^~D6@@wd$1 zK___j_S$1HyiMCFdReC3ZFt%6%+K7>Aqm5->!bSLSeZ#x7_RaNb7ILt=kM?Dvwizr z=x|~K10JjCHgs??HdP)p4wQU;xF<4>ud&Q^hHg@juuKY@Ja&wMc@3gm5T0-(-o|)X zigdwG`J_dmY9`f`+GS)5z|MV;=td;Su;nMFSminw{(1+2SF?W3gjs^0BZVU* z!;|%G1odkpFcSqKQT0ra#=ib(CoTlII7}g219=JouVPS_3jYHizh$Jqc zx9wjntMAZrl6)SPE+qUw?73r-!4V8`>SQx3s<<;J!e|Q^EF>Zl8XC%vaS4e@Ng;@g zEXaNPP?(2Ck`F`T0vk>C0WwV*AwAic2+ireEl0OK98-8jaff4+Or;?^RARqnz#ujj zu#JDNw6?UAC4~bHCV*~tsOeF9ZH$PiZ02QrV-V2h(4sJv4=yta6hdfYNd&&^!^xLM z_s;L597!+WA*$mXMMX^K*ha!y2;(7qKB4%Hm`kr=WMuEJ`KxuPMpWAfsQb>dXL1;f z@8j>EqRa)6)O)VD*vv|98`A-z8-nSXI`7x5tsz(o(4&&*?%1b6-+qM28#_R{AeKN| zV<$Vqjg_gb>n9Sxvazx0d{v?f1*{x1AmV_i&^Jo+{*or~g<~smLscfB6&sxPY=<=7 z^)dXrH<&Cmko>ISw(n$nxbnKF7)d_3z{X=l7me4r;8G;)lH0T70l@DP;{&)ra&mI$ zhUWYDOaV0Bj~@JfoTb3Ip`uCH-W?&oVSY932!SxF<4rDfvSsmfEHO^85I0jSfu0ju zSU458Ck7;vPHV_2$FH=K*@hY#{IDBg%1b$bH*J%%9WwG0o*atdCdlJJgzyt5lr1bQ z5{@2?0xmw1mUb`B%7oXMF$|7nvIOw-{rYw>w9FPbFA|lxkLjmk7=!ils!>2HLU2QM z_4SpL1pr?8a@D)$PLGoV{rKKlOB3lv_LZj$fS-I5Flj(E1o`ZYz=UuV>IAo3+U}q$Tf%&%~L}L z0Crm5Iv^kJzk9TCQ zQ7yRJRGaW{cjMTts<=K!z*LNf!FglB5Y!2Y^c9L!r_D{QY=O= zKs0yu4q%N=(O($?Dud`ks*)Hu;H|T{E_rzsP74UZ92&>|ADE9B0b?VtlXzP9F;*RWEJSG^S$fzNRL^$a-~VntfA(oX4J!sqY<7^(@G%| zXk*g%THtD~{g=UTJ>vt@dj+ZxQBMx&A zTpi5Ke{gCF5kZIW31Nzg3vFaTT2QYeyzPc|R3ocVpH~Uic+yZHz5$%M>#u!Xb8VZI z@0T%i9Ii?PcnZI1i&@`!X}PQJ4n?@#67QTp9Gj%arYNVq-#QB@e89q_Jer(#(RGVT|4Rha@}`3FS_=HiTKd*tS#|@)^z+oN?!h?YI zKe8U(!jYN2>Trc(r|P{@`2vzQ#4Xq!Z9vxn1~UwN9Yw7#MFwnEhBrG_1pS*Ln{p$@ zF7qxpL!woKws=SbH5sEBD2E_qFikOb#q}LtkzW}}RE+vp5@W|op&mSW^}VM@8uMhN z@eE{4Ue+`%4Hd@*zTB)6c0#N$yUcOlzJ0p`-`%`; zIOld-=F~;02KAc@t#5K4v5g<`y#yl49LL46+>!N5Gjo`yr~aBNa)s(hFv?Qu-U&QI^r%@hQP z)O26q`9SX~&MsGSIu#Pa*Z%HZD&h>>*kNt2X^Q%*{t$&mHjy?WR2d-_=R`@@*V{F* zO2tzor4kcwfWgKzqQqmz$f}zT=dtYC=`b|Hc4v+(0Lo^x8PH3V%xd?gjm0P#2apxO z&gYAZOF9cO%43njUAAECy#z4+qfVDuZ1Hw4nTC87XrKjbwh%2_6&3NRQwuY9+XZdO zrv5ll3O|^_7RaQ}=aqaa z{?xG#)b4wn1C`1TKf#XokH;LFvGqV~?BZ+p!A?ms2`5g7G2^Fgl*IJ+SPWlj#WO~< z7zy*B?bl;=FQf8FoPTK97U6&PUd|fva{AWqB{9|57%AB`!|oW@!~~gd8&N-l{X6SecqM%VVAoIh9*M!?yyblZOo3Y$RZ5 zH1f?+kl007VN|M+<|t;=9QBfcKF6WP%UB2*!H`;uGa?F*d{7+R=?tFw08R7$FPJC$ z{wwCm-YPKKV;IT`9a0&@!3mEi)?x-+Es%dVbmz#J7}0K=FV?kPBaIWm3A_Ta=drk8~d*%)HO9g7e&-s9`qNQ?i?ae4WF{O2NPX3zZ*^5}~3O9%WU(o(e zW@3^>$Os45+l5tE;wC;Eou81p80rENpp-3x-va$-7$igE)Yo(oQ~?9V098nXXcA$K z#%$zBnBnimox|!~yuiYOkCzh@)}0?1XojA^_fwO}$?|k1NG?_zH|o&zGUT{c>@!z2 z7QOWxK|VhWq^0iQ#ico1E<7hxgt zEp;>%O``l2VmvV1L1=vMtKXhH6(?H}ZUz4Z+&Uj81az{C1gN~+(O+|22DPjlhQNHU zCtAFOoMt)_Qt|GrJhSD?$qT5at2-7rl8p&j%3Nnctqwx0(YRt$AV(2f3zS&Dt}jjx zkw=wEi?t>gO=gMTdKohtSFfhPS7YKL75X?nwA^mkarH0bM+Mw)(*JjYVA7HI!b$-aHf*Zo9Lb}Z4g!(d3D z`6|%o=Zigu0R$war1rzjLH>)Yd%jPm8`M~^NSuCvCZ&}K#X>U!o;mr>_M!m(c&1#> zhcn3B!Pf<$z#Y!At3I#!ZsBmwps!1Lz+00#X2%ELEg$!J0Sd7zRbL=3SW?5W0i<+$quZsM6GS-xAjK}sDm()S4Umwk zd`~m$7vX%i$*sG!{0OFg(~^Ol*xmDV32XN334c|NqZg4C4nMZ{3D7kS7Nz+T){Bg> zv}ItE=aW#KO9_pi@l%Uj#9-K9;>8^tbLvRBZE0)MFfH(cf2gyiIK0Q=#7iV^_Igd?zW&ntG_zcf|lZ&zOO7>hL* zl`FxW`E$COdbSpD(_O@wwvvMmQi0A8pD`kaU@lhRrO=(G;FR5awu?i-KS3L;esQo4 zW+MblrYzM<0_%Y^?dj$sO}AefYP+J8`R}?}X3m0wN4VV9#x6j~hi6;9q752!_BZ6r1qv^71iDE;^v##v(F7EY2>>Z_><|x|w{Wz-MbZZwjhxHhGc1o*xMi zJxu00YL`jO3P8xh6Yrq0+{Nh{-ldL3FnX#0#=!p*iwC9!-yIqN)72r-hP^5^#0&9IdcY zNG0g0wOK1aNsb@CqV<_Ct|U6S+f7X_7J5k;=R&jh+j#E9QMJ<2b>eU*5lEq*w_2XB z6eH+dTO2DwZ(NX+niGykAJH+DeQ+fv8d$^wP67?7U;`9}=Z0VVf--q`J32blt>(jC zilPqQAo)m)r~wu&P%XSgI>u`tf1pkxw4ZqR!49Nb&Y&D4e!7e6skEy%Z4sN@az$n$ zVmE*!6voA_oZ?ck-)6Ard`8B4G-3jaoNpB4^s(~ELLOdT_g*-8v#P?`l&EabN6k^;IHxoN6H}bkiuI08g0zL>MxJ{qWn2aObZ4pGr?l z=iSJGQOFjHjKDqH^y&K@h#aLHsUlma8ayUw2p)MCp$t!an2IeOCf1stzMYEMcEAhEE5E2!Y5-0B{NcHs`)C5<{J}mtB1;PywiP(zdP@ z>lMH?noyclQ(K!1kYH4gT{u$2!SrJMF7&ZGT%7oQE#NUGBlP1W6iqEB6_uy9mX2evG~ti8FgG6sc?p#fhesHJ zkOX0|z`xjq3poT)4YKSZfKTa%#zgj6Ks617zL+iuc{Kkl<#?7qjzhTvP)UZO<{LXD zyo+4+-Rg&lr$?VXLcrc>O=2?iH@GA4z!^xGuD_u{==LH!3*;eL5424H5`v;kKi#RGDMeA}TfaNBg+pVPMYnIFSUnYwYSsv@g8Fd2nsARF2D>BUWs`=;?@THZ+J zkM;MDa!v^ePo5Vp)YPydfM3qP)uiDV=Zkr_xTU3m17~t6obV~Svc~0VF~1!*%~W_* z_SG!GEz>1`eL+L}{m*@LK5lGmtmeJiT6YUhV7-BH&39UYqcyf zuG)X5-n;11AAh85C`{vWx$u5!qM_Bb69}BXx3uQ^i!IK}mwz1^I^NjW*!ktla+`q! zb8*p|pka5`W1_EZ(%QV`2?AN?Bz8S{zvB|jyU(9Lht~6^vs3>s8wzJVJ1Dx%wF6({ z=8d1Khn%ysxhh z^jCXV*A$HD;UDxEisk)Z#N0y9eNa>L?(JKx*|TTYCH@>2suX#N6`|{f82RN?zrOj}pzy$;ko3+}_t$G^@Jw=#e8;!^3<1 zVoJQ>Xa{>;XC&a9UR(9!M*zxkcKVRhK+CK5{6Y1Cyf5A};h(;)NzzPlF@~|a#h;WN VC7Ye81}_l9*jm|HUbJux`412(Fhc+U literal 0 HcmV?d00001 diff --git a/specification.md b/specification.md new file mode 100644 index 0000000..3e21f75 --- /dev/null +++ b/specification.md @@ -0,0 +1,647 @@ +# mC Compiler Specification + +This document describes the mC compiler as well as the mC language itself along with some requirements. +Like a regular compiler, the mC compiler is divided into 3 main parts: front-end, back-end, and a core in-between. + +The front-end's task is to validate a given input using syntactic and semantic checks. +The syntactic checking is done by the *parser* which, on success, generates an abstract syntax tree (AST). +This tree data structure is mainly used for semantic checking, although one can also apply transformations on it. +Moving on, the AST is translated to the compiler's intermediate representation (IR) and passed to the core. +Invalid inputs cause errors to be reported. + +The core provides infrastructure for running analyses and transformations on the IR. +These analyses and transformation are commonly used for optimisation. +Additional data structures, like the control flow graph (CFG), are utilised for this phase. +Next, the (optimised) IR is passed to the back-end. + +The back-end translates the platform *independent* IR code to platform *dependent* assembly code. +An assembler converts this code to *object code*, which is finally crafted into an executable by the linker. +For these last two steps, GCC is used β€” referred to as *back-end compiler* in this context. + +The mC compiler is implemented using modern C (or C++) adhering to the C11 (or C++17) standard. + +## Milestones + +1. **Parser** + - Inputs are accepted / rejected correctly (syntax only). + - Syntactically invalid inputs result in a meaningful error message containing the corresponding source location. + - An AST is constructed for valid inputs. + - The obtained AST can be printed in the DOT format (see `mc_ast_to_dot`). +2. **Semantic checks** + - The compiler rejects semantically wrong inputs. + - Invalid inputs trigger a meaningful error message including source location information. + - Type checking can be traced (see `mc_type_check_trace`). + - Symbol tables can be viewed (see `mc_symbol_table`). +3. **Control flow graph** + - Valid inputs are convert to IR. + - The IR can be printed (see `mc_ir`) + - The CFG can be printed in the DOT format. +4. **Back-end** + - Valid inputs are converted to IR and then to assembly code. + - GCC is invoked to create the final executable. +5. **Build Infrastructure** + - Your code builds and tests successfully on my evaluation system. + +## mC Language + +This section defines *mC* β€” a simple, C-like language. +The semantics of mC are identical to C unless specified otherwise. + +### Grammar + +The next segment presents the grammar of mC using this notation: + +- `#` starts a line comment +- `,` indicates concatenation +- `|` indicates alternation +- `( )` indicates grouping +- `[ ]` indicates optional parts (0 or 1) +- `{ }` indicates repetition (1 or more) +- `[ ]` and `{ }` can be combined to build 0 or more repetition +- `" "` indicates a terminal string +- `/ /` indicates a [RegEx](https://www.regular-expressions.info/) + +``` +# Primitives + +alpha = /[a-zA-Z_]/ + +alpha_num = /[a-zA-Z0-9_]/ + +digit = /[0-9]/ + +identifier = alpha , [ { alpha_num } ] + +bool_literal = "true" | "false" + +int_literal = { digit } + +float_literal = { digit } , "." , { digit } + +string_literal = /"[^"]*"/ + + +# Operators + +unary_op = "-" | "!" + +binary_op = "+" | "-" | "*" | "/" + | "<" | ">" | "<=" | ">=" + | "&&" | "||" + | "==" | "!=" + + +# Types + +type = "bool" | "int" | "float" | "string" + + +# Literals + +literal = bool_literal + | int_literal + | float_literal + | string_literal + + +# Declarations / Assignments + +declaration = type , [ "[" , int_literal , "]" ] , identifier + +assignment = identifier , [ "[" , expression , "]" ] , "=" , expression + + +# Expressions + +expression = literal + | identifier , [ "[" , expression , "]" ] + | call_expr + | unary_op , expression + | expression , binary_op , expression + | "(" , expression , ")" + + +# Statements + +statement = if_stmt + | while_stmt + | ret_stmt + | declaration , ";" + | assignment , ";" + | expression , ";" + | compound_stmt + +if_stmt = "if" , "(" , expression , ")" , statement , [ "else" , statement ] + +while_stmt = "while" , "(" , expression , ")" , statement + +ret_stmt = "return" , [ expression ] , ";" + +compound_stmt = "{" , [ { statement } ] , "}" + + +# Function Definitions / Calls + +function_def = ( "void" | type ) , identifier , "(" , [ parameters ] , ")" , compound_stmt + +parameters = declaration , [ { "," , declaration } ] + +call_expr = identifier , "(" , [ arguments ] , ")" + +arguments = expression , [ { "," expression } ] + + +# Program + +program = [ { function_def } ] +``` + +### Comments + +mC supports only *C-style* comments, starting with `/*` and ending with `*/`. +Like in C, they can span across multiple lines. +Comments are discarded by the parser, but do not forget to take newlines into account for line numbering. + +### Size Limitations + +Inside your compiler, use `long` and `double` to store mC's `int` / `float` literals. +You may assume that they are big and precise enough to store the corresponding literal. + +Similarly for arrays, you may assume that arrays are at most `LONG_MAX` bytes long. + +### Special Semantics + +#### Boolean + +For mC we consider `bool` a first-class citizen, distinct from `int`. +The operators `!`, `&&`, and `||` can only be used for booleans. +Additionally we do *not* support short-circuit evaluation. + +#### Strings + +Strings are immutable and do not support any operation (e.g. concatenation). +Yet, like comments, strings can span across multiple lines. +Furthermore, they do not support escape sequences. + +Their sole purpose is to be used with the built-in `print` function. + +#### Arrays + +Only one dimensional arrays with static size are supported. +The size must be stated during declaration and is part of the type. +The following statement declares an array of integers with 42 elements. + + int[42] my_array; + +We do not support *any* operations on whole arrays. +For example, the following code is *invalid*: + + int[10] a; + int[10] b; + int[10] c; + + c = a + b; /* not supported */ + +You'd have to do this via a loop, assigning every element: + + int i; + i = 0; + while (i < 10) { + c[i] = a[i] + b[i]; + i = i + 1; + } + +Even further, one cannot assign to a variable of array type. + + c = a; /* not supported, even though both are of type int[10] */ + +#### Call by Value + +Function arguments are always passed by value. + +`bool`, `int`, and `float` are passed directly. +Strings and arrays are passed via pointers. + +#### Type Conversion + +There are no type conversion, neither implicit nor explicit. + +An expression used as a condition (for `if` or `while`) is expected to be of type `bool`. + +#### Entry Point + +Your top-level rule is `program` which simply consists of 0 or more function definitions. +While the parser happily accepts empty source files, a semantic check enforces that a function named `main` must be present. +`main` takes no arguments and returns an `int`. + +#### Declaration, Definition, and Initialization + +`declaration` is used to declare variables which can then be initialised with `assignment`. + +Furthermore we do not provide a way to declare functions. +All functions are declared by their definition. +It is possible to call a function before it has been defined. + +#### Empty Parameter List + +In C, the parameter list of a function taking no arguments contains only `void`. +For mC we simply use an empty parameter list. +Hence, instead of writing `int main(void)` we write `int main()`. + +#### Dangling Else + +A [*dangling else*](https://en.wikipedia.org/wiki/Dangling_else) belongs to the innermost `if`. +The following mC code snippets are semantically equivalent: + + if (c1) | if (c1) { + if (c2) | if (c2) { + f2(); | f2(); + else | } else { + f3(); | f3(); + | } + | } + +### I/O + +The following built-in functions are provided by the compiler for I/O operations: + +- `void print(string)` outputs the given string to `stdout` +- `void print_nl()` outputs the new-line character (`\n`) to `stdout` +- `void print_int(int)` outputs the given integer to `stdout` +- `void print_float(float)` outputs the given float to `stdout` +- `int read_int()` reads an integer from `stdin` +- `float read_float()` reads a float from `stdin` + +## mC Compiler + +The mC compiler is implemented as a library. +It can be used either programmatically or via the provided command-line applications. + +The focus lies on a clean and modular implementation as well as a straight forward architecture, rather than raw performance. +For example, each semantic check may traverse the AST in isolation. + +- Exported symbols are prefixed with `mcc_`. +- It is threadsafe. +- No memory is leaked β€” even in error cases. +- Functions do not interact directly with `stdin`, `stdout`, or `stderr`. +- No function terminates the application on correct usage. + +### Logging + +Logging infrastructure may be present, however all log output is disabled by default. +The log level can be set with the environment variable `MCC_LOG_LEVEL`. + +The output destination can be set with `MCC_LOG_FILE` and defaults to `stdout`. + +Log messages do not overlap on multi-threaded execution. + +### Parser + +The parser reads the given input and, if it conforms syntactically to an mC program, constructs the corresponding AST. +An invalid input is rejected, resulting in a meaningful error message, for instance: + + foo.mc:3:8: error: unexpected '{', expected β€˜(’ + +It is recommended to closely follow the error message format of other compilers. +Displaying the offending source line along with the error message is helpful, but not required. +Parsing may stop on the first error. +Error recovery is optional. + +The parser component may be generated by tools like `flex` and `bison`, or similar. +However, pay attention to operator precedence. + +Note that partial mC programs, like an expression or statement, are not valid inputs for the main *parse* function. +However, the library can provide additional functions for parsing single expressions or statements. + +### Abstract Syntax Tree + +The AST data structure definition itself is *not* specified. +Consider using the visitor pattern for tree traversals. + +Given this example input: + +```c +int fib(int n) +{ + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); +} +``` + +The visualisation of the AST for the `fib` function could look like this: + +![`fib` AST exampe](images/fib_ast.png) + +### Semantic Checks + +As the parser only does syntactic checking, additional semantic checks are implemented: + +- Checking for uses of undeclared variables +- Checking for multiple declarations of variables with the same name in the same scope +- Checking for multiple definitions of functions with the same name +- Checking for calls to unknown functions +- Checking for presence of `main` and correct signature +- Checking that all execution paths of a non-void function return a value +- Type checking (remember, nor implicit or explicit conversions) + - This also includes checking arguments and return types for call expressions. + +In addition to the AST, *symbol tables* are created and used for semantic checking. +Be sure to correctly model [*shadowing*](https://en.wikipedia.org/wiki/Variable_shadowing). + +### Intermediate Representation + +As IR, a low-level [three-address code (TAC)](https://en.wikipedia.org/wiki/Three-address_code) is used. +The instruction set of this code is *not* specified. + +Note that the compiler core is independent from the front-end or back-end. + +### Control Flow Graph + +A control flow graph data structure is present and can be constructed for a given IR program. +This graph is commonly used by analyses for extracting structural information crucial for transformation steps. + +It is recommended to also provide a visitor mechanism for this graph. + +### Assembly Code Generation + +mC targets x86 and uses GCC as back-end compiler. +On an x86_64 system, GCC multilib support must be available and the flag `-m32` is passed to the compiler. + +The code generated by the back-end is compiled with the [GNU Assembler](https://en.wikipedia.org/wiki/GNU_Assembler) (by GCC). +Pay special attention to floating point and integer handling. + +Use [cdecl calling convention](https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl). +It is paramount to correctly implement the calling convention, otherwise you will corrupt your stack during function calls and returns. + +## Applications + +Apart from the main compiler executable `mcc`, additional auxiliary executables are implemented. +These executables aid the development process and are used for evaluation. + +Most of the applications are defined by their usage information. +Composing them with other command-line tools, like `dot`, is a core feature. + +Unless specified, the exact output format is up to you. +However, do *not* omit details β€” like simplifying the AST. + +All applications exit with code `EXIT_SUCCESS` iff they succeeded in their operation. + +Note each executable excepts multiple inputs files. +Each input is parsed in isolation; the ASTs are merged before semantic checks are run. + +### `mcc` + +This is the main compiler executable, sometimes referred to as *driver*. + + usage: mcc [OPTIONS] file... + + The mC compiler. Takes mC input files and produes an executable. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -v, --version displays the version number + -q, --quiet suppress error output + -o, --output write the output to (defaults to 'a.out') + + Environment Variables: + MCC_BACKEND override the backend compiler (defaults to 'gcc' in PATH) + +### `mc_ast_to_dot` + + usage: mc_ast_to_dot [OPTIONS] file... + + Utility for printing an abstract syntax tree in the DOT format. The output + can be visualised using graphviz. Errors are reported on invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +### `mc_symbol_table` + + usage: mc_symbol_table [OPTIONS] file... + + Utility for displaying the generated symbol tables. Errors are reported on + invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +### `mc_type_check_trace` + + usage: mc_type_check_trace [OPTIONS] file... + + Utility for tracing the type checking process. Errors are reported on + invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +### `mc_ir` + + usage: mc_ir [OPTIONS] file... + + Utility for viewing the generated intermediate reprensetation. Errors are + reported on invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +### `mc_cfg_to_dot` + + usage: mc_cfg_to_dot [OPTIONS] file... + + Utility for printing a contorl flow graph in the DOT format. The output + can be visualised using graphviz. Errors are reported on invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +### `mc_asm` + + usage: mc_asm [OPTIONS] file... + + Utility for printing the generated assembly code. Errors are reported on + invalid inputs. + + Use '-' as input file to read from stdin. + + OPTIONS: + -h, --help displays this help message + -o, --output write the output to (defaults to stdout) + -f, --function limit scope to given function + +## Project Structure + +The following directory layout is used. + + mcc/ + β”œβ”€β”€ app/ # Each C file in this directory corresponds to one executable. + β”‚ β”œβ”€β”€ mc_ast_to_dot.c + β”‚ β”œβ”€β”€ mcc.c + β”‚ └── … + β”œβ”€β”€ docs/ # Additional documentation resides here. + β”‚ └── … + β”œβ”€β”€ include/ # All public headers live here, note the `mcc` subdirectory. + β”‚ └── mcc/ + β”‚ β”œβ”€β”€ ast.h + β”‚ β”œβ”€β”€ ast_print.h + β”‚ β”œβ”€β”€ ast_visit.h + β”‚ β”œβ”€β”€ parser.h + β”‚ └── … + β”œβ”€β”€ src/ # The actual implementation, may also contain private headers and so on. + β”‚ β”œβ”€β”€ ast.c + β”‚ β”œβ”€β”€ ast_print.c + β”‚ β”œβ”€β”€ ast_visit.c + β”‚ β”œβ”€β”€ parser.y + β”‚ β”œβ”€β”€ scanner.l + β”‚ └── … + β”œβ”€β”€ test/ + β”‚ β”œβ”€β”€ integration/ # Example inputs for integration testing. + β”‚ β”‚ β”œβ”€β”€ fib/ + β”‚ β”‚ β”‚ β”œβ”€β”€ fib.mc + β”‚ β”‚ β”‚ β”œβ”€β”€ fib.stdin.txt + β”‚ β”‚ β”‚ └── fib.stdout.txt + β”‚ β”‚ └── … + β”‚ └── unit/ # Unit tests, typically one file per unit. + β”‚ β”œβ”€β”€ parser_test.c + β”‚ └── … + └── README.md + +The README is kept short and clean with the following sections: + +- Prerequisites +- Build instructions +- Known issues + +`src` contains the implementation of the library, while `include` defines its API. + +Each application (C file inside `app`) is liked against the shared library and uses the provided interface. +They mainly contain argument parsing and combine the functionality provided by the library to achieve their task. + +The repository does not contain or track generated files. + +Under normal circumstances, all generated files are placed somewhere inside the build directory. + +### Known Issues + +At any point in time, the README contain a list of unfixed, known issues. + +Each entry is kept short and concise and should be justified. +Complex issues may reference a dedicated document inside `docs` providing more details. + +## Build Infrastructure + +As build system (generator), use either [Meson](http://mesonbuild.com/), [CMake](https://cmake.org/), or plain Makefiles. +Ensure dependencies between source files are modelled correctly. + +*Note:* Talk to me if you want to use a different build system. + +### Building + +The default build configuration is *release* (optimisations enabled). +Unless Meson or CMake is used, the README documents how to switch to a *debug* configuration. + +Warnings are always enabled; `-Wall -Wextra` are used at least. + +### Testing + +Crucial or complicated logic is tested adequately. + +The project infrastructure provides a *simple* way to run all unit and integration tests. +See the getting started code-base for an example (`scripts/run_integration_tests`). + +Similarly, a way to run unit tests using`valgrind` is provided. + +### Coverage + +An HTML coverage report can be obtained follow the *simple* instructions inside the README. + +### Dependencies + +The implementation should not have any dependencies apart from the C (or C++) standard library and a unit testing framework. +The *prerequisites* section of the README enumerates the dependencies. + +The unit testing framework is *vendored* and automatically used by the build system. +See the getting started code-base for an example. + +## Coding Guidelines + +Architectural design and readability of your code will be judged. + +- Don't be a git β€” use [Git](https://git-scm.com/)! +- Files are UTF-8 encoded and use Unix line-endings (`\n`). +- Files contain *one* newline at the end. +- Lines do not contain trailing white-space. +- Your code does not trigger warnings, justify them if otherwise. +- Do not waste time or space (memory leaks). +- Check for leaks using `valgrind`, especially in error cases. +- Keep design and development principles in mind, especially KISS and DRY. +- Always state the sources of non-original content. + - Use persistent links when possible. + - Ideas and inspirations should be referenced too. + +> Credit where credit is due. + +### C/C++ + +- While not required, it is highly recommended to use a formatting tool, like [ClangFormat](https://clang.llvm.org/docs/ClangFormat.html). + A configuration file is provided with the getting started code-base, however, you are free to rule your own. +- Lines should not exceed 120 columns. +- The nesting depth of control statements should not exceed 4. + - Move inner code to dedicated functions or macros. + - Avoid using conditional and loop statements inside `case`. +- Use comments *where necessary*. + - Code should be readable and tell *what* is happening. + - A comment should tell you *why* something is happening, or what to look out for. + - An overview at the beginning of a module header is welcome. +- Use the following order for includes: + - Corresponding header (`ast.c` β†’ `ast.h`) + - System headers + - Other library headers + - Public headers of the same project + - Private headers of the same project +- The structure of a source file should be similar to its corresponding header file. + - Separators can be helpful, but they should not distract the reader. +- Keep public header files free from implementation details, this also applies to the overview comment. +- Use assertions to verify preconditions. +- Ensure the correct usage of library functions, and always check return codes. +- Prefer bound-checking functions, like `snprintf` over non-bound-checking variant. + +Also, keep the following in mind, taken from [Linux Kernel Coding Style](https://www.kernel.org/doc/html/v4.10/process/coding-style.html): + +> Functions should be short and sweet, and do just one thing. +> They should fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24, as we all know), and do one thing and do that well. +> +> The maximum length of a function is inversely proportional to the complexity and indentation level of that function. +> So, if you have a conceptually simple function that is just one long (but simple) case-statement, where you have to do lots of small things for a lot of different cases, it's OK to have a longer function. +> +> However, if you have a complex function, and you suspect that a less-than-gifted first-year high-school student might not even understand what the function is all about, you should adhere to the maximum limits all the more closely. +> Use helper functions with descriptive names (you can ask the compiler to in-line them if you think it's performance-critical, and it will probably do a better job of it than you would have done). +> +> Another measure of the function is the number of local variables. +> They shouldn't exceed 5–10, or you’re doing something wrong. +> Re-think the function, and split it into smaller pieces. +> A human brain can generally easily keep track of about 7 different things, anything more and it gets confused. +> You know you’re brilliant, but maybe you'd like to understand what you did 2 weeks from now. diff --git a/submission.md b/submission.md new file mode 100644 index 0000000..b628ae9 --- /dev/null +++ b/submission.md @@ -0,0 +1,66 @@ +# Submission Guideline + +- `XX` is to be replaced with the number of your team with leading zero (e.g `02`). +- `Y` is to be replaced with the corresponding milestone number. +- One submission *per team*. + +## Example Input Submission + +Assuming your example input is named `mandelbrot`, zip the corresponding files like so: + + mandelbrot.zip + └── mandelbrot + β”œβ”€β”€ mandelbrot.mc + β”œβ”€β”€ mandelbrot.stdin.txt + └── mandelbrot.stdout.txt + +Submit the zip archive via mail using the following line as subject (or link below). +List your team members in the mail body. + + 703602 - Example Input + +πŸ“§ [send email](mailto:alexander.hirsch@uibk.ac.at?subject=703602%20-%20Example%20Input) + +## Milestone Submission + +1. `cd` into your repository. +2. Commit all pending changes. +3. Checkout the revision you want to submit. +4. Ensure everything builds. + - Warnings are okay + - Tests may fail + - Memory may be leaked + - Known issues should be present +5. Run the following command: + + $ git archive --prefix=team_XX_milestone_Y/ --format=zip HEAD > team_XX_milestone_Y.zip + +6. Verify that the resulting archive contains everything you want to submit and nothing more. +7. Submit the zip archive via mail using the following line as subject (or link below). + + 703602 - Team XX Milestone Y + + πŸ“§ [send email](mailto:alexander.hirsch@uibk.ac.at?subject=703602%20-%20Team%20XX%20Milestone%20Y) + +## Final Submission + +1. `cd` into your repository. +2. Commit all pending changes. +3. Checkout the revision you want to submit. +4. Ensure everything works. + - Everything builds + - No (unjustified) warnings + - All unit test succeed + - All integration tests succeed + - No memory is leaked + - Known issues must be present +5. Run the following command: + + $ git archive --prefix=team_XX_final/ --format=zip HEAD > team_XX_final.zip + +6. Verify that the resulting archive contains everything you want to submit and nothing more. +7. Submit the zip archive via mail using the following line as subject (or link below). + + 703602 - Team XX Final + + πŸ“§ [send email](mailto:alexander.hirsch@uibk.ac.at?subject=703602%20-%20Team%20XX%20Final)