From 61673d3ef20b2357db38b3b1a6f3629d26e1e914 Mon Sep 17 00:00:00 2001
From: Gero Lueckemeyer <gero.lueckemeyer@hft-stuttgart.de>
Date: Thu, 28 Dec 2023 11:13:33 +0100
Subject: [PATCH] namespaced and imported utils, clarified moodle version
 comment

---
 dta.zip                  | Bin 24007 -> 24111 bytes
 dta/classes/backend.php  |   1 +
 dta/classes/database.php |   9 +++++++++
 dta/classes/view.php     |   9 +++++++++
 dta/locallib.php         |  14 +++++++++-----
 dta/version.php          |   2 +-
 6 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/dta.zip b/dta.zip
index 83d1e2867578df0141d3c8e191b5f951a10eaed8..94d05da2f2938ef029de29d6dc3a695b6d41c26e 100644
GIT binary patch
delta 10621
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
E0BM=|OaK4?

delta 10491
zcmZX)V{9hw^F3VNwQbwB-K}lgc6-<MUE8*8+ctN%cDvnfpU?0A?we<lYhGPBlbK|4
zk~62V4}7v0JXs5^=SQA)1j@#+E&vSd90Lpt2gI+94_w#wcV1;h{T?hlsiL+~-Hg8^
zi9mu!tm5pcK_P>xa>JnEqV#IY&wziw&ASo&vn9<16>YbIerYt=dzgPSsl4K=_aunB
zm>rrtj(HE1F9V>B5RgF_@P&78*iJs7e;#17KdQid!^4#_&_Pp)_fw{NnNYFc!@<Zw
zR<v2P0u@TL03(pfva*sxBUpN@_IM~&P(qbO)e4w?9W0H1Fnpx=(kUawxZ|=>tmi5X
zR7r75byeN*hvv4L@mUlRDR3YM;5ZdHG5Vm>j=kX!=&=Sy`}br_o1n$<DUeDO&(J09
zo^x<-;mt}I)?bnD(Mcjly4v}1=*D3<BY$Qv0uxQ8$<#ULPBK)bO?`F=289dbi+6!A
z&b_0iogzVRun{i?N7_9_3z$DvvWhJwDd9F55chgSh=hR&^!wKRtq1Q!kti(wr~iK0
zK(Q=FEk%fV^WF*-=6Oc3W+B2{macLSMXQ-(A{nIbEp5PH;HoI<)WJ{PHI>1a#zAI*
zfY9SBf6|y(xgiE*wFjAV*~HC;DG)f6$s*SgLJ;;LB94U?syhsrchMFZH_a*=`aoXw
z7yAQ-VY^ty%RG~;-7O2&W8VsV6>$rg=?EGghk;0@6M^a)=p6m*r1c|lt~e{aakw(I
z6Zfl_ipkLs|Dx3xPv~>06tYj0Ar<T5fpJqa2B?kG(h3qcQnq^qSCn3SczMGo#9A|G
zGdpalsZ#C<cp!)c_Sj<@kB9(@Xz^c+MFtY|<213ToK!L5QjM~snm!!!jA|m%xcW!0
zVz17@+cw7$)Qf~Ia3w1D^;#U=9YqgO#E}}-EsXqtylGzRBPTUPBT#0tRCe7CFbxXs
zw8H-;S@e(XyieIqL{jAnKX}^E%gVI@t>K?JOQ9!{<0j||Fs!8#V|HZn8h6XmNWBEB
z%BDX^T>E#VnPg(5bkxUNKNStPkhGhAS&j4OUtT%`F27d)`Rv>c@HvVJbw1#m*YS|7
z%bzla0~FQz?HsyoxgBBG@4}M$f#2W+sS$IX*}puh(!{wHc$t4s^c2#~D6#pzU|(Zd
zwtiH3yqCtZD!*#^C_PUqeaX<8)f%sHv6NI8w-X`g;v=AM-GE=2Wsz-6t73N7aoze-
zPJ>fM=EAH${b`vP4l_y<_DFPX%T0;2H=E5sIyIrl@*H=}m=BK@n?<x90A@#-xFe6e
zam3{9pJfx(3UI1N&+@vwwoesvZzQ)Fh|VW^dSiVo=@EMI<EXqXbIG2w>iOVcA3ime
z;4g{O<8FEh643fy>}cjyEGBu6I7;m6?>(?Dw5isL?63+Yb8^u@=;O3o%`p}AzY#2N
zB;>R0_{MbCj6TH7>e;JT0cY%3T*TLBj$>@GCz>VqDibb_|J$OMq}<~d@wvrJ#IJK-
z@sfMSM183padZYd*f}2)ztj`>IM=jx9{J(5wJI)yb2W$gNIC7=q3u1UAC|y=X3>Yh
zL3pF}eEJ_&PKalUcCWDHUwryHoW4jm6z%5~gWH+wN6j=G!#B1Uz?A{Uvs&2wNqPlu
zwdyhEZG2%mRY83u1VBvoxLz@rzM?4F?&@cU+xZJl{a=fu`ZM6QmEzjv;f;m)DT{||
zLCOz-yB0@>;1VZ-xMWAcNlX3`Jqd}|CCbf2!K@06Gaj;3j>i7!r-1cyUQVbnm^OpC
zoPDHO12!#7`WulN;KPpjZ|kJ6sBXIkZ&wbDx6o|Zd#&KB>^t@LU0DD8d@oS<_<L+0
zPm_KXhSSK~UGm_i-6!&3O%=>7wvDbPP#CWuA7x_o_?Hj+b<)ECx1TRRXMA&DlTsw)
z;d0I@)w{l;mx|Wy)-+MUHMv82LvHRfP<Yb4O%V;b+HKPYi1%D>XbkmgB!6_f*@$cr
zw0CYNcdoa{N*qg$DC61MB7|PI_1RPXy|&c=3<sHa`FlX|IFCS+kc{@1md3domJ9|s
zz?SXpC8~0)Wuhl(jdR;fnF|cRLJObCltFb%m9+P>7PT^t5bPIJT5&k>cVOH+^Dvn;
zAZeVG>u2WzZN*F+N|4i3lCD&`_vXW@_nh#Z)6qK}@b4~d_rBh7i3y1e?;LLD#t=Dp
z+l?z@VjJA~ClCE@JC$LzkNjMq8=?jyX45YgPkOvu@V@89Q;jKl@_uAK!R=_iT|<{|
zxdyETL8$zIgu(;^1A_%KQ^?bnWQVm=`HzHxaKOM)VF<y;K}0ZkKtHq`)SA69+xa}+
zmi$EcheN)^eBRE3qYyha>&t-2%g61)RUYS6%N+tllNJkj@(H>l@BgElVQVt+JYTpU
z^{cJJqzjXQWH^vxN5-b6O{r=s<SWXOD;zp;h!Cm4Wn}7lExr}Y3XpOmA<3w5$x`;u
zCKoM~W$4eTp%v^vtu8m=cORaJB+lYgm#)Q&JZP6$h#XpYD05B@J2{Cg0ujEGoiWx9
zwj<dh^O9^?r4aT2W>cy15w<=zdrV|yG1=3zEE|k&s1*D?xX50BQd`ukeoW?vDJ|o4
zKeLql1BplEwh-HbsnUOZGxJ^zUdk5GpB?arJ%8x_7JLAREK_>Ce|F4;e^owI=^<6m
zfL)naY&|END%r?(AMjDTd`=UNczC#Xpg_zT&^3^~XP7YQ@?{An(M6I-&6ByhdklM9
zS^CLxS}Q!1rFM!*<iOyR_6CE1tEPynEj5F(r53ULfSO?;)!Ytl$q=6)O1koL+kr<D
z9%qqK`AZ%cZMrX+3>yd!Kk9#4_4@q0W=yHOz~yvo=dyhF0$?$EK7uZ*Ad+9DEZQpK
z;-+1V=U`MBiczyMt2-#C^r1wMz#YeqnYmz7uSjTB0qqTa0D==E6!r3?{hDNbfz{?t
zpx(iVbq2<6OX=GQ9r+F&I|W1du6dh#S@T#|ya`~~imogMQZ=TCO;O4vB{v(gpKsf}
zsqpwutiQisz(jl#-^CVB853g+Aknku-~h44Q@!D1ZFdfU3j)JdtjMr>*)#y<#Lc>c
z;MZSYUcX>>pAF66?3RVXey0Zh68h6Wci2RR36-6o1pApiF6M0mcd>Q|oD?e9V?v=H
zl4U@0IK0P+Q1Bmgc$&!Bz-_A^=#ZoQB-`cYoEBv7;776ul=vybE2#YlSCG>7B3tq4
z8rJL~D0;g+-36v?bb$EToF$w&2iv;_Bbi?1G-~|85=OYW2XlEd4lm1?vgo)1LJHRJ
zHVk1V;`XQM!n{1wx-#OcM)cMrvqb&3pQAwkRf@Oae1Ao*3&#u?3>mq^AX|^Kku=O+
z?2+z=herrd)^@hJl&^=E*69UZfJEQ7;8V<;&O71)3x4-{eV|i$dtr?pP^8+z{jA1r
zVa-!ONfYq<<FE0_SdFo~9XBqWH{eGymE00@uN-Bua{UHz>14&PS%i7B*u)b|)feD^
zW`QR-lhD2EeH9g)4T5pjT%TelNjfyRCjE%0YqRJW9aklv(^bY~%|o5t_PKUl{NwfM
zTGo<FrNk`O>Cx`n!hud$3md)2gIrc2c7`eW&dPvn5y77Bq^A~o1ZO&plR0<Ru7l^n
zX~*^~LM8CxOd64&vC_)Q36dU%DhcR{v5TsC%4BsB?C#~&G|f5^Clh)3o8R-|d=2r^
ztEj0!o>DO{e?R!yz>`&^wOKaQ+BMbUAx|EG{=&-34KlGcTuar<N`M+G)>iB6Y%(#4
zK<@LVS8OZ9`)jwf&Ldsa{;9Wo9{$c>YZ$&mAh>_OXyCz&gtjcO8VT9i`5m|rB0`0>
zhq@JpDdb%|?~m}$m&Ym`E3nK8lDOoKe5Su!@b^@Q2{D&9XM@(B{M)iux$EKPnqeGp
z_4RT2!UW;N7!LcE?BmTRY?!C|ZylW(1G90i<zbe&-*Gt~=g#j_l%tw(@`i$+R#}VN
z!+*!DbUIHwZTFq{YI$i3yz+q9pRu@kcjd9=hk+i53*HQ7+O=QQuNKUfb%%W-+hBR@
z9WQmB_~$tr8EyG})Ah)diiv#5Y*_J`(`wsxW;<|h{J+SY%n*vqdd6pFE4~JI8>mwv
zx^Y$vi(>7#)7mh$R_1<7(v*-T@l`RG<~NCx2u&?Ggm6NwqWrkxPRIvp?TA%sAp<Tl
zV^e1d<1iXR{*4K_#SW&s#0sImpH9WzBX%C;<>WU>CNS_QrTYNi{GR)yzb^%h1PV5z
zzXJ|8k+Fwe#~YeW9k;j-A&s(-lm0a!#xf$quWNn)$A8Oh1l4Z^j6T8}{J^*)({MUh
zli*Y0U%390Vbd3W-JK_XH7KU#zUR`8$V(Ly%E;u58wsRa#AY0vv6KrMKFN#xG^mw#
zzZ&*gTsakL6qNC27ntT1@$KiCTOS<4ig@4uglzRk@<2d_{f}X4D_T`{;K9Jeq(NV}
z%)qs$g-I&E97yx{?qo~4rk-o3o_&dc0B`FZ=1-{D&=RzSk&dUI&zsr5+CGm|d6DgJ
zxIHGFpd>cUgTJG=aZnMDHBk}orxkG#&~DpzF+O^+?o|nF@10k|Z1~Jkp(WVb`F6u}
zQNzqXhqi|jpu9huhnyfBfJ?}{3ZWqac|bB4KkQG)39)!Q*a;dm`3#YQ!hwj(IqSXG
zBgMTp0~n(o<R=OM_itI{5;g+S!gtwN>oN(MU%`VA77hqJ_qjs`4wo*&KH-DM4H+q{
z4&p;Ga{Jh2d{Ly7J%Abk$VF^A+gi^1k9QTU%}j$yv8j6m_R(cU!^JS+FkZ9KEucL*
zn^&Ya%|1@!q1W;KvrwOapn!nj&A{R0f*GL+L$66}x&WLI4&P~X*G(KAJ@dGTkbqwZ
zWt6g#QGv%{>7V=SGXFnqt0C5ni$|yjgaw|;i3bCMf?+()iwAwTf{x%GxD*vrCfTl0
zZb3`Ikkk&Faj9g3lXM9x0?uIOpTN-LHU7DN(R~M(P?rwBo#>bw=zp@v>ba=v{CJ@x
z(bSSv2arhZzdUyEKbpsKDyK?cN44rV27>wln`GDxmnD3Ji;3jbkFIa1C0!z}6nx{w
zI7tR0#+d%0)O63+cxvbmr%PVK+Z1DHuS6eon$DyS+hTE0!SI1LZNvnzuRz*oJ#)5)
zwXDOw@VH)H40zU5q?fZ>8^$Ga!Qf0bcj0EZTs9>HaB?)1EEdwUVVMiq@Ij%N<R(M)
z(H@uWw#?;30MYQK9@0GpQV2=fQ#j1)P%haRCZONsj9*c2;x(L%cksxZ9j%oDM@qna
zm!vtP!fEz9e<%rxus`VK0{HT4b=B$a`F>rU7p!(hd?QFM3{8<2SpXuJbp%>z+`{Y$
zFF8=7(f4vvjm^dNEEDS+PH$Lh9R@CXWs(%)gtwktX?+H*GU>dk(tHySgCL4S1C8s9
zQ4;HtkPn0HEhM8^L>^N~5knr;yp`#G(DYj1jNn3I1CpwR|24Dl5xA8jr>^V1y|T6X
zc>eqwr6JQ=q3H4F#P!DC2TLaO%ge6s4A$mO9<vh#@&3}Cf(H|~c#S{-vzI<<-(Lw|
zX)FmL)cZS&zg#T*mEw!2XZevOOjf#bk5+o5?!Kl`DyHQ}Rg)EM@OXzQJyPQ1$9YkF
z((pnrB;#dIDC`>m&A@sZiM|h&RuOS)=HE!Xyutb|FZ5+Z>}Cb2X%35kfOH3(=yOc6
z-*~1ycwZhP<@qUP(pCES(RsU_PF%;x77Fh|)?JtQ<ml@4q51kSO$sgubsg=-71g;3
zc@AxB(Fu8`#OYDlzrj5bzGrt53yf@aa-{xjgE(}x@RzsM?|}{a(a2~oE8zNP@BPOI
zMh73V(<pxkcTiHy0ff}pK3PhEsyL8mZEk<8{9Z8Q6F8O7OaTrY>0GMq6+O)~nMaHC
zzS(*8%3)TaABnT%2DI1iKcOMDI$u*9vFvQsS~+za(G66XkFuLJ@@wDA5yvStjOcwS
z_XECK;(X7n9e~|Zh-^QPwPo<>iPUFMJl<exoF6|Y5>6Ot&CWD09>tdP?k?e~5MGr5
z133_e<1z4tPXiot@2pw;<kH9-u~9ZQ+1J=7r3#d1Id-8!LlzFizRf9%=#3z9m845_
zz55JJTnD?u4KZ7^WDJ$xEa6%)nGry}Gn!?6<o+RS9AHN!7wKV+FgZASu6A+>>@sG>
zug-HNX^Pg&=KkrH@kY)+cAKTEQ0SYvZaD6J{rw^Ss+sVd!y|K594K}Ci28nH0mgZ3
zzc_P|EP6UWKT=iI$|jysE+r=&e*Uq@C0oeGkg}r~A@3%X;KaQVrK)F2y<u@YwnEeG
zSag^>j{@2;od&VQOIguY6;Dpg5vz1%Q$MfR2Q`%uA|MmX4|!H!A#A@eX6apiLNiN0
zOUb8$VanFxTG@D9PpcY8fZIVF)NI&)mP5IKi^;TG!9~JWWwk;>Eo#_jkYaRM?iq>t
zYD_^ioYVA_x>Cs;>fwf~4Q6|zj#Q*sJ8(VS$^qF7&r)(`FShxe>yoFbi?d$Pr|ntQ
zv%+S`Tr4D4a^fCrXJU7fb8kTiH(w^KwXF6J%XSK@{GAI()Rh?s+7MW?!qe6bAx-_n
zsY=)rse%vZd5%H4nZGgjRW248f5YdXY?d`Q=2JX8zGfi*v)ok4x!-^vONXwXgT>j=
z$pOApa#POdIU-3`(;0Nk+B<pl%=p_q^}_^wS~YRZIH+}?r200%%*Acp9Zb_m&%*hE
zy<GsdLea2g>NFbH$TffO4|Ynuct9C7tiO(BvPVYbhUL4l?AR?&?8z_JBA(xx5)em#
zX{EIWY8N3{-NJKIbRaeoL8tkO{mv}bj0ZyQ!ff9q2~sP)iQFp8#tkC!F<E}fa#RgE
zS%q#YIdW5YRk~^h?M+r{VhIjFIb4-GejwM%*Pp`$ux+YNa=$z84^?L8uQKxI(jge%
z)ma4@t!^D4uY65<5q<MORb=lB_LC(W&}XY4JQRNujN3U-#W={#nl7o0A<TGbGyxe3
z18x3&%$$=I0H)PQkLV)mu4R1gB4&OCQdh)(Ov|CI*R4;38WRgv^sMPEb<@#4wA1he
zXce_^5jx>gDYDNr;^go3&UPY1pHge5<(BZvSAcc5Jx@^s3`#y2z9Rk;y{{=ZJC!53
zLZ{;&o0&*2GjvgO=<2-ZOh4UcDu7S9{vOl-y0SH0&DkmUMtO*gI^!_U_-Mm#O1}^U
zWBvObn9X$E3@UeaDaKN5frQ)VUQ<W;!;)gZwxgf}J@*F!xI(LD-}<T=h}DYH8r5qB
zZMOP_vxaLgiOXj6mhD#A@{jK<8xL$b+T_%x;UpmzZ|In9AEsiXy*jC%Q$SZaO5rXr
z_Hk6_gD2T4gmiIsW`XA)PHUwZel?Pi*~~_zwu2`-wO@LqIyA7DQbY+4@NGS2?1S85
z+T^qiDM+5-&r3OwML#xpKEW%uTZv!>NzJNTHAquCm21RF20v7|mjQkZyRG(3XLb@j
zFLd_q{<Awj{V^hU_O@HN{{Yn@i@Ci!>lA;L$k^)QS}<6pmj`&-E(bz<VT&(L>i@CA
zfuA|gPN0`rElwxT530QmDBs5FwZwv}60yUu7&PZ*W1E~vojmO4o@N-2+zjY&xH=sR
znI=dea?7l=`LpKRpkXc0TIAI>6WEIz4;ip&qX3R?d_%y_T+44B01aei!sR@l*MNUv
z_BGut4RmN@3^rCHbEoi^+g_bJd#~mny^GQ9n)t(@JhqWW6=zG;TU8pvOt8OuGXrIc
zObq?6L3ufQZACKoMhU&)Xmfx^y>?~vb52pd|1_r2i47*jpyFtzXFdMlkAjgobY0+>
z0?U4c02V%bvrqy};2zLmSy%g?>Z^@45>&ki(?_*#1hrbzCCt_E6qx+(l7O>{`ufjl
z>1Iuf*ZvNCe0Y02mogM@eB!E;!*FEF<v~=E7|4|^S(0m7<`I*G@CTGIa<=knGav-&
zAYW88lv5ydXa2szgZ#7Yxz>VBO^}q3?}1mH?Lq>ewH=RTlT=?oVW`ifdIjMT_6*U&
zaLKwbqUR#PUE;0{&2Ls8W|iEQ-cD{fhlO5;=EWDJo=~5!+IQ-eHQ++?u^Q(Ajtz3P
zmx93=caMe~&BVb-=A3aBnfdqRjX$^<1O_Um!*9i-WWz%C8gSIkBY0AILHtiu;RNaM
zaRH$LOsd>Cx+{|OF`w^uy%g0jRNKwHm{-AgVrFuEFn5787nPY0<Of%8(-y<f557aN
ze-muU<<3Ans%OLbmlkA}f<NCffA`=}JqZsDDR)4aVoXFw2ly&uaFf>3QZXaRjR-PZ
zj96EPTc$28UCF@dN)x|n2ZP_07f+&-;{fAjGZ>*&v~U_(4pKK6E#Q!*H2D#_ek^p)
ziVwp=6F(&CuqMr+CWZ1!5KrX5bj5<Pr3=FMhP(O{BnxD~c2SGq<KvAm$Dm7|sKn&a
zP{yJ)KwdY<idus2)H(_tk~ED-M0lc&BMyMEZ|w`AK(L!rV$CUsF++@+J$~9e&H~SO
z;qZ+5C<aj)8>4VQ-Y`u%%;Y{Zw^`ETnXW_N9M`nP#RlM~v44NPJg|VV2XOI|C?0@+
zo;h%K^AaUZZ=ZAFrPdz5Sa|$>4e(KHI509cOjPy{kH?cJ3pN3{1eTMa7EMx~hfH<+
zMb@AX?j52)@S7BEXFl~FBA{}@Yy=W(6Ob2+VJ@t5C%}f(rznredc}af2C-Lo0fC3P
zQPnN&qG56WRGpm{&4p32FWU|cj0*A!m1J;0t5<QyzP%E{fe@CgmF`VZY0|U25F7)g
za7k)nI<(yeA>tv2ynwVBc3IT<?pj2W*X*W2wSp#F%$_-0qQd^5ptA?c7$CWvU)erP
z>5V$syWn-4N5>fiQpufMtg;U2ADUDnjub!(jM4fnVF2HVhT9O##t&<aCK_>`(px5k
zewq=l$?d>MyT<RYH~%w#^m|=#5SA-sutuZ@J6<Y8-k2Ca42>xYI_|LvT#ooC`d;S*
zWHj2_B3qO4<y<f(s``-}6A(5Y9Am{q(xwFb$r4Bm(;r~~*imU*nBGr165g2wR|G1f
zacNX=<Bj^Ps*k=-_6tFfP@%ko={KfE`wheYC4mfY?qZ(M>9IiN6CQF*!z>Mz$aBTv
z%xf(Oxvd>^!i1MgWH~f2G|DqlsK6QJsXR-*=8-e|E}9vV6A!F52MUBs)kGf~QDUf}
z;#D7E!VHzeS5Tv><3Lzp5R5+fJpVEK`?{Ws7SP+56&hPfvpL#2{p{co#NQ`Oq(oDB
z3dde0s~}`il-=3dIHSoSvg@WcwO-{9$7bQZGah(WB%1S}YH6`xaREuDBkT2f89vPk
z2S=Uj;^c~UMSE3Q42)w#VpBj{`-M2?#`?od7(T(Mw2<#J2VeZ!92NQR@K8s4V#dZL
zeq&>ZHtZCpI5C(!+|RaM90-OOHe<7)r+PYL){mpkwBAl@)fUS7@+9Cr&JN^@;0OeO
zH$70}+zrR|PPN(sk$1k0A2OnXl4*)UqUh?Jxvh+BtOyEE92jlXv0~yA1m#d*$4um-
z74Z6F>2v>)g5uHfYbLb)Sx1)t@F!;x2X>u$Z34YQ*wDagstT5{h&cY#mxi{~NQ&GH
z|A%~2Voe`5V|4ROimHvqWM9iW{`e~bSic&pv>WsShXE+^Z)2Jzw`f;X)g8{BAufKT
z+1+$FLK@JL0Z4ENpxX>yBulGoGH&-YL3a<1s8?mWg7U`$Ffb0?GD(~TVKeb!^Lb#i
zHZmVTzimw&iZ#IAmxT%@k{*|Ska|U*+}@m~4)I&qy{<Kw68@l1*T~f9LGX|{!+$oV
zaFTGW{t2G=cX%h78!_~!kx2)enWkNw5NQNYtBtoz7%<JWl+r_s1p>XH#q2nhm(2VK
ztO-B@#!aNG(SgSQ7G_gIIVvhKtNU2BSq-J&0H;-E+1$nkWhTUzfPqbuG8;Zr^e_i-
zjt!=t8SS59c}Q@uZ(Zo}IA&I(!z<KVpwfqUF4hwo*C`Q{6(6*qhwLBOo*$xLaE0!L
z7?3Bd0a8o2kI$eH7M=^*RhS_;Yz;$aSFZ7_;F868RF+b$L8Hq{RX+WNCH+qktX~}l
z;P{&w4>*UV73bkNy7@>N?QsII^xy8h)rXMy+Mrq&N++Hh&QMdnrP@Q151Q#`^=(Gi
z_eA1KOiGUtj*4afakngp4ug_1gc3A3^e;TYfdlx`mXjL7V5^~wYJaoE*>G8lG+#o{
zQF}%bo1aNXBZm(@5)rmyN_~JqYr%u7Y`6M!AFTE`Rl@qaL=x}Iw(vB3%Pl7?HG9Wo
z9?z;%^b4gH`aTO9WZT@UXKdwdkmF$T#t~8iS&fIDOhWNs{)#bzYqEoyG!5OhXrZ$^
zzz{Iv)-tlZ_5kpUbQ}kWHTg?kbUG~?&ZsWTw{BJY2*iC(IZ^fq#z8~8olHj~CZYg*
z*bb$oNgcYPLe>2J+v=&^rGoP)2fW$z(s5n)ZV`j~N|B<+qk(KrBmklnLyS7})~HP^
zQMDQt;=6cPcZ0?q;q~to6Lxv`=zi;3U?Cv{1T1;vXDsXl>+uxBhJ%&H4T<U6i@b<m
z+-lLV=#cgvqRrl=J06~Br4_E>{OBL}x!WgsK5<R;`47`+64L3;*ml-OIZ<ohllSm_
zMLe8vr*;V0s*;^KC#(b_eD(EfKON5t1!o0AsG#$4bubfI4<cHaDEo4VQT^LspwD*N
zH>Lm|`MR6X0Sd(&XV`EpU5WQ^x9bKp@y?chrwQi*&D_{Fh(MumJT{`8^z396%+;~n
z46_0CMa2KK9F4u$S1+OZSor+?n%+jVrPxnw2aw~SLsyJz2I5p4(*B1?u6f&!rJLId
zP81@G=m(VDuO7V$f`>eFiTqwGAnZycf(Mp;Y|}iYMHDz}tW1tKUrDDIw;Jc!j)$MX
z)@FtT$ncV4lW~YyW)h5Xl7S;GXY9?Jz{7##(5ElIlgD_`;);C)ZuBkmenaNxm;tL+
zj$Ns`8Zmr;rS-vO9nu&T)W@b7^D?F(7Esg>!{d0qWXyLKCPOkel(8-w_?y2t#z#on
zE;bv9j=h4NA*5Q(Zc=B3EGp`3oFANof=uWccJ(}-O6P^HCkxA#xNQE9Uk3eMtiNUP
zh$gi*0b{O0Cn{Urj14Yq`&%q^aw^kJ_+iLC&WRBPTe7w^419YfeTKeq@fnxF4o`i)
zgXaDQp+X!r%RBe$?=0C?piORn2q!|veO0CN9zkHGo{xoJy*6q}vR%*{5KT;$Dz<J`
zn&QySR7?YLwG_!`9GT^xWm8KpS?jFeK{{>Vv>-%oW`IJK#Im-N+u%CD`-i3z7IufD
z-^b>SFT%pNdcHFPsrkK|=*r$d?9ZK=FDCVWMAqwRRn%M*tMjk$z{#pKLPx{k+G95w
zYx{&ky7f&<&AyBfkYWq(+*9RJIqF<^w>7fcJ*q^d{f9{ja!<5J_ZTEe6s5=~`$i`K
zGO62z5%7Q|s8#vuQzb7;dw&-r2HW;jr=Bd3ZRs{4RxYJ4z5VEk$7g=XYdh~rpS#`8
ze@>446aH!inwXazsM9ixw;<WlZ~11otwuDs8a0iIQ&5fm5$7prv#ROLfysJ-Ur+vu
zDk086`}hymVI*%4f-};^`SWi+m*K0LVO7UHcnf4$oPG(7kZp;9VSeifjwfE<@j}yX
zKr9(ZlbM7!v$dO8^h6!9y@J`ts#Vu57XCX*zFyPPnlttSNVA^7qiwxI$+4EAX`PE`
zs(-lg;ZxeIiS_rVJ}6YlDR|s65{iJXT!72=itCDzrayNDKOMSfTlGEXeURca9_H&n
zvwwOdbG$-0r8dj-o;{lbWK>FU?mP<R(=I$vl*DCbf<j8FwXmdNoM<cU3J3e%P`7X$
zd=ZZqav?DUjOBiz=Jr-^f84kj;9yOCx4G15#s7QN@2e7U-I=<-^Yld(sFLkVg7a6!
zc&Vac)-1p~9%9ocPm8QDa`DGw&>#)T*+0e8Q?UiBuhQclf&$>tL(U~nKH#?f{zqS7
zg1ohkV{mR*th>(1z6)h-RxB(eTtod0{o{P#bLMqFuzaRkTzfmg3W8=R>cXBIZ%HRl
zzXP4f(`49uM6pY?-&_epP&ionNv$g{(&YXhiN-ALp4<Mf;pM2uV}U{^9?ZQ+`hjq}
zlBjN=fIQFDns2(K(eD;<pq}E<qk&n^`lJl;eO0TlD>9_J3N;i`y%|YjfeBOWa>>>|
z<X>hGzz@^7TjI)pc1%Iw)I~V=Lk=sb4gH?d>4rH1=hdJ|;<avNPsk){CrkO0WnJ)=
zOnp7oNwcONKA#%or@?gw`2maH-)y}89$8Quk=8CTzY3caG!NZUu-m`j2p48sRE)AA
zLczYbDJtB+sbgfQV~rH^y#upP>F|jhw(5jz9K&S7qpKtegeV9KMz7Ux#!gzy!0y($
zV^b1^MQRtij>`ALf~XOj9Fq{UUHJR+Wv|x<@N}&tHzX0y!^dNW@XU4E%8ThELW7I7
zdr${QIk`~<P|lBlL?-0MnA)Tpex(`eYkjz>3l#I~m;InZI>OdW=>tThXvIA3r1=)N
z0thg$Oi-vgFHla9P@py6EB*aJpfbV<A78b6V!;3Ipug83pni4-0YX;ZiS!a8<ez;7
zQx)ND`pnM@D0%y<C(^2&)<zFB)W{$fJmgxm;i|oc><Ra+Du5cbnE6D)dcd}heCv<}
zHZ4;6jL!fWz<YBFk!uTmxTFD5(+Q>Xly9#@avn+{7g&BoCn+dpi;8RO!Ba7Yn2}g1
zwa1IpS`Xl-Be%+6*oHpC+-wqe{E7Hwn1D0FOnW1Xob5ToRkd@RD0>TlYW1)BRz7X~
zO2K5--%wkZWs#KLukS`}lC(j*NchRmN;Nu4+nqay0XvD{1AEF#ND~K6wX3Fzsohn6
zqRGU|22_{Hk?SQpcKk36@RUiu|D?sILP$m7DYX#Hn?JHbmw;VmRg%_zqK!A@PpSlM
zFTrGy@vD))7k2v!kg&5#%yzM|FtON_MXtpl%6Ew4JH`e`?ckQx9Q28B%Z!AlO6^`O
zh^KPRh|%vtOFS}r)pi&)eu;D6G{i9NL1hkH0-+}-i3#uC((Qhv(j_qb<2PZhj;kRW
zxT;K`qwA848)P(~AzLe<>!M_qd8@bjg~5RO({$oqJjY7c^>m7uV|FL6K9TzpDSZJl
zq#G$#@4dW!Y$L`Ns#bX3x>uShX?CrTmg%DmOA@I<S?3tg{wX-LMJ-`lyzv{RB10Hn
z3y22+D9AKbVzP+J|C~PK#}`hVm}Vu8QoV#ND73|RxVJg-CF!WoH@Mv+?Kdtuv@aYM
zu6eK?<-*4iy2*d_D-<rsFF-OG+z<Tbkeqfvk<-*<kUN20@tv()Ao*(nEbZRs{rAb5
zJ=s>3#G$us^PUMG60hK?3llha`GyQQ0CxuIYYid)uK^E4r_BQ$p5F|x0WE41k^TRz
z5x8KK|5+yfFG&A;JD^f+8t6Cg)1m+SF9dD^LejAWPyH|BfDVxmK^Z!%r2l*R0t3VR
zAA}iP5I7z-=&ueUba|4L!T-UKfE4vmL4vx-;2WSHx;hY_6d+MbOi;J35_mTVR?i&V
z2jrlq2VMx8)H8&brUN0<Q-c)rmB6(?x%$E+|EoBFfua6SIULZtJ_+Fa!ty-~8?>ZN
z{QpY*FhB<92k99YfSZFl4Q#<NKxBrd5T`1ja6?h?|Jhq8Fff$=!J}0N1GDfjW%06f
qbGLPNVs^1{f&YJ#0RsaE!v%vV0>Rn+*Af<pzz7-er1^hy`~LuHIKo^2

diff --git a/dta/classes/backend.php b/dta/classes/backend.php
index b2904ae..892859b 100644
--- a/dta/classes/backend.php
+++ b/dta/classes/backend.php
@@ -21,6 +21,7 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  * @copyright Gero Lueckemeyer and student project teams
  */
+namespace assignsubmission_dta\util
 
 /**
  * backend webservice contact utility class
diff --git a/dta/classes/database.php b/dta/classes/database.php
index 6f5c82a..28917e9 100644
--- a/dta/classes/database.php
+++ b/dta/classes/database.php
@@ -14,6 +14,15 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+/**
+ * persistence layer utility class
+ *
+ * @package assignsubmission_dta
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
+ */
+namespace assignsubmission_dta\util
+
 /**
  * persistence layer utility class
  *
diff --git a/dta/classes/view.php b/dta/classes/view.php
index b5d1dc8..0c01db2 100644
--- a/dta/classes/view.php
+++ b/dta/classes/view.php
@@ -14,6 +14,15 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+/**
+ * utility class for DTA submission plugin result display
+ *
+ * @package assignsubmission_dta
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @copyright Gero Lueckemeyer and student project teams
+ */
+namespace assignsubmission_dta\util
+
 /**
  * utility class for DTA submission plugin result display
  *
diff --git a/dta/locallib.php b/dta/locallib.php
index 3aaadac..911dc3e 100644
--- a/dta/locallib.php
+++ b/dta/locallib.php
@@ -18,9 +18,13 @@ defined('MOODLE_INTERNAL') || die();
 
 // Import various entity and application logic files.
 require_once($CFG->dirroot . '/mod/assign/submission/dta/models/DtaResult.php');
-require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/database.php');
-require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/backend.php');
-require_once($CFG->dirroot . '/mod/assign/submission/dta/utils/view.php');
+require_once($CFG->dirroot . '/mod/assign/submission/dta/classes/database.php');
+require_once($CFG->dirroot . '/mod/assign/submission/dta/classes/backend.php');
+require_once($CFG->dirroot . '/mod/assign/submission/dta/classes/view.php');
+
+use assignsubmission_dta\util\DtaBackendUtils;
+use assignsubmission_dta\util\DbUtils;
+use assignsubmission_dta\util\view_submission_utils;
 
 /**
  * library class for DTA submission plugin extending assign submission plugin base class
@@ -174,7 +178,7 @@ class assign_submission_dta extends assign_submission_plugin {
      * @param int $userid current user
      * @return bool form elements added
      */
-    public function get_form_elements_for_user($submissionorgrade, MoodleQuickForm $mform, stdClass $data, $userid): bool {
+    public function get_form_elements_for_user($submissionorgrade, MoodleQuickForm $mform, stdClass $data, int $userid): bool {
         // Prepare submission filearea.
         $data = file_prepare_standard_filemanager(
             $data,
@@ -228,7 +232,7 @@ class assign_submission_dta extends assign_submission_plugin {
      * @param string $areaid filearea id to count
      * @return int
      */
-    private function count_files($submissionid, $areaid) {
+    private function count_files(int $submissionid, string $areaid) {
         $fs = get_file_storage();
         $files = $fs->get_area_files($this->assignment->get_context()->id,
             self::COMPONENT_NAME,
diff --git a/dta/version.php b/dta/version.php
index cf9e0b3..c1d02a0 100644
--- a/dta/version.php
+++ b/dta/version.php
@@ -25,7 +25,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 $plugin->version   = 3000000;
-$plugin->requires  = 2020061525; // Moodle 3.9 LTS
+$plugin->requires  = 2020061525; // Moodle 3.9 LTS. Will likely run with unsupported older versions of the 3.x branch.
 $plugin->component = 'assignsubmission_dta';
 $plugin->maturity  = MATURITY_STABLE;
 $plugin->release   = "3.0.0";
-- 
GitLab