diff --git a/graphics/300playerstrace.png b/graphics/300playerstrace.png new file mode 100644 index 0000000..ff8928a Binary files /dev/null and b/graphics/300playerstrace.png differ diff --git a/graphics/client-server-architectur.pdf b/graphics/client-server-architectur.pdf new file mode 100644 index 0000000..50a3442 --- /dev/null +++ b/graphics/client-server-architectur.pdf @@ -0,0 +1,325 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260429064306+00'00') +/ModDate (D:20260429064306Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +/G6 6 0 R +>> +/Font << +/F5 5 0 R +/F7 7 0 R +>> +>> +/MediaBox [ 0 0 822.95996 216.95999 ] +/Contents 8 0 R +/StructParents 0 +/Tabs /S +/Parent 9 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +5 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 13 0 R ] +/ToUnicode 14 0 R +>> +endobj + +6 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +7 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /BAAAAA+LiberationSans-Bold +/Encoding /Identity-H +/DescendantFonts [ 17 0 R ] +/ToUnicode 18 0 R +>> +endobj + +8 0 obj +<< +/Filter /FlateDecode +/Length 2177 +>> +stream +xk{r=#vۅ'_?Ꞟg3>KU%S%GO}2V_C nj65|9,/>uûO2oE })AQ8hc +,ǐ,kd_g9x lOc&lBG*x ԯoM)-HԾl!gSh i#>.#BaE_i8T DׁШjMwƧD#DUD 8#ZBԿ jקOԋ*J /^:ŻOkDw3 W6ȡX6q&,"DD54EDcD3DDNja^CdCde̲15lY.yȑLmbW{E{=$t^"[7e@nXH_B TBhfڕBdzB"5rBU=;ɇ混 +n5=O\XL< |hMea!Ʋ:쬉vzڕeUioazi" eǧ,M_PkV̡]CҚnml_9H=/+i–JCj!];wi +R6( ʴ|sO2=ÖAeFPӹ:ٖ{ڕg؟E>55ZjS`W;Aka q*v j-M @NZ”&Ve~VH' V6& +H/T&Qg1*{O9kBQ9'Y +A/Nϖ(j@uTŔ2FRrB *jĚ :"[dX + !qÝ0,Wg5\ɇBvR #cZ D@R!W`Hq@glV@(d?`T+D] A]8.h9Fjl 0@ BsXifi9T/VH$a4ZKSHYQIIK:sH DM+HV4KQ(Iy'urek݈E!F wbv5ۑ 66'7Oպf;z{Xx V.$ A% i̴L.W1+n-`r1wi`Vt:&mh&&P6JN"CL*gqމr0i3$Mޚ$,8Hp'#%xQGA\j7o J1o'%Ԙ;3ass0Pg@w1_?˞H~ +i)зdp B 轚?[D%2J53䳘dfYo}=ˑtZU߹Yyg\}uŢ-忥R[K?)qfsZ Bm7nfK ҘՔz7Xkbr%C.Mj دZ6gإP +~BY3E\=_IXV ,6vav#]q${SN%,W i#7TeZ&K3s]kHkjvCoDD|G#_ +hB _\v1ZNs]' IuYӝ]n~vJ>z=zM]/]i7Ӷ+6X ϵn+F3+d%KCCuqO>UO "\y_u%|-Fמnbs③ːwSxG½D͏ ?tr+g~Z&i6a}< +f#>N4U?ONar{.ԁjic^ޝ[=V;8k}W8nՙ]XlYV7jsillT^Fey,2Ψ{& kۭq3Wcޗ 6]S#!8֧C/=k{ti?y;9r/Q;lc<}3-  +endstream +endobj + +9 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +10 0 obj +<< +/Type /Catalog +/Pages 9 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +11 0 obj +<< +/Length1 15768 +/Filter /FlateDecode +/Length 8019 +>> +stream +x; tTյ{dLrNn>$@+I`T&$ d~H`RQV"">AV@HU磖֢Z 3;0j]> Hέ+宇^CmjVnsUƥmn- - j8e7]z묽\Z]-͡$,`4tg@Fˍkl4oh]zk;m1+y."tc[Jp{tCjn~9{d)L(D7΃ yp-A$(=,@vV(ṛ5ɘD  c]h98U + p{؟(ŀhr7XJU4P m\^] +"ߍTGNNwɖlY+%xP +0jX!h VZ>A]4ȊqUU0OZ`פtݾXX(kK>4lÚx=\ϓPSy*4p Ⱦr, ZaTCV@+pC!BB1\aXͰrRYy ;p`- +&3<,VhJjva",IP + nfZa)ϋ- +WPgs`,\(}n +knQbjY B,~ş/F ÓJA5b6w~%ucЗ uA?<qIxEG& z % +d`UUE4@3^"zq:/Aw MrXIÅϠwEރ#JH]x 2Bk?j Cw#N^xv]F/ @-Ίgp(8<8jqxd:SyDJ܋øa5s#?Ot~dY81D5m?D'xs~|6G>SC8ٝ~u~=Sڏ ]o+!Sed/Ȩ}Byo9LK, /NtFC[g?BC:<k:  A32:HvJ=!I OzJzxSD>>b8^b{={z0[7y߶as[Ƕۢ{{{mkVg+l={W]wE; a3r\+v6ce=d-CFAџW\¹WL.4HRd $jəU -$=TxOʜ;9>Y+v^+v)ߐZkBCPK "i `35Nk0 V6{zk~6:Rb$(eVOjlvᢺ^ĻwlUJuRp\RjD9Y]'`v n[e%wvnC=Ɔp=p膰;.TRv!k"n5>0MIa%$Idy,QmkZ1LkcW*A99uF)<4Bn#]OK"LһMߦo7J>E u5s+T\+/+}uKMR\=qBVfr-&AKҨU,CS$K,L B"'/d ćx,BA !RVHC $xi%bSD#?fMtLqaUK[ʄ/}VTRЕ +'W%`YN6&iJfMN6jJҤl& +m8q*bb^T:Y,5I2 +dϑBBREĔJ"_.86 Mk$2&˻LniP&M='Y%,rh;D4 +| aPXL(a2R չd|/x_w;\,FWn+$ GI1؂UJU$"Ƿ$2S"3k2 [*1]. EX:bes@s$"(SF(Z9B\9ٕu9I(_.CRb]'`\Bė^^"34-%:KbZ$*KmT +?^pe2%_')ʃ[Rb>'[pNrI G7?\(% ./SS$0{tteʗW)U$K%ZR^W|yw,,K{<";"̶:*kZ*9\uKB]s@v;(M(RSWY-TV-W$FQ嗈긘ΔT*ȀDe%:IT0{DeJlJb3ʎ;{&_pKI|ysYO.JTZ1"K+8WlB2xZ1B"3yTIDfimiKNlqc(6U͘Rr%pU֌dcJ>7h\ +nQ.PaP(T揖cu؄Gߡu626R%D 80A%BS [ #ak_G/ۿxZo[o{/B H`)&RI +H;f2cIc'Ldtj>U1\]|>,Iͣ#,* )JŒfh hhdFϚq=f 1ߌyfW`Jz=%ynSJLBc.)1H)G,Ò.2k÷51ex:0yt $0ņ(X5u < CvH3izGj ԛ{mlr`;?9_qc +CQBs6Wg(?9=!AnLhLfJLvA?T9"Ot Ѧ/:ЫdcVo "%#7fjɣxXTEЉxLSc &D}7uǛ,ʣƶ}l {WPCw]țqZɟB t`bjdjbDc 9hP¥ӎmv8RHSNl#w@*ٛU8+rodO<}≇#3s]'Ϭb?3vȁE9C6PyZcb6]% ZgŒd[O/,HZJ+|cua8$aqn ` ^O}}eP.4*_˂|P.:=Sr dqQ&OB:cǔ4ExO|MGOZ-E7}ښZ/68kVʷ w.H bԞBD&TdT,I$Ө:ʒJsi9n(p2j8+soq&n#pܕBaZ[9<0Or99Jgra8m_-vpx#^aq8pH\Ç9*pqpy?$8S>) Tr8DQ(UQ诊B* +:ҁ[+CCvrGS\cCHIN*3(xhBukH.| {jA nq>?iZ\4XӨ‚q8&vRUeMգAߪ'HdJLF6P +; /|0JYoA9H[<tzVq/e ;*YMpҳ&zP8 /CVOX-6|>֬]B.n8i+1LKڱhٷ}wCذjBf7bیnYv‡TU3[5 +KrYM֑i1pZ:,[-,b4Lɜ`#T U ѐ[䍙m)25EB:a2= &o2+/Ǒ}i<7 @lPWlLxu2&,Z-"Ϟ?{yCϝw0jȉ4O><*U x<|QS8sqW>vc^>l>P22:(8c:(& o*]S4edQ| y +g!Ϙ5y,'PQO2+Ww߶zk톊Ȃ͝iU8BN,N{4 GM?O`8j2UMMK ͬDgg4 p+ pt]jUl=Dg.Yg75MVg&k;vHv]d;yӫZoFnv  /*gbɲ@Q*5mxJjԸSjlSSƳ ]jQ\T7+Hm~\챒&iS__wn~5 Du2_}@7 6`bxČ[fl2 5cԌ͸S)*ghQ9:f-f;՛qyH($qJ$(֩Ѩ(.%:z~EPשۥНѧtXQAY%P* z)% ;~*e-CGnC\*N)_E{7w#sH}BEg)Z"h +giis'IA9mJ88ƨR儂eG=W843j4il،:'8@Ɂggԁ1ܥ-r76w dWBM'R<&K&_}{ g=ׯ.:d:dn[}I ؠB61I@]WMhcc'v̷)h.0Zh$+TGeB;'o?e}?L|.4Go~~B^7DP㨫!2^jIR:+DY +XZ#&e7 {- Y,ȊSI|5+}`5U1eLu=Yun>M1O#ESt~w#҇zAHfB,Mn)^^xdo b#u $ dj`4F 'Y[LbA^n[1m59kUw楚5/ Y&C8eҭNYʝK'v?I?6c6B6l`6vf78ף,"6aP#GƬ<%x.92䳿=IΔMu\o|77ܿ9ѽwlq.i^m-W_Y;srfeW9=KLbbI2ei$Ԩ%բ@e贍ʥ}|;&3cXƛ[7y 7Le>[?\{W/kqG j:A8ìR%ajR3JtV5a˵o|ILP(Y&QNM98'~(S'JM ^+~5$A02I& Z-X2-Zh+Zܥmcyb b-pR.RXf_8K~3EFyk1OF-6~xɢk_syE V9z1C4iS4aŸPӇʼn~g5!Y@^ Odd֨դLSTɆ?ܽvݎvl<;ζc3h#a?jǗg??ߦ/UYB_[!%;6;nYjX-vx֎v|ώؿA0?<96*3;,Q~;Ѩ Gn4zҫ1>w/3ֈoMkHNPlz=㉔G,ݽ8M"} o,H*ޫKݫDמS T/O .Bq":`HL-I.NXg^ :E>Fc isXX5_kZE$inS1Q"DG +7R, D;&|~ל>Y6 ~6Qii,t:6n*{@F|1% OGi,1F +bgi֟vƷiܖKN#H~8NΑO$0jd%ɗ Pv]PK4ҴTI$-BȋosA> +d'E^٣8EeC4 +endstream +endobj + +12 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 11 0 R +>> +endobj + +13 0 obj +<< +/Type /Font +/FontDescriptor 12 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 ] 36 [ 666.99219 0 722.16797 0 666.99219 0 0 722.16797 277.83203 0 0 556.15234 833.00781 ] 53 [ 722.16797 666.99219 0 0 0 943.84766 ] 68 [ 556.15234 ] 71 75 556.15234 76 77 222.16797 79 [ 222.16797 ] 81 83 556.15234 85 [ 333.00781 ] 87 [ 277.83203 556.15234 ] 163 [ 556.15234 ] 175 [ 277.83203 ] ] +/DW 500 +>> +endobj + +14 0 obj +<< +/Filter /FlateDecode +/Length 340 +>> +stream +x]n0E +/EdL"!$jĢ=PKX+g_PN Ǣ@ hh?rAIq8Gagvĩ+ڭx 7pa¡ǥ <Z_ Dp +endstream +endobj + +15 0 obj +<< +/Length1 8268 +/Filter /FlateDecode +/Length 5479 +>> +stream +xY{xTյGr I@Ιf42 LCC0Jv@A$( +Q +Z >mmPZ U3sLZmLk #m모~߷/.ѕWF +` ʕW .-]yCQ5 ,6N_U%@f@/sۙ Dz#5p50} \};77G]։cؕjNv0/4 +ۀ 8dO&ž:эK`;*p _wC@yAb 3usaA +3-g|l~Ke{?4 R ǹ' 7@*."rfc 8 sv5B  +о(7,33|LBavt!~\:lH&ү: 'ɷl3h<}Cz긍Fn?;~5OGX(,F_&d\ċauۍ-t#iv6[_~&n6dG6 C`Č*+5{k|+QZ@ Ztk}X^kZ  bCb(WP٘٨ʔeJB a%}r(d,ՄƽcЏ>(3$cPZ30 %XR#JA%,2eX~(h4vZ UAAgڋc +c-VbxXԓ=M*Ei lF;A0ƽ$htt  ~DG4rfǙgOvzORޓ'w|wo˿=^,y^~V= 3;BBhT>y +I+B/g'G8v&ءcǏC+OzXFV6N.FO?哵KNjC|q?!r@;=? iǁNIѲZev?OҲgflzqc|.@ +Fౝ +@Ш@+{{wl{Iۛ +#< k}Ar}ụ鏒d<:nhﹻX.GB%;}=T#v;;v'۶oھ}xۭ>mn%L[ȶU}+6+4Ѝ܆v'v\'w8Kǹ8E4<] + m׆S1c>9[%KȗeKӪrzD{*g'A~/vUi]E!kZ~/uw͐fmm\mu7N9Zy+/-!(T#5DwhFUq^e=jR#O_1b*zhhsOcjcFcjcfzd,c,Y̬{c}z{GDl`PuRY\-ʘvI}j_쒰"QytfQMzuouԬ1SvZϚ$]Ue t$%3`Kkԩ3ahHUBxrd1I7Gabnq[#=:@#Cea󆔁{uT==)cC77&aq +}#pVQѹ(8{gd3=z]Q].SW-1}d.gu4ǡVD YE罋V+Ml׹tǶ ${T|VUj+f9mGV(~,Ua]kRu->ʊf9)8LBj2Ww-mzn.ٸWJh)ӥv"<>V&&j 뼯y4ܷJ>]RnEtEpjKnR[;K;b0uSj԰;FkQœ׮^% ^Nk^nJQY6)arcRZ/=*Mi9BʩeR:E[ܞ'~NJڰ.z-,-,ޫעsrϊ^ jDPt=bc1NYu;'Y~)%SMЖOOQ5ʔi9bn bbWB =:i2gJ}jWΐn _ホA+v784cL-]K퀲;#1E[:@32"C0M}ŐwԀ+_9N0hIa8S|! V )6)-`%E1hL5f$.s#5cX KE ȘUs$F`%-ᖞ{EncD" j+{4+}P6FFv9yI'utN]0FI3=Sm` St\#:خeajו?wc')+W}ae8xE8ȡZGS9LsxG?"npXQ.fdbZRd`3WFDdz#ޔ3⤸Nt줫 ,s6l 3I٤zJKᩚ+7+įk'ȑx9a9&[^Z}ļk'Du|Z3\f5L* +̙s4kfl!X~U +÷ZG=K&xYB +(5ճxPS=ˣylRgn!)q$ra?͜yרfl L9d"/[7$NUsϽz'T{>']r߼o,uˆ>pU\l6;m~9jSIgdB${u6WM-[BvNNfG$^P,\OP[ - +2A6^w .jڧr9@bM?֭CbuR$DZ +P0s~:v@X/F&inPj4%b!YEA3U9T5Cf֗ߐxZfnىCkr"i""iHQdNtTC}DTTR?foLm< [BRh)).s=o:klηKKz/'ъB /%Ю)[n؛ʃ'!mZfŒ?R·{:N>Rt:9f*<'ԍ\NV]?uW?0ڻ\O_8<1ٳ NTj& &乬ExW\Zf \W~^vNqIN3liG>'=Rx>'BF߬qxy_M*:z*$NKy^0[{rMX󇹽0|dPdFL֌ gJ;%hN%jZ"D9 R":$vH\4,q.q NKtT:.qH)q%I)qQnS$ʕm{VnI4Rr%:%b6vJ{$AhT-qhF$]:$^ %MJiA%I.=-.MěD@0@NBtz/D4" )U8R"4W^MIy !0U?+Tl +endstream +endobj + +16 0 obj +<< +/Type /FontDescriptor +/FontName /BAAAAA+LiberationSans-Bold +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 76.171875 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -481.93359 -376.46484 1304.19922 1033.20313 ] +/FontFile2 15 0 R +>> +endobj + +17 0 obj +<< +/Type /Font +/FontDescriptor 16 0 R +/BaseFont /BAAAAA+LiberationSans-Bold +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 3 [ 277.83203 ] 51 54 666.99219 68 72 556.15234 74 [ 610.83984 0 277.83203 0 556.15234 277.83203 889.16016 610.83984 610.83984 0 0 389.16016 0 333.00781 610.83984 556.15234 ] ] +/DW 750 +>> +endobj + +18 0 obj +<< +/Filter /FlateDecode +/Length 290 +>> +stream +x]Kn0O1d! !H,Pi@Z*2΂Wx(3aյ2wCr8'i(-}c/k=ʴ2`sQ9N62^?/}mzbJO[Q,BjpDטY&9deY9C}?Qʯƅ݇2!":EG!({҉.TAIF跎.(DٔtDA)0ЮQ:M;95??: +endstream +endobj + +xref +0 19 +0000000000 65535 f +0000000016 00000 n +0000069222 00000 n +0000069494 00000 n +0000069534 00000 n +0000069614 00000 n +0000069765 00000 n +0000069844 00000 n +0000070000 00000 n +0000072251 00000 n +0000072311 00000 n +0000072434 00000 n +0000080543 00000 n +0000080797 00000 n +0000081341 00000 n +0000081755 00000 n +0000087323 00000 n +0000087583 00000 n +0000087989 00000 n + +trailer +<< +/Size 19 +/Root 10 0 R +/Info 1 0 R +>> + +startxref +88353 +%%EOF \ No newline at end of file diff --git a/graphics/client-server-architecture.pdf b/graphics/client-server-architecture.pdf new file mode 100644 index 0000000..5ff281c --- /dev/null +++ b/graphics/client-server-architecture.pdf @@ -0,0 +1,322 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260429084230+00'00') +/ModDate (D:20260429084230Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +/G5 5 0 R +>> +/Font << +/F6 6 0 R +/F7 7 0 R +>> +>> +/MediaBox [ 0 0 606.95996 402.95999 ] +/Contents 8 0 R +/StructParents 0 +/Tabs /S +/Parent 9 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +5 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +6 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 13 0 R ] +/ToUnicode 14 0 R +>> +endobj + +7 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /BAAAAA+LiberationSans-Bold +/Encoding /Identity-H +/DescendantFonts [ 17 0 R ] +/ToUnicode 18 0 R +>> +endobj + +8 0 obj +<< +/Filter /FlateDecode +/Length 2117 +>> +stream +xZn$}ುJ#V^Z@ +oɳ!,:]MOlρwCUi.yM9 Ѽ%P?_pM쑴L/\-'vrʣ|>OoSLE[G)CMi|S:RK(^AO"$/x0{6=O}E)ܑHO^{9}틺ȏi[yֲq;vqVO}9OL.h܃X{c,P.˲>䞾NXى`!RG^H$h{%E`Tzo_ǧ7V|&2Jj[܃Wi,_! Q7JȺjى?C1SDQ8]2{KRg!f٩ pUVw1Uo{ 9'4n BaK TwRfCEl-\$b&f[5K-JՒ֪{K VOCM7Xq`0~W뀲Rqϓ#4O^&bCotxt1'чy7)9S`Pk=7aBB]rŀ|h(b7h ~4nDiFi->#hʸn|-4iTG5-: F;AˌyYp +-DGlpR_HجlW#˙W=X[HO|畫@rDp>ֆrer,0.] iGcE a.c:DABJ}Ǟ-p[麸ڰJlkP1֎*_ي!|8SyØ|_.M\j^ Uľ\g%#1HDiS >G"#V* BцVAb:ʀRȔyS-/=#,0d;$5RR&.˘',>E@2T,PTSoiGPdi,ښ`R#L.H,XZUV=ZHCLjm5Im@ɒn}p?m8&A$h:5,[Yͳ$jD&6W|iN^ G$jpgCSʌX1edFD`C+^%-ŬұS4)\u>-][A/)[n=@Ҹ2J\{O4k~V43fTݕ"EC#f\d ܌T &cqLLM\d4T0S3&r hL!rQsh@LYsQnlEEUsHYL")N"@FJ"L^ڛ#G.MǕݹ,.h\zwVnm؍M~r͡v~wW}̱aE:-ѦT- _:AƈPit=vZr9}}=TPC=T?ιoTCaK^PjGm鸍Wzߖƶ$'J%~ ><?\%W1s(#M1{>qsy&e(^/nx =>>^Is.<+|:;hk=˼ u +:7dE_8\ 3ZeS|?7qrp}'qw=Guu +endstream +endobj + +9 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +10 0 obj +<< +/Type /Catalog +/Pages 9 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +11 0 obj +<< +/Length1 16012 +/Filter /FlateDecode +/Length 8195 +>> +stream +x{ xTյZ93w&II2yO9d FaBȀIf$&E5B-EQ +rQ-oAhz%(V3 Uwo{k9{k~ Hͭ-@h VFfjsԕĆ%Ko5- GZZ8 ׯYru]n=[ ILnnn +0,V?b0YtoYM7@7W_74x-nm`+:ezʦ֡/ @   @t<̐ WP@C̯`gF@ݤVƌK)ʷ,li0 \9?Zv*ԣ4@N}?%UC E@;˪J@ ;J3qɿPN2%kZl@Ny<\%PaTC\ +1b1EUW<aX Ka9+oH/b}-P֖}i#<F6'&(R3 ʕ &X aheˡ +°"0_GX + !2bhШ WG̓&X +߃! +o),LM<4*aa1@+ +W3a1\<\-KzhJVBAоY^J,a6,Ő@-t'$9i`byF|˱!اncp'{6`O<_w-…ZX{4O8բC|]p :xXK| +`9 nv2Vfpmq- xn/Qtg`pF膭 VGta|S( w0'ixF9\-'%%=0@l&/k餚F%Ph;p27hP3Y( \xN/N +^"R;BBȟ]':δ!Lgi8}f:ᷧƻ~kk> <3HA1jjb.=Ysɚ_]JL#{  ptso'cbZw{`dbi?<3hz5gRDHҀt\"s;":׷$9{7eݱ]e+ފ[\mIvoB#Ct܃DO7t&pW]k~]-sE3\ETtԤx5aȘ+t52]W]]D=9TJB,+3&pw\\xOt^TcASTC eL&d55M'M13Θv{z<~66Bb$ eTOrlf^Ļo UHURh\BjD9QU+aV0iGT3D"rG)9D< G"}"HF"mikE>iD D"z G<੏MD"H#H9GbV>*:<3j"'DiW鷙lf׼FQ]Sש۟4Er2xEy9Y'df inf1V24EY2-P&˳2GsivVI|!/e%>< +0/-ST9N43`܄KGKV +TJ*%Oe*CtxE+Y[Lj* fgaoD(iegA.D(Iiڋg!&M%@cȌp-+`vl(*$(QDJL*"e갉身 ׄܒ0j fANq+յUBEکqET,(HP˩b$:CdhZ#a /Q¬!0Kw 9..˚J|ryPZvai\0TRιn KtF6j0%*C#% +JCvzVhB3/Zoy+Ǎ<>VcJ%z S{ƕ.W#ȳ|Fꒅ q %]Xjᔹ@hx3WW`n& f7v U3yp7mY+geg0W "nZXP]@$4+؛*kDKX)x KW(s"@BR^܏483 e* @~J,ר@/&u0\/ʨyh@(W+r*GhQT5Pe5 k d*s4 R7ʎrs+ !(0$BًtB,)A%}2ާ +$!% eXTeX';lQv@Jyk(Ce*=KƏC(ZvrrF,"0`#{נ+N@"p;5_(h ö@]>@K:|w|G"~.;\`h!ܣ+[o~^N-G^I;ϵE瓩?ȒM<X0"qAO 4,i艆^JV XcŐk:V_[X1-xbkqq~tz2,&3'P?W Eڔ>ӉۣԟUEe 9v^CoIs]d*gJF D +4f hz4;55hz!O9^GnC}ݗ0 ,f %EfpPl;xW}Qg}9?>u.N\t( +fy^!VS3&c;!Z7К`7ӸH&5$M"D AEup<++Zխh絸 &;Gg<Mڮj@+d$) @7DC0 lC1'qv#KX԰Vxހ Ӏl5`Ȁʚax AwB*8 l0sL$6hqz':щN,t"DN|ى) mN 9Za0;rS +ω[r@wQrUMJU)(YaA?T1,O p"Ѫ/:ѧNdU5|ɿ%e|^W6jjūxXEsхxLSkk'D&=F[j3rMDr`C ?$Db.thm2& Cj&0d&0a C& 7 E11hfӆ4W9^J +?q<_r-\;͊vX ^M$IʨAK=H4 A%l;@ށC O7j֓ Y*$J^])-]{`O<G=t|~yzm8>B6-0);ћA2=iң;+'|a@SzLI-08+! PKKHmC0<KdDy6+ΥtA!r_3." \²IFSIRq8; ZgDH$FŒZ̐}w`Ov`k +0Py +rt|۵Äbe;4ziE}XT)1dٽS!-s` 3RdD͎?s5~돼=izE Svp7nPׯЂ?*V֛޹ E5VֆoA4&5R`X["ò23'.[vFlf3ϴ2qf13!8gX-0:쮱>oyMނS(;2a↍NӳI{sO83\A۟G&]{7.ylNg#`4/є̘tdH 5>Ԙ@ck:18Sڭ;|Q 7?/#塔=J0p2pnÎ9C\cJ +~梳vW}\! l㘚gXZR9v: &$w%'U1'*geS9L :w d.O${MO:x>f$A|tlj[UdաItVֺ#CIP.fY` ١1*M^4w:ǁ,x1# i%Q;'S}?:tCot#SяЍ"/z&[~_W8*Ht8eh̰PID&& G]D_&dbk&218_G*0k\]w>b$ŔF=|cF|C7~߆mw%҆hfL/Il%_Zxx{o f&1@oK21:3eRbq[v ^GrbA i]>u9seWƦ%u/ iY&A8eҒKb(O!t8\a&u KYYx6 p CYؑ,4gB +>lAٟN3s1(*pJ';{:6^+y;GLԖW'goZPY]-R&^<[7ʯ"gƤKs+vDg t͖`2i)ʞd5t `ҢԊa}>|zT>k܉ FH+E)$onIe}_K5ψuC5s|FYc?R V&SRVnH҂\[l}NbE,ിrj<%Ήȅs⧀/ië$FG&资^!=VTmz8wwqXaJVi '*w7) +)'X)2 D@z4Ko^sb}1H'0K4qTa_Sӆĉ|o!M]@^ODbiJ95dt ܽ́mlt<r`hu 88(~¿TQ~c(9p8pBPRe-hs t| :ąqy,pp` +r'. 2cli7q<<%ыF9DN+I/DC%m d桊' +{էvWB9ՋgS@[2@ܷv8#4H=h_IXT ]b=}ʚ Vaȷd djR"XL *%)VeoX3/&6.05ՒN3"@&$o'&HJ2}4BiHѸ|4YEn+⺱-ȍV#H|9Fa2u?֏q7f6Yqn>DT/~M4!5d-r-eYMW1|GͿ'N,zh۽_3 +endstream +endobj + +12 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 11 0 R +>> +endobj + +13 0 obj +<< +/Type /Font +/FontDescriptor 12 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 ] 36 [ 666.99219 0 722.16797 0 666.99219 0 0 722.16797 277.83203 0 0 556.15234 833.00781 722.16797 0 0 0 722.16797 666.99219 0 0 666.99219 943.84766 ] 68 [ 556.15234 ] 71 75 556.15234 76 77 222.16797 79 [ 222.16797 ] 81 83 556.15234 85 [ 333.00781 ] 87 [ 277.83203 556.15234 ] 163 [ 556.15234 ] 175 [ 277.83203 ] ] +/DW 500 +>> +endobj + +14 0 obj +<< +/Filter /FlateDecode +/Length 343 +>> +stream +x]j0E +-EL1xu4v,de/$)ta m)pA`N bw +zKhxZ3̤((e0ŻTjwi3Yt[º?0񔓲 +ko ( iVvgE|,8pn`כH9%-iJF?be߽ II c^)GJHY#sD1P5OxW5Hu (upwqxz6-VJ"E E(QPr(cW)X:c;B}' K{hyF<(΁am֡iͲ]Kx +endstream +endobj + +15 0 obj +<< +/Length1 7056 +/Filter /FlateDecode +/Length 4534 +>> +stream +xX{xוyH=F_d\IX8Fm)NbTKX&i$)liݴ ݔ&<mݾv 43MC۴M +B/d l=W߽<{3@`<=;_ 1tS27gCL(7 ~ivmLmvMt +vxmӖ6>ҽ@ut$9\IΩO +`Ml-cCuז?yS)a\\-M#jE;?hO2^<,P +>}k&pZ~< tw ̫rס[7n/3//-;kF҇K*:=aC zTF>b& a6Ѝ~`3`+1[y_^WfnnTlF}Xh\3Mp 8.MⷱU?BKySυ_b6D]CfիQ(08',ā✃)y,hq.` \(cڿnՉ؄͆v` + $ a )܆qjPCh0vшeh11l@A0_毣5AA_1.c +`+T<.ǝT6{Dn;>8K,Ց K_ +ԚꩁLU÷ Hk8ow%8B3,i=p؆=FN']Fu4wjk|̴C3p$ߧQ +QZUICdZMdtQZj9jGMhe2FL zmT(y7ȅ(J EEރ6}D  ZN33d7I{&=<Ͳg3?3xf̃g^>#E+m/N??&Rgm|/5ĽD|Կ`Ph!4Z>jKeH?Z7_~{n9qjcx}`:}J=vnA8?5K5y-k_mX־>%~MFƲ=R*rD;8:"#'="fIʻdDO\D+dʟ{^g'K?}ܧͲu^e<56}jjJngY%2kغ[}n[ =*es+"qKMZ^K'kP- ֒ +F0 x.y.VঊQ4h+7o[.8p|;y UڂJI*- Br$KM +{O5 ل\Ow]m\TvDMtt8tVt.w{<(~-sSIiˤ}MJA%Z.[ +Ik'MJ{%nX8MHrlsNK7$nDI\BNi@$zAzE➕h_>*QBJI\Q(qU-1tIXZ.qJ.%MJL:&A $MOJtHG1"mg3R^#Y%Y +JU#y|||/{AVYK7+ + T5sWQ{1rwR׬+JW}ʙnNw]nm<\w5]uu8ѾZ jkjeˊ+h^_.wrmfS^VZb1DA?<(bKjHMvJv S + 'V dJBa$SLK*leZR`I6 Ua':U%Kk{ctqf̯5`;ո*FTzJö́>/Mv#>/K:Ԏ2l%ȘpKB+9Xuw, u:θϻQ; : Hf`fR٬{i̽Y6$<Ұ:!dLf'{Xn 0b..d΃QB}շKEe;}ʸF}1NNd2aU gd6?AUljfZ2PBa%`{̖}ݬw]q2d\p/DM f`&=N{6N6+ +68C{Kcꨮ\XP>ow,ךa5i$$߯jcs^w8L]i [5Û&I_u&%y00mPZTůPeMnP|^)@iJi≅!5L0Jl4R/VhsXR\ƪ:CU2$: !Xjo(c,GS71Ć729fJbs8g^v5v7je ݯv(RPp+ts`bEq>.%3,1SAn{#fYi֠F:v:6PQ/Y42Jtt9qg|^ .蘉.ԮYR0e\E5*L1\LY $Y>/{'=Kˮ6 le5j%cQ3:Z\kVƳ@j8*6%\ЙiM/JD]3Qcuw_N +tS@;͡}Z]_;j]qb;!t.Egtab;j e 2+# eVp6i0 +mZPRM2L+5VI\9&]tX,_!D䘞: q&K4Gb%":6rr}<o Վk% rG|4 5s1EU`j8JՑvV.&]nV_O2#Hu1jcʼpdl'ۯ|*H +endstream +endobj + +16 0 obj +<< +/Type /FontDescriptor +/FontName /BAAAAA+LiberationSans-Bold +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 76.171875 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -481.93359 -376.46484 1304.19922 1033.20313 ] +/FontFile2 15 0 R +>> +endobj + +17 0 obj +<< +/Type /Font +/FontDescriptor 16 0 R +/BaseFont /BAAAAA+LiberationSans-Bold +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 46 [ 722.16797 ] 54 [ 666.99219 ] 72 [ 556.15234 ] 76 79 277.83203 81 [ 610.83984 0 0 0 389.16016 0 333.00781 0 556.15234 ] ] +/DW 750 +>> +endobj + +18 0 obj +<< +/Filter /FlateDecode +/Length 273 +>> +stream +x]j0{b% +"<}MF1xKe =$#3 ͥh̫=J$+b pj08 vrqO軕hawv5'*8_;M4)n B4bNd +ʺ늠ދ⻳:VP2T^SP~ ʞNy*('Qר> + +startxref +86704 +%%EOF \ No newline at end of file diff --git a/graphics/ecs_optimization_tracy_01.png b/graphics/ecs_optimization_tracy_01.png new file mode 100644 index 0000000..9f24cf4 Binary files /dev/null and b/graphics/ecs_optimization_tracy_01.png differ diff --git a/graphics/ecs_optimization_tracy_02.png b/graphics/ecs_optimization_tracy_02.png new file mode 100644 index 0000000..a148974 Binary files /dev/null and b/graphics/ecs_optimization_tracy_02.png differ diff --git a/graphics/grafana.png b/graphics/grafana.png new file mode 100644 index 0000000..77d4a31 Binary files /dev/null and b/graphics/grafana.png differ diff --git a/graphics/http2.pdf b/graphics/http2.pdf new file mode 100644 index 0000000..01cf92e --- /dev/null +++ b/graphics/http2.pdf @@ -0,0 +1,416 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260423183005+00'00') +/ModDate (D:20260423183005Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G5 5 0 R +/G13 13 0 R +>> +/Pattern << +/P12 12 0 R +>> +/Font << +/F4 4 0 R +>> +>> +/MediaBox [ 0 0 274.07999 224.87999 ] +/Contents 14 0 R +/StructParents 0 +/Tabs /S +/Parent 15 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 19 0 R ] +/ToUnicode 20 0 R +>> +endobj + +5 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +6 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 238 +/Height 196 +/ColorSpace /DeviceRGB +/SMask 7 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 158 +>> +stream +x1 Om /g" +endstream +endobj + +7 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 238 +/Height 196 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 6567 +>> +stream +xWLJ@/I! %  #D4Riiij\+ZкxXß=,WH&;{seۓuZ|(|If~+Qwd%|GV:¯GVh/zdw.Yp##mVf*͋UR#O$VWUٲv~`6l3/O{.SJ>6W; l]jfSXj3hg%o4uIXZk~Bb̈'VǏ/śЋ#+B߷"oܐ!`uU+CҌWVTEeY9`3N6l6`[X {@}"s6 `GX`5G}E=B #b͏5;)M2wJ+X +"VH&_vVd0X% Vu&VvZJ|q [v~`{6l3ֿXs)%`v +ثƁ6 l<t5Z*ZQSL|[~QqfRbeb%?+^+Xb39վgO X+X%"^`/ElZ4!X<`';l6`[=;`v4Wv^`m`/WUihHØtbXb^k*CV$3_X!S|O9OHVHJ!{<^a+A{p ,)`ǁn`; z`恝6 la`ؓץTt[ͮԥz-}b͢3q2WJq(YUBߊV[/0}lEҾ^`/K&K+F,R5"P7MvXN`l e`{`;(k'xϦ_## j~BAR1vYy`%+$))GQX! *C*_ӟK\P@ڗ' {1(m^2V`}5 M`'6l'A`U4k&2Rj~V+՘$Pz@>J0̠ hN0%QUZUa%P`/Oڗ%K%*1S 5"Pa6i`; +=m.P +-E`?6 l +F l;eK*P:MDjsz x*?Nc5fUϠ ILQQUŇ|Y&O~NSYfҤ} i_a^|v$cFu6l W `{+^v`m` ;J%CǿC*KZnن}*Zz<՝7׋FTڬm9:g%PJq IBDUAD uBfB]7CQt4yi4"aجxj@ +l~`}"P +{[6 +l.`ۀmhkW!U_##ƀEkj|hjcxQߨ\uQ$?DQ0.&ZTc P7I5l8\+=<ϵv0 +6=`خi+ =FFfcZbuypGM B5B.h%B"$%id_Мv%oz7Qu\{e]xXCt7@M"P6QGNo +TFCTG 6z^{7j7x`Uc_mmܑo B5BSy Ggw@O s oz7]ggk/q]xs@J] `G v=lhUX@}@eke`*jC".`3m\usߘU+-ZMj`Tvoݘ5#>brPe Z!T) l'dybλmޕҿ- +DAQU&Zb-p"TTY0} l3^.B%j z@#Pw8$Mk'(mpor7f9rm1AFcdž"gG,I*V8tHed_М98GqnR ^'Ye.Kd 7K5 P2Nv^`m`l x#P܏o/`'vn`; jң}`P2=@cRb>qoZÛV((c<,OIfIQuۻgR%K2ǗR1)"wἛLsKK-K-1Ƿc䈥cu(m4;vlf`W`D#PO4v +ثƁ6 lɛ7LX==ش$K`HcZTsP災 M`iY>`CIIt/vI?F+ O =)'",Gp:beXAJx} {s{9ijA7rrkywlK l'A`[m4 c`{[^v`_pZnl'*馕zʹJG (AbCI1J!) 7Zj}T-rx|Ajپ4^`o`OG^^|6 U`lm$P +X>>9`3N";`u6luc_tN}SOwQߪ͡y k(ĘL b_ΙG +\Ӥ})j3(i ^ +endstream +endobj + +8 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1 +/Height 196 +/ColorSpace /DeviceRGB +/SMask 9 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 15 +>> +stream +xc`:L +endstream +endobj + +9 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1 +/Height 196 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 46 +>> +stream +xcf8 !gqYlp3ɀb,N,NBu 4e +endstream +endobj + +10 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 238 +/Height 1 +/ColorSpace /DeviceRGB +/SMask 11 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 15 +>> +stream +xc``8 +endstream +endobj + +11 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 238 +/Height 1 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 93 +>> +stream +xm; @P$Agp\YcnGlYbEϲEo&n]*lLY[a͂MH/ +endstream +endobj + +12 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ -0.000061035156 -0.000061035156 238 195.99997 ] +/XStep 238.00006 +/YStep 196.00003 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X6 6 0 R +/X8 8 0 R +/X10 10 0 R +>> +>> +/Matrix [ 1 0 0 -1.00000012 18 210 ] +/Filter /FlateDecode +/Length 114 +>> +stream +x1 +P~O1Pg]`)D4F!EH)fJkQi$T5I&zpM )=_&|/v)^v=oGVy/2 +endstream +endobj + +13 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +14 0 obj +<< +/Filter /FlateDecode +/Length 5528 +>> +stream +x]K%@1mf=8m hI]hK9i4 gBY/;M 59H)ry{[ +Q"H:"A 5i.O_]vo_~xoa`B +Ɯ4D q>ɭSbbIVH14E ZbL + +` +2Z!e)Ԉ PRƋj-a`P\eTTB2 v 9&] +rj aCl X '@!GtP*\aT(ʤ8~)ȥM +Aتa Z + +~b*CxQD`/Ƣn}]CNNm|Z *@C0bϗ$K\tǚpR@Y}\QS.㦡H ҕrAkW:(!`Wz&..CdΒ4:B*0L2i +23*xqr>C5)TUR|PZYo~ZPTKKxiA +Em- +@fK@10 +@~a)@?VAQ_宁P/5*x0j-y@Qؚ3ą&oU&" oG.2e5xIը%k7\ԚeK7|s} (Z.:g4ጼ GfD^FL5o=nb]^|DOo߼-*W|EbB + nLfd9(1^"v'(G YʜM[  IDPhVkC,(- \ZGPG;;fkqZ|֢m6=cnZۤlkAI`p[y[d-K ӾȰ/2Miq_7REN-rm4IQll.CIll.CkSIؙml.C=ǭͥxhOwm^v[Klm϶.l.Csg[m KJ$lR{em{ҲTSuH3(('TMYš{D/W1ԩf K\[j.7-bnÜ|7j9 J~[˛BJ p$lW",t +k6/h$,"B]5hN@H%eK>fh5FGB1\3m!6wht{[[м}ow˳l\Du@upفz5ZUN8~bLҢmD9ZuWZ*0rQ6˵h^Tj֚X 枝&n35X.g6!x.!BvT ^Hif,9meWd9 r9Jǀ+%'2ܲ)J%a>9?DEV|d%Cdk/ۗ_pAJ]}Mc,%ƒb,ci1"s%1>F$dO-"EE xxAUIp 4)؊U%V-psIVOo[XHj 0 bJnm(D1P"Iez${5.˒{j@ +"7JSH@Q' Xsl Hd(ɅX$ (@A9I!R"e43> +Z#F*-!F,SJ)c>@\6], l i&ZJ3&ph%/b + 9dUkQWֱ(X+ev8ʺOf! 1A3fk0bג)p q +Gn5_rf37S$MlN@X8y5z6OG&D}(/]K\ZLR:0Tr.-+qqٓ n!w٩ ˢ58c/*/>/>/>/>+~4< G5BFh^>AǗ߿/w<×t}̃x-CwC'CjqNĎnyCSͤO;CGyB{?o?ɳYdzwCCzC#yCgCCCgC'C'ޣeMވGe'ExZ.D'4 : : : : : 4ʳM,M,hMuu,hgA,hZgAtbA,N,N,& OYPʪ".C|ȂR> 7 l1Ћ+,(# xcA=jJ6d]du(-4+'5@. :Je2@fu7GɦqɄ3urEWfwthMѡ5Zrth ѡw/<{챪޵O,>dZ*xD^lhY We[`Xv^,^,^,~,ʙ$y0O#?㏄2ICFr0Hp#9$G@&@r0 +X8yx$9o$z]h ,Q}uq$G w#hQ rG&zTt8.k' Ϸq>rYskE ߼sK.D7Rƅ.Hų.-5rf܍,\w鱋Ko}YˎOX6w>X6옊VԈwRˁ;R#`Br97REG L䲓\Fr9 +@ +@ @o\&#x+e i\XOVjrF;YNO1[tdu~s;kլ)9Vc5KT,:Vvb997ǿX.,%.L-vmY }^\\[]m #T ^ ^ ^ ~]JwO>"R=)J:mQv%NPCۉi'u`9Ou&:*p"9DrډcG?G +[Gķvb9m`H:WiΚgPYSr\gMuYBu\YYk=\UӱNJt:K(RlҡGt:72mˁBIL7ڸ!W5+2šd +M毈CD' mu̧ĩw?w>k+]IpWk `v?MPiM>& +t Shu" +6s?u]_ +IQ&`] GVPNuy~E +dه@?d;FGk7r^ADR6z[V}l{rWraWqK.w0\ra 47~q{yqdnjODcߧѩMB>De 7sՔ͊%O8>ndǗ0m=T nt*Dovj>CtH(^˙c>OQ[RfkCu?q!ҍ6v$ܦZ}M}u2 s<L'fn ZNmnCzZ5ݯtn~ NH*V'*"N3/toN@nә:Ԟ}Z3q>"/#%iV7ы9v^̹ы)AH]yL΃u~--.,]q1d6K}`Zl,e\..Kۃl]^?X:Ë:Ë:Ë:Ý:RE y`?i .g7cn?)]|F?VԏHk\&5SȖB&[AWgkUo l +endstream +endobj + +15 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +16 0 obj +<< +/Type /Catalog +/Pages 15 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +17 0 obj +<< +/Length1 11904 +/Filter /FlateDecode +/Length 5579 +>> +stream +xZ|յd;lXenB]#;d FaC!Cl⏒VDRZgU2A`O-VlW-jm&xyss9s{Ϲ3πd ,J|x Xa/x|Mҕ; pnI{F,W}Kcv8 8t%r߉ 3Z2^( +`Ҳe1fC>@. 0@F状űۚ2_yCvCOH+c7Vymd?T;Zb&`8UX@%`A \\ XQk5k :%l~ +`}g}4ι80Pf Z01zEmɤne~ʳ:w?|B>Ei$DŽѸ9=fc1)=ᑏ-Gr,B+:C' +рV"y:?Ja0嘎8+ѢH(aksЊ+C[XZt$,Fڱֲ!-acc)P + W mXh*zHeoI_V__ 31p; ;VyME.$4'B;)UW؇×M/~䞓|F}'貼C;<A׫GNʀRp p8t5}>45{-ˏ4!7f.S^v8@W~*t=q +u}~%g]goۿf{P]{սe/mzԧ4,O:ۥnRUWlɞfL`J<.>ǘ;X1n6jBЖ(7pY66ټqsr3_zruolHodf|O=WIλεexVVV]hw4lMBWsum̵`~k~̕56r>qKYl%{O'zF/T=クhfPr]W]{t$x2t)gohYB#\.KlYc,lKe%i1,k,'-lh6+xMs޺>crNj -Piiz~jXqp/ѽ6lQu!FGEԖhj՛xgFFǵi3oJBӏwƽqoN;;qZwǽ8y%/޴aK^¸ޅΔx|a<xZs\-G"IJVQ7-멉VQofF\՚Q\ތ**8M#}dܪ&֢5N;R\4S͖utJ5&ZX/gŢ7En]VX[xZ{⢚VHQպ9~κ$Xe#;Ks GІ*SҜ[#gPF{z]d*feD%Jjj.OΩSsUT֣t:C5V a[a}EEn>KX Q&5IאdxyTv5{T3EY*cj"U]mlU?v(UDt]Ie=3[K*_U.PBmIUdw\h*dDS#D7-s]"֛JaUjT%ޱҒ&U)ZLDnWsûU!/I/SsTDW%5z]I5=T->|@D֔*[XnYU.NDTEpkDK;٪psenA$%q agʌ{T$'Q9U=RP_Gy!aqYS +uG +,ReH>Sץt+&EP3%WL "39{9:zř@J*ug]7?39>ШƱLn+5R(ED#Z!Oe<*!iPyZ/1,5Cnf34~@R|73Tʣ-RJZ,e*v*-.-6 [`*Ck8sq,{<Ԝu80_{tVg<.;9q`.g5v.EHў9y F3cY+x+%64-sD +zfU+|5|cL,r3<8rhێ\~തo8 ߍ x\0Y<DZ@8;~_BJn/E};-M@WUVR`4)R-&(K2dlH(@*+[huWisɘMF}k욽nu?Ѻͯ׍fnmݼήWҁ9={7[hFX@d&d178YLs$+Kߦ(dS6&EmTj5jě' +[EEYu22-O_~L fad>tAmOh{DVs XɝyeSeF&uI99͑9Ֆbg!+9³9‘FyaSsS*>=h/*J)ݢ[s D oR]'4 =]>8}s MC߳6<ߝ}QtǢČ` -+_u Qc`32kF##FIԄP0JItݢ,}r >wtO;woO{%PFY3\f4GBF0/2!gjWH&Q7[2ST32S5SL9MMC۴;\ܢ_t~ dNd6 Ǚh_ lDT* 0c# o4fQ!)4"Q1\E3Zg2ljO%oxlM7HH/ۧU*o1FV09-gv@u]&X'6 F Y +dh^Hh@)ES{)P.Rr tRMgt&|RmK*u+t)"$U@hE]jȸiV QG~D4ß@-d]3(=n߮5c\W'o4ڳ-Xb|eQyD("Ml&PDbl(~&uGQ|T3*j^%S(uWR~LaI:Gmn_]& Kl7.'c6cͣz~ꕙM;W,0j_@Gks>wٝs4{ zcuymK`CcJ[!t,0_R9823`;y$r#G +K^(b +l("vRv9iBN*uҪ :ң +&4yÈV_L }`F%=uֳMwj??$h4S +wp,ؠ,5 !dp4grfFI3g1k|YiW5ww͇3s0[ͥf%-02 FƒÎ@ QA V.lZ!ڴ;On;C!zwGo<1~J'nH}c̉o2 nS*m|g-y|(g5[2`?\@)O@ 3wP{ SGGvD/g+8Q.K\d+.6rǖ}İ ;[>qC:{M"S8x{'_yX;p1cѤLv%LB3[,&'3&aB +ҦBj/$W!% i )uh0jA< e:\Ka(:гi(Dy<$q> +endobj + +19 0 obj +<< +/Type /Font +/FontDescriptor 18 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 ] 3 18 277.83203 20 21 556.15234 36 37 666.99219 41 [ 610.83984 0 722.16797 ] 51 [ 666.99219 0 0 0 610.83984 ] 68 72 556.15234 81 83 556.15234 85 [ 333.00781 ] 87 98 277.83203 305 [ 556.15234 ] ] +/DW 500 +>> +endobj + +20 0 obj +<< +/Filter /FlateDecode +/Length 325 +>> +stream +x]j0E +-EÏ` }P7HcWPBVbMH XFj΍5? !6*<(~9ª.sDR _樧l {\vKX{wFrRTCOXڹnʢlhewڿ_*# L& @ +9/iQu]֫II %/W$_"9 )A]dFJH@: eHS,HG "+zv^}L (b1/_tZons,=A:cRVպ~&} +endstream +endobj + +xref +0 21 +0000000000 65535 f +0000000016 00000 n +0000024658 00000 n +0000024951 00000 n +0000024991 00000 n +0000025142 00000 n +0000025221 00000 n +0000025562 00000 n +0000032301 00000 n +0000032496 00000 n +0000032710 00000 n +0000032907 00000 n +0000033169 00000 n +0000033680 00000 n +0000033761 00000 n +0000039364 00000 n +0000039425 00000 n +0000039549 00000 n +0000045218 00000 n +0000045472 00000 n +0000045900 00000 n + +trailer +<< +/Size 21 +/Root 16 0 R +/Info 1 0 R +>> + +startxref +46299 +%%EOF \ No newline at end of file diff --git a/graphics/http3.pdf b/graphics/http3.pdf new file mode 100644 index 0000000..669e63d --- /dev/null +++ b/graphics/http3.pdf @@ -0,0 +1,510 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260423182953+00'00') +/ModDate (D:20260423182953Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G5 5 0 R +/G15 15 0 R +>> +/Pattern << +/P8 8 0 R +/P11 11 0 R +/P14 14 0 R +>> +/Font << +/F4 4 0 R +>> +>> +/MediaBox [ 0 0 348 261.12 ] +/Contents 16 0 R +/StructParents 0 +/Tabs /S +/Parent 17 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 21 0 R ] +/ToUnicode 22 0 R +>> +endobj + +5 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +6 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 312 +/Height 234 +/ColorSpace /DeviceRGB +/SMask 7 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 2284 +>> +stream +x[HQ߁VI sϟu^x}wg_džδw뻋?:6lϦ5L$8 m;.4L$8 m6~I_džٴaTq\7 ۳i  NvM$͔-8Ply64S@DLقŖgI3e [M6͔ulؤ.G_džM9͔ulؔL{_džM68_.cæf:6lil ^E)b˳Y( [p6> [p va4m'Qmg NGa NGa NGa N4l~y_ [p6> [pO?Ɠ?e34lf؂Ӱ->wr-8 Jl?YZ44mb%RmiWʶ4lf؂Ӱf؂Ӱf؂Ӱm_L$ 4l+1f"%iH3liH3liئWbDJҰݿʶ4l7je[p6~I3liH3lin^|]&R_ [pgWb24l|ND0 LG:qDӰr-8 +qy@ZMm%miVBZMj%Q-8 J(W+ۂӰ luDh'md&bMy%Nf"FiؔWbd&bM|%> +stream +xݡoSQw 3 30`  a030S 3prd9_hssԛ+~}\69<׿mG[w/ڼzֻzz]<ݳ6/?uvxZOn޴.:|-r[ym_ncö?`+[ۇ +lذaW`Æ [e1lVb;Fخ[!)6l6 -JlJl7[*=z6l؂-؂m#g [> +l#l[6lذ[F06lc [6vl7+aÆ-؂-fvl%`+k؆Yذa ` `cö@`+m}_ ` y6lvl%Jly\߰allƆmlVbw6ւall:ذ--Jlϰmt=a 6ll6c[؂6! ` ` mlVb=؆nT`{f6lذ[,؂vv+kذall`ll%^m6v0-؂ [<؂v -؂ [<Nقl%3؆Z06l؂-؂-VE[nlCl؎6lllS0[-Jl؆Z06l؂-؂-VE[ ab1G ` ` )~؂vv3 lclS06ll-۞؂l%q! ` ` mlVb؆md=all6ƶS`+[/` +endstream +endobj + +8 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ 0 0 312 234 ] +/XStep 312 +/YStep 234 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X6 6 0 R +>> +>> +/Matrix [ 1.00000012 0 0 -1.00000012 18 247 ] +/Length 58 +>> +stream +q +312 0 0 -234 0 234 cm +0 0 0 RG 0 0 0 rg +/G3 gs +/X6 Do +Q + +endstream +endobj + +9 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 312 +/Height 234 +/ColorSpace /DeviceRGB +/SMask 10 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 234 +>> +stream +x nH@|W +endstream +endobj + +10 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 312 +/Height 234 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 8908 +>> +stream +xsGg-Edl A# +M@`Cpx\n9lɭrV]=gqj?uͨ5?=9 (_1x[DZbo-{T.EխͨV-UwףZm-sP6n|JרVKkߢZxDލx!סF`  bR.ydzE$[f-|lK;EdȖ:m襀' S #]oǜZ6(p\z/Z/Q-MN#lq`* Z 7rQtǣZz™*Dw9C P+3-SB4VlC&DqlmT_ ۬'H ۔d3dȖ?w=`dud 8`Z3&ݦhLuimqژOq\vy>%q:mʧ~J*hMiٸ_jNsvzY#KJDqن=ٲl˖d+ϤclyO0e={)AMzR.9*Yj.H33SjLQO 8di3Ho?8qqHN߳CyʹEj js=A_#9,qM=W_G=̦0mJ8~J8m)bc[4K_6ڔPǦH lRMJ%%DWM t{E<>9;}F! !۔:{D3P/ +Ÿ:G RBiSC|`uKE-3Uiu#NS +Ƶq>qVW_GGOѥi>j9E-orTk2D򍯢Z9v{}reaT+AmE}s|7&%)p)u^d " +cOC(m) dAoȶlx |:lv}U9>:>ɤ@݃h'7oD?9+.DO2ո2ӍV; VZjߒ]"l3nw .pg]WmP)QBz?} "hVGIɶ Id; +6.[6/W9-#[R}lO>l# &5v_v앀F6 4ф k"Cgw/!ݠ'vwq$h2UY582t J`~9_jjp1F>pg ,#8%]G(#ۂ'ۊF9Oeϕl3l+l-x + lsl jsQ0t65W1gD2P¸%Nz-ʟhI]W~֓BbL:fJFnl,aEgw1z:.f!|3큳p=p\(YMjɛ6fJ>y{B__FaO8m\`BX@6%iSmv٦_+I *&%ؤ8 7ؔ `">)I |I |. YlYM"y(B}u(&qZڬ!ӷ R‰5J{ebW>iƔmԕ0SnSE$nC l\S`bҪ]4Q-s@ +`ʚ +OznC ofc]y[MֱpKLYN{7P)P;(6>b=(rAqFslrlm9`٦-x$`d3WNy'4,Kf5߆l-XGvM6zPt+pWgG>``:K8v8,>L1F+ +6g>Ҥ7sYh 7\}Q-m_SB_)!!6-ٶ(ȕ *DqP @ +I&"[ٖ#\Dal,0UΫ:{WFj݃8Nm\`8 p\z/e.VbKq}2W{RUE&}9!ӾɌZNK72 +npG8%0J[d!1"ۼ'[dk"[Ɠ,lבmғgz]ddD#YPnf4aPlY0EfC4LbL 8.y7jsNufisVq/SZD;(v6 ʜ|8Iz>pԕ熂A]h&%^Rt;tʓlL:v}&d;>'tܓtZU;UaZp6WfO:mN+/;iM@EIyr:/Pqk-ڝ/2$R<D֕gbSab]y-6%ppqiR6Ei$4ƕ˱)A7 NW=dҠpr2oa/B1oB6K:i9_ +rud:_ٺK%msjpB7w4shqNkLR=u$2!3f;2fjKQx!TӜ914H/S>d 0זp.`FW8N }v Id  l/8 ۼ\](Ȗ|AlY#Yd-x(`d35dȖ+w^zOzC~sù;8nm5.EeAWmvn^[,W/@ k/=&q^ض+.0qY`hi̼_3X1s^F ɽ} " *El 2A6.[6'W9-#[R}lͷ=\GIl' +V#ۼ•h9թ4ag)"jtHLwO>v{t[7X! +Z풞[5D$%?A]\U zAٱ_q>cpf 3FHR( ۸'[ޓlYOs+@)Og\-vsDYO6 LJ8 eMka$F,^Ƭ"sjf@E3'+tS6dȀ_Gw}>'|&|Ri8wL ܳ҃+Oԕ&zI 6)!迓lRBt*%XMI]WT\tuOϤ#lA p^qV wB.{]q(΀3)͸΀v#Ig #7(8sm|.ܩ}2M pl3e]yi+3b+/`L ϯ +6xEu#'1+t+/ėWӭk 8=L)?>Aqن_Aq{rڐmنted{E?CȖxEJXG^D6 lxm#lXK~~\ n6`?֝8dmQWL?$w>^pmF0UzGYͷl%df lf-/V1r=v/'vǩ%qހ5ٸ^-陿Lؤ4+3ʄM  S7[=\8 pTSBKl+P$=َ{-{ (== f &<<,#qOeϕiߕ.4Yh.:N(vBmi3Dk"ެKEi噥6'eiųųygY ~mʦ8p[`lJ~M 9;) ޕ*֕JᤄtL}3}d҉>2i“YmQt6J6O8#8B+N?8.cXkF&IO:mF4>lgjx>Hq lKFvغ\6ME)lXE D+dAl(F_>GY?fo![َ0Z#fI G ʟO0?w>Djj1.<6d{>'77Pq[&=ɟȐ{ E%BGvs"[ZȶDcK(kGd[G<,ٮ"F6 l 0xN7*>cARm`ot2GsMFu\,wpiSHh&uꋮ39`v.z5psW8%$[+?VnOsRl'=Vddl3lg;PUS +*;Pu٨ r`ZuLwd`I8.7Oy S'l'?S:I隷i6Miy <|ҼM:ϴss?wRܦG=6)!NJp+ضyF-fȤwIuW@OƸqwBW{b}J"Wˆ+ N ^ag.*]"&1.ª}hF}ȍîN`mlcu并ll봥.A+]BuID!bj]y&`VX#{J7z`.l'%ă^R +Poq\B%-Eqَmaבmm [B_E6)` -d\eܮ[Oݨ}ʧF<}.6ѿ_e1nrI8,>ez0(/߻Ck{H7^X_4`Y_SB/)!{m:ero"C e(5v #2%Cϐ-#W -"oFIl' +V 0-d7q+7k᫃+PWr4S?fZp^ۜU (MpNkzIEQQ,W\eu<&c=I8Wѿ[+j'=\y{/EqJ+%$l2B^#*)ͷE<C/Řdk",Om ,0Y`d+<,0).fI v/H}ҷKXF&WfN-uxoMǫA`C5= ~Ii1%VTmP= +Oɕ#;N ==W(&$=(sQlK6"lS;d+zlر`,0Ywe|p' +4ua& +&ݦQ3#N`X7Ħ@E +GBk\iS&h@%ЛҒq>-3S:%Ep`uTzwI %%D#SBT:%H]''t̓-v+d;>NzRqB5,8ZVvfxJaY͍5f ՊE;m>p@EuBA=;|RvwL+swtv4N!<;pu?:Nb%6%pڔ;lljNjwFlJ ؔ'=!ٔ `7%lS'\}XWˤ:g ksxBݼF&þN]+/lc5H UM F q,0g |FFqul E-3Uvjfihn1F3ьC6G6f*`3v=d)INW{w9mJ%-Xä́uF:ܣ}y̛* !"?qJmJ CO +RZtdr?lc?pF9#2#OI 7mق!",0)a ^jMxe@~h,mY~pb3?oY227J,WvY'Ef(TNzyU*:볼%W~[SB/?FE(F4\C1Md; ű_mqv yϑmYd 2r l>Wfd3?X= DDnByoq$݅+FeƻdK"̐oU断ŭTEp,SӃ 0sky{/yk)`\:)vςYbL݆bΓmso ی'ۢ5Ӓv\y l-ȶlXK;=O.y_l4OTsyrS3]`MwerqKN ziӦ$OM|6]svb}j.|iRS"+;(f=ٖppgOYO 3'ۙ9o:!<[aW_$Ć\MquHyNI'CP>\BWr`w Fs +6mقGfI W# l 0)}^{sn_z,tpVnqgJŇ_ c)\=r0tPb+\5̚KXxdI|Y:w_SB_)!!ٮC1-d+~lP$](6 +cMopE)-![BY`R– kdf#ن^c^]oTsw>: ~{ 6|`%K9.{Icd:~e6䯯}$զɌZ^k\׹+.yw\1 +endstream +endobj + +11 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ 0 0 312 234 ] +/XStep 312 +/YStep 234 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X9 9 0 R +>> +>> +/Matrix [ 1.00000012 0 0 -1.00000012 18 247 ] +/Length 58 +>> +stream +q +312 0 0 -234 0 234 cm +0 0 0 RG 0 0 0 rg +/G3 gs +/X9 Do +Q + +endstream +endobj + +12 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 312 +/Height 234 +/ColorSpace /DeviceRGB +/SMask 13 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 2284 +>> +stream +x[HQ߁VI sϟu^x}wg_džδw뻋?:6lϦ5L$8 m;.4L$8 m6~I_džٴaTq\7 ۳i  NvM$͔-8Ply64S@DLقŖgI3e [M6͔ulؤ.G_džM9͔ulؔL{_džM68_.cæf:6lil ^E)b˳Y( [p6> [p va4m'Qmg NGa NGa NGa N4l~y_ [p6> [pO?Ɠ?e34lf؂Ӱ->wr-8 Jl?YZ44mb%RmiWʶ4lf؂Ӱf؂Ӱf؂Ӱm_L$ 4l+1f"%iH3liH3liئWbDJҰݿʶ4l7je[p6~I3liH3lin^|]&R_ [pgWb24l|ND0 LG:qDӰr-8 +qy@ZMm%miVBZMj%Q-8 J(W+ۂӰ luDh'md&bMy%Nf"FiؔWbd&bM|%> +stream +xݡoSQw 3 30`  a030S 3prd9_hssԛ+~}\69<׿mG[w/ڼzֻzz]<ݳ6/?uvxZOn޴.:|-r[ym_ncö?`+[ۇ +lذaW`Æ [e1lVb;Fخ[!)6l6 -JlJl7[*=z6l؂-؂m#g [> +l#l[6lذ[F06lc [6vl7+aÆ-؂-fvl%`+k؆Yذa ` `cö@`+m}_ ` y6lvl%Jly\߰allƆmlVbw6ւall:ذ--Jlϰmt=a 6ll6c[؂6! ` ` mlVb=؆nT`{f6lذ[,؂vv+kذall`ll%^m6v0-؂ [<؂v -؂ [<Nقl%3؆Z06l؂-؂-VE[nlCl؎6lllS0[-Jl؆Z06l؂-؂-VE[ ab1G ` ` )~؂vv3 lclS06ll-۞؂l%q! ` ` mlVb؆md=all6ƶS`+[/` +endstream +endobj + +14 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ 0 0 312 234 ] +/XStep 312 +/YStep 234 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X12 12 0 R +>> +>> +/Matrix [ 1.00000012 0 0 -1.00000012 18 247 ] +/Length 59 +>> +stream +q +312 0 0 -234 0 234 cm +0 0 0 RG 0 0 0 rg +/G3 gs +/X12 Do +Q + +endstream +endobj + +15 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +16 0 obj +<< +/Filter /FlateDecode +/Length 11053 +>> +stream +x}[${z^iA`3bf$`E12x,RðK*`\++~uetQ|}~j|Q,үʋbOW+V^?^Ukq4~)_11&i^eOMzO^?~"fE?^skbW!z Md걚,2Sy}J3HefN/_,ϞEU +qx&jYRJ"Wݛ/*QzЊ竓Jjґ^j}qW)ZVKE=fVIdʍDVZk}+]*LbRۯXzvoxxa/SU*DZ$\8$ ur`"2bPY#t"3,U{*{n\ej, ,]-dm=-]]5'|%O_ܟL5N5`{0p85Յ` k7Yh +k")}wšs3EX2図tW1*DY\bŎ"7y( 3C"4Lf vƻxjuCsu%Hom +2*d5[n]ix*[fwgY%`9ေ5euSӫgbYBhFˬ|%2A2qW(+6~)( ߼*ы%W^|5 ]#W2xބ+4!V& +Ac hth6hoD+'hQq+ h9;ND `F`Nw׶ h"9[sH`Ζzw~& +U0g49jt&ќs]&dy o.vM˜c vwaqvwaqvwaqhN&])bouB%K-e(?\VJo֠B3M.9 Y^(ɺy8vأ9CJ&Y_{-\RT cx9gRC5 =ٴX<`s\SCh//˝t{ _B~WC Z7~9ҡ ҡA7~9B +R;Z{~(P'gLSGbALsW؀dHT +eZVPn4_+91K=̌:ll31r>]ӸW'hӘhLDZ0&Fsuq ؐDP]1g՘lBA!bp=G+؁5AݻHo_4{ۅmW%vNS^ø9mvom:z+vMto;.^a%c>KhDzX. JzVc$*},[Nl>Kh XtXα>rIUm}, /L*S:{ R?_"| #!P(HPAL?wE0@ +B+(bykZ[L\KZJ]pK]jWI9銣T"Sc]KzOjj="UcC kN>z9Y5䱞Zgהǽ_%P1@8 A%RIS̔Z+ U&Ȋ)n_]\Kmb).l|~z$q%#O[[ҡ l L)ukI]CZj,!t+N4p,LXCU 6WKOlM%KLCc>un^Fo>@È^e2Z +;9QͺDDLn&_u~lstXxvQ-!"#:B(e] 5jџ{uzNct\ +BJU}?HWϱ˞b +{ZS?_}"UA +ˍ_{PbB(-C)s2(ۼ/2!%K +Jcj֨(-4 sCYiW)?g˿pVW{E:ҏ*]VzxQ"qPxZ)&͉Z YsYeܛjraQhYB+r[e]5 & *Ͳ2ۃ:^mrrRιʺ$Hj֮MVEX6@e5}拊8$}HdYГt |ΓlN]rmgLJ79eg3(4Ry@ynΐjkov^#8{W^tV"Z>dC;~l-V]s5L:\O9ET 0a`+:n +f(q\Q\mH UK5]ZJBoWKp Z"$:R ݒ\1kr|[8[=fܭO0SóҼ[2s\{-ۍ\He9]} ҵ$vY[%Jp]ꘇԻK[a5v7]]]]wf ,Ю\/U Zu _1 "kf& +B ar[3 Ddw$,;a:qN¤%_H@"";Q HDDȴ;lC"ǁD{=Hwr? +`-[u !Osou*DO@-s$^!UFmؚ{߰oY"Q +#jaOxSŹRzQ!}`U#l`ш]hDw4"2 KV :6i GZ=N8";is W͝mG#" Et.lӁU|N➃ =aXb҉Uܹd 6K`z +ê:ni [ÿrb/s@NQNQfՕ/6v:Du"ۉz?z?D6X"NT'+g$1LuQ:qnΞ'0n \ z?z`7U0aF[BPFRB0~*cАk'v'r;)넜JhBӁ'nӑ7,4^OuXq`z +ZSjst(A].q)4”XIهl|!(.k3'VQfGW_WIbGO;iTxةQYEON?o,vE-]n.V.|E?BK-;4"Hp u1h]C:֢S۽pq.6GÈq8 Ej"à]\uBf `ibؘ0u`˖eCfJ~ttW|@YRYPv \y1#JZ<0'~;Zlmo@ W\wPZVrl\}bi:͝] ;iir.x[M"%b]@b o4QP0ٺ&J&j&**.vMMp&r&:9;*tXMe7!vބ^̻k4lHX]@ )vS]@)vK]@ )v. Fsv4gGn iżC]@dp~06srs28]]s6srs28]]s\6srs28]]s\ws2 C2)^)4w(z?(, +]w<6EnqZsZf^vJqdKV +pg'EYb56hK2I}5[:(Aku@K<(Y»MZAyGwϲ|m2R; +`{n!b҄ uD'TyVΊnwZe%Xw +QkOuQ#c^ex;T7#}D+WJʹN7'c;Aז2~r⁂I +"Pӡ ;"(@AlwEP>CA8#ݥjt--N"PЎAvn|yc壱2J|O-LRhVwo-\啂k7*7ӥ|!g)dYe(?[(D'G'UiD7<>*P' + U[wBs.!-. +~$@B=ŠiǷ(DeE:|TvP'LN+8S.xIc)3g~>BЇBtrdAC/" P\!.(4s+ ?Sic+7}_2vxBzᠶG7Y~lFc<~Nl9k&=6,D?*-̬~l_R~Txe׈pvD?5&1ɦL{Nu4?3;{ +gL F:il.S'x1d0h;m zƤ.0hG锭/^gxgD?3~X`\ +7XϞ;@1I8$nRL+YNzLovzxa^#dpU=,/'/'2!O: +!d8(O{c7xc7xc7xcO x,rm,_;OdS.`ôӕ 'ѝ' Up$Y9Z;i_vstOAGv֙靠Ùl0&͎nэ qƝ89&gT|?{qj LQ!L8&m' ͮ4 +]@x]l00؂7`v0MtC j;izN!,o]=5|rmBe l@~Ƞ:;D8h2$=GaU}8NœF@uI|f@$@Q8OIz(r @p8%@ C(\@ȭ/%9B.Ġu7s." #@$@"#$G2H'2H>)yg$5/#@$2%i>{

P ,C6E$C +D + S@$ +L@%E_C`pB = $@+; ZL[BZyD0O03Z--BtαIPF,JYx8tTґTV!.^X`/P! %> "W_U2mЎ*CxglVv +a;e\A;c;a;uA + WN7;Վvh`cWN~DsKhg;c:vh'o=Hv +ڹUs[J9vhm=ht\A;ٹov[WhgƨWN鸂v5ܢi3'3cԌ+sZNf\[r5ܢμٙvO;_%@h%;4n\;ggcϷ52YZh l +oAEqTbɈG oT;o1Z|g.1|'q哤Yv IR(+'q@K; OGY; PZ$.~<$.@". w64z 8zuV &gjͽƔA y8qcsނl<\ Ƭ끹@9w!he/h卲]M悸H- tg.ޓ]un 9~ wM,dD CAwEPn>t.~ Dp:H8Kn] +Q* D< +6. AT)(gwa{[])H @"PADxv7VKOL s]:F<P *@ "P d0:T9vqwd0mPZ,Z,Z@e%SK<`J P?џMe%C)ش[ VyV.9.hɹ l-V SDz 3J^q,5!"_l:yi9d]lQQ Z?ȯ_@J%}ȩFNV Z$E_ 0/ku%l=q}&>>'?>>:mZZ:r${_|_@J[e?$eΑRCGӏ 4D#i#e$P);AIYwRT˛3[[QrT JYlopopopXRr[,Ay<f$1_ll6ƑwEɢ/gwԢlљŷ;r1Fe{5;7"Wb8wc7 c>w_Oyc>Y_4\]c=/AXr2~W5bPB9[~3P%wA=]嵫L/rAKa yMRVhRJ2}5ۗXfWn]j4f}{hѨm/Fu/ͺ7nnytS-Kp/j[ƧN ֗1gx] {&Ť叅Mt ]2 _p +q.w,-'Q:Qkqx鑅U6=X=D o o o o-M|lK`U<vCOǙgvæAs}$a҃|>1x0acivCOxAI 3ޡ'CO+މw)+ޡgCOx=z;waa{s΅5wBivNO{C+hܡL ;Y1 3l4T}ZPP3BNZ=ٷY ?W6b}<jߜC;q{h1BNj=ϢcڷgY$O[/vr}< &u=bx#n;# !5^x|`q>"/xS'YPg&Q6Vho/< +ixo:^Jm\} ,=EQJ+znR{Dw{ϱvvnkzƋဍIEݡz73nݱ?>wueVA|/wd sb84MZj&4mU74rc0Vݩ5s|wUh%ac(sJ3?c(Z݇xU8^Fx0,Q^4t/#,2*< +m2^nW㑭^V:iE <IlBe ׯ˙L~֗W$FzAl[B:iFm arAn1Tu':q:@] |NNU'W8hqyr=:9GFu\ *oSj(~a7 `Og̏W-g?7B{(m;KB=;zjk7}BHm'og>˫Rõ)U,۠>>n~?\P7B7W//wlʈ9KƋCە.GbMW'=8P#hyy*;Swݸ )h1V4yZ?j16s/}؁N&Ut+v7V.a’hU-`gÕWWW"DWw|q꺥/G_C&>^T˥);Kdӳ=Bʗ +Y+/Ś9Z YCnW:2yri/墬 PC[e3_}=<Ɨ?o? y +endstream +endobj + +17 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +18 0 obj +<< +/Type /Catalog +/Pages 17 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +19 0 obj +<< +/Length1 12920 +/Filter /FlateDecode +/Length 6271 +>> +stream +x:}|TՕ޼yI&oL&dB KH2C@dIf FaB΀If HB&Z+ h.U*Uy`kvm]uv[E]03$|Ժmq.s=sϹ@& %;7G; ?co3t%_ѹ滣 +| {he4 v$W^"UBF{[56mQ6CV)7w]n#@Zv0 +f`*oiȠ~&zs[w]#֝;:ǞzjD(@0.EpJ +tH<@vn|>T:3ݨa!;ny}-|g4ꔗ|g5ٟ%A`o0^t$ԛX I7D@:eW5T"v0?ף"GOi"*YIO@0SEg xP AXQhH$RepE7CtkxXXYGk14lO +T@&ܘjS0fy< A~m-6U ڠ @Da `"x`:t( ˡ @#B1_(K`%! +] o Jm +"Qa9t@'.A6BWCtJX m B5t@t9A4< kv@yts bgC| qRϡ:~_$ ^@ꇻ pG|#/;?w#l-:a< m^ܔ|(|_q p wOA֐Q} +{a..fX mqo{%~ *l +2ǀ )̠ O(o>o|,[KH%dk o-U_1vȢ_b(xlw`<{፫\+禞U@8*T N^ 8 d{VCôgQ<:? Lu&pt@v9ES Nzj)&_8yo=5J)ޙр Ɠ5~_W^ +O4@߮J8oR^;oϏT:_: wSÉ%1l}8sxYy`gP}g>EF:)y$w|Y'HO}"kgp'vlǣq{`m9N~s[϶ۘHعw+܊#[o% k>@¹gnP`cMsMܙ\R* -B 2%%2cidj=Tj +3JZj5u'ŜO(D/PSoq^@tʝWʝx"p*@z5 +7=|#AhD@-|O| 'Ou.FqphQ, u*\bnj~jWqM[@դ:R#ujkCHUFoCH5Oʆp;}&-˱B''iz ;&} X7buǰ9 c1AFbrJnYn 7Ǻ*bX,X,ެ/(W• +EKʭ"zr苊?UNBʯ߰pm`؍FGFץ̹T.wK¡E _wm5jkR|s3b3JKM=Erڳ3iJO㌬)P$[Q/EkD/"@D Z%EU1"QUJTTW\ĩ$9 N4PDI%!ITHaQXo_Bc.Wq[Y+HMqUKmiE0^-U:U©sQoC&MJV5X8\pq<5SIPT *Wifqhda3,RkJEE`^UiR:_؋mjTWeMj =uTʸ͒8>>y!&@kZŅ! $10'zIYGD!É6;}ai TkҐJ=Rnr$,K 92ljlLzuCLIc)DC09f Cz!Nq$9zC%ia9ՍKB3URvV-P DZAJ*q\P4w!CMڪtJ4/7hxVR1kxJ*j4̪cRahAw o/1>.:+[0f̏<|? ۹\e FI{F GA?$}c鯵\Kå\@vdXzwbFψ.g d%64e0; vx>īY!xer˶ W_뾅+YMJ:0W!7&x1?bI-,B>@]We,OVUegJ esɶee"˶G._{4nۛr疃yg޻ +Oʑ<0?qekTGmrd9`v[0 `N[:^@3#NbaWq%-MO<51 M.lgfB˽zX[ҹO ߿s+m{tӆ|-㙬?>[M? g׵vOzpv g2}*3M20FhR!32 ZG,8hK-Xb&֮(S^RQQV\^YK?v#?$̱\n!?ZtҿoX/7&?dPtpЙ#M9tk5%lb%VZhfVa,-a-ah-AKS/XR--(dZ3:cjO'xǟk[(^G0/nޛL_|]&e3]UZ'N2 Je6r\s9hrrVh [i01h457јah gXE6M̹A0WhiRna#e09Su}o_yWc{8gަ?~罇xT뵯~`ژ> +EJϤY6CfK@1|K6¤'6$"Ie7-L۾~+pHopΏ&oKL_|G4P?Liq2 `$*-0"òf)"k6/<ᛲR\6 .,r5vJi`DҡKa)6&,'S[cE#rz&1j½&5a #& P42i<)[VfY|gvdt*3S҃a Sa^z׃x0R9axEǓ\X>c$˓m+l%eex%Ė}ukҿ77jn]j0/YK=-YOnk|w(>=XvWu޹%7iRZ{N WU0@9 r!6b|v0̛9*沏;pā{8^v:0Kbo֟^+rk2(.G0nْ;ٳwݰÀx`a`;M1 (+qi4M2&hU)ayScb*LJڈ״4b:nbNL> &Ԥ&%ȦF6| +lnZKnnZ%XۚG& i7UpCΏ=̱ϣ/: aޭ$\K9/wf6 [u2K)#/G22~G2!cstj7~$k:yNq dtxVS m2&:-d|g\t78C'2Viߕq>[]7nZ 1ݮ$ա =.#G,RұTAFrn:'[<.^q`M^[˶KS&HŒ˼$ǫSS3vA>$fo_}|j֞=t`qߦB5<9ST dM7G6VQؖS!J /-ϑoɆl&64Ǒ|T^'q4'{3'ե{ٹC%SJMe|<}ӭ3>ggб 8qDχ4ȆZH136`kA;ڱӎ;Xj= n5f"i[cwzҙO>?ozx=]({?qmgD_90+FB@ۈ͑LIZB,BtbG qQ3rdxi.}M|;L{{Gat +kkSww⒣;zdl~z>XAR #4~ NڑcKF}FZ\1=Vjn{ophe4),+SLYYݓ(R(ۖ0OP>jCR(#%M2Z {C^O6{^ꐜ[[￿ugU̿vk-ϟu*"( +endstream +endobj + +20 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 19 0 R +>> +endobj + +21 0 obj +<< +/Type /Font +/FontDescriptor 20 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 ] 3 18 277.83203 20 22 556.15234 36 37 666.99219 38 39 722.16797 41 [ 610.83984 0 722.16797 ] 51 [ 666.99219 0 0 0 610.83984 ] 68 72 556.15234 80 [ 833.00781 ] 81 83 556.15234 85 [ 333.00781 0 277.83203 ] 88 305 556.15234 ] +/DW 500 +>> +endobj + +22 0 obj +<< +/Filter /FlateDecode +/Length 322 +>> +stream +x]n0ໟyaI*!Cb,xJ=){wjA2ߜzQ"$]M%jx3̤((e0Ż><v6#}T펰f7L`<,iaKg_ (e_Z2Z`5Nu]%{/렾:'%-8 UGǨ4GPǨ2K4*Mr:23eQ$$reL߿P"w8(1HX5?cm3\>Yh{N_"v*\?E - +endstream +endobj + +xref +0 23 +0000000000 65535 f +0000000016 00000 n +0000042206 00000 n +0000042512 00000 n +0000042552 00000 n +0000042703 00000 n +0000042782 00000 n +0000045250 00000 n +0000046273 00000 n +0000046646 00000 n +0000047064 00000 n +0000056145 00000 n +0000056519 00000 n +0000058989 00000 n +0000060013 00000 n +0000060390 00000 n +0000060471 00000 n +0000071600 00000 n +0000071661 00000 n +0000071785 00000 n +0000078146 00000 n +0000078400 00000 n +0000078856 00000 n + +trailer +<< +/Size 23 +/Root 18 0 R +/Info 1 0 R +>> + +startxref +79252 +%%EOF \ No newline at end of file diff --git a/graphics/http_tcp_blocking.pdf b/graphics/http_tcp_blocking.pdf new file mode 100644 index 0000000..5214cc1 --- /dev/null +++ b/graphics/http_tcp_blocking.pdf @@ -0,0 +1,452 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260423051625+00'00') +/ModDate (D:20260423051625Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G9 9 0 R +/G15 15 0 R +/G16 16 0 R +/G18 18 0 R +>> +/Pattern << +/P8 8 0 R +/P14 14 0 R +>> +/Font << +/F17 17 0 R +>> +>> +/MediaBox [ 0 0 174 108.959999 ] +/Contents 19 0 R +/StructParents 0 +/Tabs /S +/Parent 20 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 88 +/ColorSpace /DeviceRGB +/SMask 5 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 433 +>> +stream +xA0Qd /wE*o`.~s!*~:ů0}q>Kid8Kid,_Gߐ,Ki4}ȦY"h7d,KKf8#fՋߐid,M:>i*l#Ȧ(>iƉi6|4Ki6|4k)i*o(i4d,KL3Nid,KL3r~4X2 iӳo4X2 L%`f!i74!`4|2 `4X2 L'Oۿu~KRs&8i"d,KW2 L%`ijYML! !`4X2 5m(i*J]BO [g +endstream +endobj + +5 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 88 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 543 +>> +stream +xKA7( "!JīD+J|IҒDy:#I€FXp4̠9@ Y#-A"vI9h%fвx|Q fH ;4$FXxA9@ =-ο@$^dE Q b-q'# +  A_1h6b' +ޕ< +endstream +endobj + +6 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 1 +/ColorSpace /DeviceRGB +/SMask 7 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 29 +>> +stream +xc`` +yRh_*E02 +endstream +endobj + +7 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 1 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 77 +>> +stream +xc`Ub4M-`02 /W(ʰ 2L# vC=P0$e e;U s +endstream +endobj + +8 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ 0 0 138 88.000031 ] +/XStep 138 +/YStep 88.000031 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X4 4 0 R +/X6 6 0 R +>> +>> +/Matrix [ 1.00000012 0 0 -0.99999988 18 98 ] +/Filter /FlateDecode +/Length 81 +>> +stream +x+24P0P0PеzƆ +ɹ\` w(KX!K?D%+$o4mm +endstream +endobj + +9 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +10 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 88 +/ColorSpace /DeviceRGB +/SMask 11 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 3850 +>> +stream +xMs8\e@7(Ez֖@g&sM[ ItC"BɲJ2#xNOm2?5nQ9[@7Z7t8@^z_t7x55lZ{ݿ:Nk7[@׵;=Ի .-5oU:^7z\V/K3Z/-һꥪ^Cxz0*W)*WpKI9IWg$M_4:}iCWIW/Xm+ٙ: ko:i,;uF,wN4KIvSg,;JөC+VXi?失4Ѣ4V4ZKӀZeSi J(EQJVIVS;X2=xXV4j蹵cі$j/XFW&V +,NDih5N;pZ 4ZgQ4FhيҴ+o,H_zt9[ZfZH4=ҜCeX:ߗ;ť($ͺ|)1܁UCcj^u W*M> r4x(ҀҜNHXcXF5OCSX3Nry48-4߾ghA֟FY rzAfn䴧3ߑ:h5/sr> rv&ENR䬉 s +rbWeS73#'lȉc[UbXipCiXF!$@.ָX##}37r6܌Zl9 Kqc"g_.r69=ü97BN%I?0p* 94'"gIi3ȩKj5SQ89Y|>j9wӐ{4C"rvO4K +{\l4Ś@N6 i9ADN!e3$OwiNDNȤSy4f3 pL@A`t 99Xc1d$ͺF_Kj+"Ā41&,\a3uel"X䤤9X`!'6Z+# '#vWt+pMeZXmDBN "'^B25& rn7"rFV#"' n5WEN'Jg:iTex 9eiFN5"r;=H1YbMLYiTɇJANZ_蹑94@C/oH_(*jT[/yYşЗ<;͋eN9$*? rB+(l4+ȩ酡FxJC)9z#gz"!gkⶒU/B +k 3pHbՂ4ЌEp&"kI]9ߢv"r6Ѳ i0F.%11  +k-NYWљ'ȩCesV195:,rREwklx;kb4ri@9Z#n')j2"'g5!TJ 5G\I5#v* 8Y 7JeXio\] gX4SN9KS(v:RM!r>UCZ-  +5ِ$rNW=>T\qpM?ָ4sS Ҝ-vZ 6N,ruXljKS9[Q6i~ơ]9}͑eȩDteLG΁Ck%Is;yb"<ة,)08ّSp)X#",9șJk/u:E35A)M9se%Mr"gj5;k&N$k.N 9NZ\WФN4 62{0BW;0v|V"GNY+#)\jM O{9sNrN䬩\4r +"i\V2P)آXC$/|X3th}k\~Cv{2ۛXs +9[izaw OD<~(`wL4Ƈ$-ۛSis$ #v^-&4Fڨ1a\$Dj2isf= of z,b' bN95Q?~M8r}Nӑs$rϼ3 34Xvk9lAdpQ ncc 5X99q^?`Kן&p|E Ռ!XIs+#k(l̻pz&Q2 8tIs2"O0t\?"sth ΁40 +hȩΜ"xn=iBI/*|ub`cMTuh6ZŚТ:RI3%<z]ώE}$̨i:p ͮ)=J,L Jt/0 +endstream +endobj + +11 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 88 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 543 +>> +stream +xKA7( "!JīD+J|IҒDy:#I€FXp4̠9@ Y#-A"vI9h%fвx|Q fH ;4$FXxA9@ =-ο@$^dE Q b-q'# +  A_1h6b' +ޕ< +endstream +endobj + +12 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 1 +/ColorSpace /DeviceRGB +/SMask 13 0 R +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 155 +>> +stream +xeK P;$HOPd ^ЮDN' /֘fatS7swz N)ةD)QQ?Yh2Y\ h_Vk[Ȇ0 3癗is,.n#Q +endstream +endobj + +13 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 138 +/Height 1 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Filter /FlateDecode +/Length 77 +>> +stream +xc`Ub4M-`02 /W(ʰ 2L# vC=P0$e e;U s +endstream +endobj + +14 0 obj +<< +/Type /Pattern +/PatternType 1 +/PaintType 1 +/TilingType 1 +/BBox [ 0 0 138 88.000031 ] +/XStep 138 +/YStep 88.000031 +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +>> +/XObject << +/X10 10 0 R +/X12 12 0 R +>> +>> +/Matrix [ 1.00000012 0 0 -0.99999988 18 98 ] +/Filter /FlateDecode +/Length 82 +>> +stream +x+24P0P0PеzƆ +ɹ\` w(KX!K?@%+$'`8x +endstream +endobj + +15 0 obj +<< +/ca 0.502 +/BM /Normal +>> +endobj + +16 0 obj +<< +/ca 0.5 +/BM /Normal +>> +endobj + +17 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 24 0 R ] +/ToUnicode 25 0 R +>> +endobj + +18 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +19 0 obj +<< +/Filter /FlateDecode +/Length 1608 +>> +stream +xM7+|Doٮ*%C[J9G6#h%^)>q_D +Lv/.fk.XWkDmmUë_һRZ)VGZ]^dmڨ{쯏_=KO.g|晥˓?^[nnkS2dr녶^ܦcM*bff=kⴈ#ĘhsZ#2 ĘFN(fZk 5ik YhZkf1;Zku;Nnm; ݁@hNgֳ[A3n1LsNL +d_p t'{u"drzN+ +ݩt'9I9ed@ҙn@cvk3tqkN+ +tVZS!U` +sk5Xc`*d5S!5  +I`MT`M5k LaVZk L Zf`T`͂5kBkuT`kݭec qC<&֘;e]qu|N +P1X ;D2n^:80 +xJX T,,̡H! + 4 1 3P(QAZȡJ( QKX@PD!(Q"DDF Co#it#]6m>m:r:o[Lj6ٝm>m>r3;oHk +LaV5S!5 1,`M5k BkUVT`k0VT`ke0eT`-kL (X#6I`-wzG@cvkG;G#g1#vXqCqL1^/ v>>0M/>/MiM\UD{Z涏 +e*Xj/n5 ]_lN>_/ eC,wušf7Of'FD!~ -N8-ĘhsZ#2 ĘFN(fZk 5iն-yrۙ6kvs1 @71ӕfr!LV;hEZk֔wY{Ƭ+`,]g5Jxoz䓠Igcf{,81`8똃ik t=~3ޚaCYM& A&Hh dh8 Uņ +2C\UhB檆檂  +jVZS!m=afEM8Nۏv W[`[b/nptU<0Ys-=պ~-7rIw<du\iOwoDU2]} ׮>wj3yLj9\^^m=ͷS +س39aH +_7{MZ;kv2(Qme5VpwzLD"~J$H`ϗ` +endstream +endobj + +20 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +21 0 obj +<< +/Type /Catalog +/Pages 20 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +22 0 obj +<< +/Length1 6824 +/Filter /FlateDecode +/Length 4369 +>> +stream +xV xT~d2?2uRLHj0%$3$Fd $0-6E +PJֶOX˺h ukKlIvtϝ{sw";c6@Yqss=fŭUtЍ+oR``<2_lO\ƖG@ޞhw661"DcU/V-Zӷ"Zys 7GϿC=3B=Hb;@߿E)uxJC{vjb8XQ{|~`\uY?vպNjMGcZm<٥K[!D?@n&6&B: 2:'l%q!틀 ,eT"B찂C ܄TJ_9uh`kSԛ^UxW+W/6fzw]i8:0Ww!{ U]xs<>I 10tՈ%Zg )lbF琋 Hi~^캄—\t%pEWO AïPKw ;A$Zfrws^Wq2<5e|︘}7,oFXulǂ׻gR3vx5H~'x |ǯeNs8^F]RgRe$>FԈ":Xs`w{x}ibOi2YV16ʎ3lo^nדInOreOwt|O"-% K\Ks]yXS__ͯ֔ʩVϬj ʮ`kQҵ7H'A.ŠY:A RclKgb9iIY5q j I:m1ښe)!iFu 3 1t,Y&z͛Q;UXdzu)N.Dm86ū  x69]#o >6wļ Ĩ3yc1K^ļSΘ@:D,(e9:rGB#\3L"/GѲ6;UU6<͝gsێ +=?*(V/~qYsDA pkQ56nm+=~`L@ts'ß}pf TByA~DM]!eDKIq]5KT.E'%:&hDi"{픨_T\NtF!%:.V:"QN׽lCqU"Y"D)$:,. S5:kعlJMt~]8Ovcn9iP.?,":NءU5xج4I%e 6`qk̜6tSfbNbYm!bwGI3 0[f5C3KFY"B(@jjjjsٺu뽝֭[_a'6淑_"rdă µZm,L˚,Pl Z͖,/bb>i]ԯ2%\~־䨹m2P`Sl>Y_wm?`C anu޾G&6}NU5/>2QץN ӅkB4>~ܖ緄]i8A:Sfr6B|awϼOξ=~dH|dʓ~~׿:qhpcq{[kK\tUcâ`JfXPuW-/SeLˑoZrYh#dF=-UJ'09*` %JC)Q&GdVer"8ԨnT,*WZ h"В֐"JXfgt]J^ ݥ>YJV୽@GYuJ]OVYuJ]vl?Lp 9ZX{n +;p*::%31R^Mo4q#ޜn;zCp/2Vr=̧W6BHbǪȉ(9}) h*ܚ8J0H9$#rE*᜜D "3EGRnraf҂pуmM,uiqe}mi$X Zn FT,/Y5Xf\DcF'O2S#J0حV1uSŗ39Zrt+ M* 2=ݫd&0L(і$$g %6\Ued~:X|\c t#,1^05ٱpyY@ D#"deJ?WjvWK+=/,cu U,+9ԧS|)CƆ~C^3. 1$u\g7#7!aFѰ kmX1aWڕ%3 ͝ |čr0L| +=r  fce45nm"'&16[g%NE&)H]v1#g3cҊ0I +[k;½HX;l(dqb,㔅rXS˲Z 4npR˨<θFZ, +LXh;S :A +endstream +endobj + +23 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 22 0 R +>> +endobj + +24 0 obj +<< +/Type /Font +/FontDescriptor 23 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 ] 20 21 556.15234 38 [ 722.16797 ] 50 [ 777.83203 666.99219 0 722.16797 0 610.83984 ] 81 82 556.15234 ] +/DW 500 +>> +endobj + +25 0 obj +<< +/Filter /FlateDecode +/Length 286 +>> +stream +x]Mo0 >*᫻ >4aFB8'I;$د׼/dzmyZDpІE1(-ck/Ks[;N92,ƃ`E +{־#Sxӭl2VGa9)m+ѵf@ !DyUUUШYz:N +ȅEQ|&J$#@ORJt~.w䡾$ +Jq:(Ef{#Krq3'8;٭j; +endstream +endobj + +xref +0 26 +0000000000 65535 f +0000000016 00000 n +0000024258 00000 n +0000024582 00000 n +0000024622 00000 n +0000025237 00000 n +0000025950 00000 n +0000026159 00000 n +0000026404 00000 n +0000026842 00000 n +0000026921 00000 n +0000030956 00000 n +0000031670 00000 n +0000032008 00000 n +0000032254 00000 n +0000032698 00000 n +0000032743 00000 n +0000032786 00000 n +0000032938 00000 n +0000033019 00000 n +0000034702 00000 n +0000034763 00000 n +0000034887 00000 n +0000039345 00000 n +0000039599 00000 n +0000039949 00000 n + +trailer +<< +/Size 26 +/Root 21 0 R +/Info 1 0 R +>> + +startxref +40309 +%%EOF \ No newline at end of file diff --git a/graphics/latencycomparison.pdf b/graphics/latencycomparison.pdf index 9ad1d0a..133ea7e 100644 Binary files a/graphics/latencycomparison.pdf and b/graphics/latencycomparison.pdf differ diff --git a/graphics/layer_architecture.png b/graphics/layer_architecture.png new file mode 100644 index 0000000..37dae62 Binary files /dev/null and b/graphics/layer_architecture.png differ diff --git a/graphics/network01.pdf b/graphics/network01.pdf new file mode 100644 index 0000000..6e306da --- /dev/null +++ b/graphics/network01.pdf @@ -0,0 +1,231 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260408195301+00'00') +/ModDate (D:20260408195301Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +/G6 6 0 R +>> +/Font << +/F5 5 0 R +>> +>> +/MediaBox [ 0 0 376.07999 233.03999 ] +/Contents 7 0 R +/StructParents 0 +/Tabs /S +/Parent 8 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +5 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 12 0 R ] +/ToUnicode 13 0 R +>> +endobj + +6 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +7 0 obj +<< +/Filter /FlateDecode +/Length 8525 +>> +stream +x]Q49n}[kI.ۂH $K!dI?e[wg .8 ~}\FGXt+7E_UE|rZ_^RW׿뿾*Ir߰v1$Ty\^EE)׏+DWJ^DʭW*TS-[LY.T_cTMs:?[M\d|[Z[%ڥnJݯXҝ.kչʵW*D"jZe|VO+JZj%=Q|K\SWӜ^)er-?ݮvW?HIW"bK[k_D2U[|1s)|ݒ~"$t՛r’/)<$1nl +k+5qք^DI/OW.n5H*)˥:DvcuҸƾTDi?VaJul͝5um%wHc{i|:E Z7\o|?Տa$sUe^cqG:lչ,PeR^%em|_\砍Džשh0G>x}Ԧ}:c*u^c龮r;jwi\%Mƿ +\*|zʕiVE$oRѫdNoYZ7^$yr_x\kWQm{fz~|U߭S~[/mVoEJY@:DG괺}:)c u+~;nvcgɤ&nBtXMFt׾{WHr8`^4UݑLu#bD2;# SWe}o:~΅C)we@s5}5sKVSy tIf*ӦwL9]~s}&giݾ(\͡T2{/^]嗻R@ +C +xHO-)Xƭ-&d{(֛b +xl@a&N+ /gY  381JZ81agNW ' hTOq:i|QiQ-20\Mixx?i({oS^G@i# #s7$3)Hi_e풙6x4Ox?ƙ)G)p;u'2oɝ; +?s!),XH$ O rq q)DTA-p "3[ܛޛ!t'Xĩ`i>v32جex|`,n v;xczO5dM [!뙨1D9OMkHoLEua%~_F~?F> 8 8 8 8 8 8 8 I`?Dن^wI46䒾ì(~ÿ},*yX?~uJ|?yaHted^~OUPyOP`:6ӶJA}P5Tr*AJ$kFqj%kKQX +'jekEjqZRN5:J (򖭡VwD6T=~R5Ԣl }x_5Q4֐ٚmy*ұS̯7pB}iqyL([Wl 0+qɚشXʜ<'{;zZWPt\M_έ4vZjk>Qj8\ \kxY,wF|1S[@[d+j[`oʂhx;ߢsѲ,0[fZm25`F?qx 4`AXgC +1K't( 0 &pSd[ Cv |7xuG pJ.x\G!7B9Rpׅd8hH8w#oKmd px;8UC=P=1gأ{@EaN^EN.V9m@5P&UNr"Ju#$ՋL +-}xN65pb}ԛFKmeje+{;[~zJ +N0_ޖl +qsslEfj̈́r(U; ʮ#Ub ^B)UO&;Op#˪gHp&C;:CQdmŁzG9i#?;ʫ"/[4[EF7ݎ0 DuN36):Dl҃ǟr噩pZPhu.ſչMPʋw~W0>)㦬cܽ]; Rv3]%*"v5.~]&+v.d9x&*O嬓&^rUx֡qa#}I'`ښD-@"& n -q:Q| )WPHmBn93@e"ȶO?n +:-jA +t[.N|+k]?%`ba >vܬPI^Pq!#mB`or ͞  f-`pLAx 2 Bn$@ V4 $.[^$5HA+,Dad(kJhȣ U5IawݞMCE-6[. xm}@?C?C?C?pT7hfq_}螑~N 7>'=(TtdTA9]d2+Rz8^*]㟵aNy2|kS۱lHrIwHIw7ՒQs2\wJi8nQ랆Nmؤ;IwہDs4Chҽ9L7NQPfҽG;?E&z5&ߒF-.~SĮL%}yCŕi(-G Ӿ* KFqQڇD﩯(^Vҗ/vنbuf_H^Sҗ?$%;MP2Jw ]wJ[w]3۲kq.k| r`w0.2Fv2t~,u)]N^?P>/swܬU|![!9`՜XBE# \+yKFxQ/qk5V0uMSGL|DDOd"{,x+t*ǕfAv0㡗DdV(-HJe9i<!J4NҖ=棚tM$Dӧ"D"N)h<)hNH6ަF߷7yv(Z;ZShgimgѦaѦ +h_ Z,O }y6fiͅFjOG_ ڋ3c'edS}啘/ vvEz}G_ :~j+=ƢmM~%p($;񏼢ܝ>P  1Ǝъv$Xe/0BYgY Bt8λCo?@#u|@K$3Fޛcc!q 2xf@A_ +$IRʀӢkR#*7EM't8q_qHKy1/Txs'+A`2kZ'co͞ǫ"Q +c5~5 <=N*W g7_0ِ=@BWGqt]$** A!M6qPWDC56G*d0J8U*W 7_%*Wn_'O2}' g7_yax6G6wEf+ڳ!><;x#WrIJme44Vn3( Lzo_Z=B]`}պUORCq< 6jFNx+_9e5lzp+߁v8WfNݧoƳw !ߞzr8鯜W//U_<넰 <9*͓s('!r8WBn{Hbw#t\ݮM7_9[< Ǥx) JūY*3 ԆC9t8kOp,3 Y΂E{ ~h;6FU Aa;4t 0i,6 ϝMS`94X"0HD!Lp샆SXN|$0Z&7*m&3qx,`9ߌEg#KStSt8 + NEmCVѽHV l+`bn|Nq8X ` Xf, h@X H~ x[f a!6ǀ`%+̃p`y΃EjcH$̃Ed`bH1?+OAbaOv# +Ǣ/vlu!x*U8 72X$glch;dD;u8pv +flѭ3yd8p$H$ÑH# G"e8G I(ÑHc t8w%sKA?0Bs͝HÑH#Gbbs@͡զ0kzvr9q0?0?0?0Kgz4(PB~ϻ4K$髣/-˳ %jVbEb4 gjɲ뿡(~Ez>o(#^$KEjEDz,^̨̓+S82sQ)S02Q)S7: S7{V f"! 9 #7Iii'YLH9򍜂J9\DED#h,"\D4lIyW mhm"43h/Vpy]6$mGq6#mxһ86|FEض+u5s:gd%֋ K)EPYѪ\)ԛ]k 4"niDЈiDD-.U4[(D.DJDDOID\DO1f`*ƒDqjP"21mNsWZ{| .WhB!ުX?1tJoW P3:G<+Ey:^S6ti`` L2) ?bu ~IDM"DQl0>}b~-cT61YƫflݢDca3d1#1'avG@@blƐ>0'IDUD9JDDٝ!3rAqdH2A %o\r]sSȌѩ!6{{KZo?\6$ пcFw!$/N$/N$/N$/N$/N$/N$/N$/NO*FDK[@`-_QT6B *a(\Q*AQ*qQ*AQQQqQQQQQqQ ; ՍKjdZdZdZdZ }!j_Z !jqQjQQ5 +{ ը(id4j2J6fD:|ToZ% +iכz:FMFjdtؕ}iMQ}ZY۪zA N˷]Q®h_ߗF-FgQN(wU `=Y2;nObciEb ͷm[C{~sh[`&y춍 ``ԝh0 +I\Bk?8N t L!.t0Ԡ( 4up F\9#1rt I$8(g*1AgǍ}t-3?BMLy^ N|:=A!,T;mW7lwqQ7lC6p Kbu(zR1)&,lmQMc9ZZd5D9n1JZd-%s0Jhkds9ݎ9ی1%5O߼;aKiΏ}9S9݌}Cx3VI>װH6Ӧ<p_7D=pSA8šj@xq/K-BQ8 EĐجg3x x``n x;x1E`ɄDE- 1B$5$QwQ@CdbsgI YNcޙ[5 /aoQ9Hxs ɴ>'WEJo>kLqwQf"YRNd1Nd1Nd1Nd1Nd1Nd1Nd1Nd1,bۑ."VD_愱 +endstream +endobj + +8 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +9 0 obj +<< +/Type /Catalog +/Pages 8 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +10 0 obj +<< +/Length1 6072 +/Filter /FlateDecode +/Length 3987 +>> +stream +xV{xT2gr猇IagBn@ dĨ6:! D7[aUXe[W|VIZ>]uoU+F]uٞ3>}}'{~}LB?xDfvE v0>_7-+zWrw X!5W{OG+֙@;Yv0 q=[z̼,%Ϳ "em얮iwVz'ޗ.zǞZHQ vP*}Ԃ68PQNR_CH ף6 ={x)pF\ /1@}*`a*z+3_+FUC6_hHqǬ }?{+X8yL x<}s?! Wɿ,r9&I?Ae [ka!WT!-CQЉ}3'O$A-}:/}Je;*vex4l&au1s3p)2ÛXzЇUZ"Chc0 sqt ki((XZ b bX'| ++ʰ܎.tBAF@f9 P=JAԢk_Fنʡy}PЀ,@|I| wx 󑇿R=uɘEs,be-Nƶo=n'j܃mxO_b56o8@WQ~3ů">܌p 7oS<`-+~qZA(-E;6gх&JH7,܇A*_ԧ- Kq8c\_帱؁؁pP3n {(jrop`/^^FUAZy֐<ȴ4ȐjT|i*t;4@42Fc)'?xQ:x42:8zpTyi[od뛤ȗϞ /9}f 8(?:{{/zEJ~;w)g ڿ/#=;R%Hs3qjS#ZjQU[|ئc;xL*}=ɍ(59h'kVn r dZmX7YĺcRuuIa>6KF&5-eyZQk^L[K:|m[C,:5:[CLәMGM8իyΑ.y6#o ?VĽ>ũ={qK^Ľ >==ޗqpI@,CY8ț, Q}A +{EYmw;nIkM :-$ذTk!rI4;\$k@;FAQ:A Z%^ +* +Geͻy*H2I/0wcw蟹׹cK({Jړ3>us^^>`A>[4;].a0 88DN:NNN HXW$,8PEa@eaI}YdYd3Yg~ʲRTݭL4ET>9{&OGxkɏL9K~8{xyq`ƕŽ.Lrjd4OO|~w"aώK%MKg$Nx_BRTW,[wus3tϔ=8+/>Z~L5ɥ\7ϽϽ@7҆amgϓlOMNY̞g3#Z$.nDp6ٰQO%)˸ XYh-k,e/e˼ݬ8en^ +^abc''mcqq` &ڢK¡`[kKs믻E]mBzw_9s甕*Vgz[.̳۬,9Yf$ + eԪ9>jX@`a:YSs_rž6I3L5 IJO+CaGjgcb_'cv/ֱ]Xw1Zg^e"N!$>z5}e\-['W@ DDl8տ\Uljb(77* M!F3X`k٢4?Yz9 (1{V\nO3I̤Wp>7oe]xÌꖑqnLLb_ck(OC_Ŵc9SbQml.pؕʒ0йJab3."}JfH?ιL(;JU,q?/W}ޛn?bU,(LV%ZS %^qQ13S[oZM.5v+Lk +kcT9S 晽jLX>wcۄKXsøYIքf8O<˸ bbS40wAԆ΄2wnc9Hm5ž!5C*mihKqli ∫քӖq -ku.(#qfu\ `( c`:B0ҁ@8t i6-c؜:L5r5Dꐨ! p8,j[ 0eiG?HKg%e\XepFb[m_+~So;݉hX?lgqb.CęrYUr]_zFmbwҐ[1eʋ휾Sao/a{ +endstream +endobj + +11 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 10 0 R +>> +endobj + +12 0 obj +<< +/Type /Font +/FontDescriptor 11 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 36 37 666.99219 38 39 722.16797 40 [ 666.99219 610.83984 777.83203 722.16797 ] ] +/DW 750 +>> +endobj + +13 0 obj +<< +/Filter /FlateDecode +/Length 228 +>> +stream +x]Pj0 +t=,v8 l琿/v) a4b4W7E>Oj0yr װ%05-8onMkEX'F<3&O3>3pA pb1,.!e˽{Dh+n~pb24#BB7 ?TtW e> + +startxref +41340 +%%EOF \ No newline at end of file diff --git a/graphics/network01.svg b/graphics/network01.svg new file mode 100644 index 0000000..e3fa734 --- /dev/null +++ b/graphics/network01.svg @@ -0,0 +1,4 @@ + + + +
E
F
G
H
D
C
B
A
\ No newline at end of file diff --git a/graphics/quic_handshake.pdf b/graphics/quic_handshake.pdf new file mode 100644 index 0000000..6beaeac --- /dev/null +++ b/graphics/quic_handshake.pdf @@ -0,0 +1,209 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260425163959+00'00') +/ModDate (D:20260425163959Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +>> +/Font << +/F5 5 0 R +>> +>> +/MediaBox [ 0 0 242.87999 325.91998 ] +/Contents 6 0 R +/StructParents 0 +/Tabs /S +/Parent 7 0 R +>> +endobj + +3 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +4 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +5 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 11 0 R ] +/ToUnicode 12 0 R +>> +endobj + +6 0 obj +<< +/Filter /FlateDecode +/Length 745 +>> +stream +xWn0}W37_$CsJ|""/!;in7RYV93,'Tq\kϐ xdh##>? bo:QQPD LE084~݆K r1m@ ׁ#= v*xd˕nuzi}Jx0(xLCTkwTHKtrd~qֿW{$ĞrϓP橇lN/;BԲ|$jwf7lg,ՖulˤUʁjtKʞD#Myh{jm%mUlpz3 V9V_o4 -OZ^v,UL?\?^sZth +:~D +endstream +endobj + +7 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +8 0 obj +<< +/Type /Catalog +/Pages 7 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +9 0 obj +<< +/Length1 11452 +/Filter /FlateDecode +/Length 7580 +>> +stream +xz |T9wݻ~$,مM&$0$k0*H` م/6VHTBV@Qn%jUV[+V[wvO;7w39s̙2Dg.qq_]tsҝEI, [uwƞo,["˒V/>-KcMA(L\9fL~S m~Ǻti27,__c 8Ҋ#(?ے]uUs3W+`2 q ,P7pOp<@7$& +ÁsOͰ!MaFm)_[o+_=}sO4~ +P@6nT,9!@vz>( x#a?LiP!9fX7 +hK&-FBkT@5u0MnO&<_5 }ʡrxI+qq؞_om<:x} ҷ``W+r4bt#ux(M~B8̹<@'isik:<[ypk:A&,O Ly k= {/', 6`O:½*ֱ{`- +a5x +G^c7C<Fx f +}k> ;plb+84h@; ~ AEHL矅upl- V`>?"L{p)xcU: +d9< < xbL7N~)d|(nb c^ptD b9w:* n +W'C=^~ + +f+{w a9ςu zݍל̧gn<4#16?sG'Jb?pz*>?YP'HHp?$6;˽Sܯ +?}e;zZ{{HOWI|A[9ྃylݿscs>Po~6gIڥrګd_`ii龧܎`=ݛvs%[vڝoߖmÖ-xh n wsۼٽyMiʃ\غ}׵ {7mfx`ҽnkxw[< +-+Wyw ~R#Iw4Tn owϟW)zGo"h$Sȵ&rkJS-Ԗ]Tj FpFPrWWx (iT$! +Lθ<#Fp)%P!kH)2(â}h,uf2@"*F9Q#E5 \,FnQq$AD%M ?k:;LRqQc\-+UR(wDvF#d+PTQ +*'OFNgT rt5C=4 OW1ovyGR;N)m"NiG;n(QO GJXmX^n[K?թܱ{5#q?Ex#.O<؊і,{ Pʹ Uy=e)Nmp@k#S`XiYo%'qV~G{>>تYI~ݢrAtGFX\:ݘV:^guduf+ZJn#q DGTo+w4.hjV2GM,P2?#u¨hm/ۤ|4⅛{w6>#]x}e{wlXrm-Ozu?p1'3dA<>G>lJZVNȿ:?zT΢ +MFbƈȦMaȆglk.FmXj6r%|9kWmzQ C +G~8p~>&?sp{I]&㯪Ina@)'(XHӜ&,;}~HzQ1fINlH{6sCr|)RVGse\a_gso&xN]wg7_b-ީ>=wf"dAkme6Ft#&ٙ϶l=VcM=ć3m; Ўsìsݾ2NQQ71W(g'"Abclib R.Cwڱ=1ф}{Z&*ÑRCk @cD &eh 4 dc%vCxvlOJ\^gM /ГP5cp \[2a U4a [M5aȄZiн44xjtqgqc`/Wwvx[mWb,:#BDB(RIbbg(RD }ŮK%zQtZN  Ko}6V 0+NP5Kf7 r<x-@AA#=qO}8ʽ6GqprySf^I M2m].˅.lra 'Pra ?wa pLͅQ1 y.9\C~>}!)V%ǻp bV +(cAAs.<1B0 +Qhh7C !L~mR>gK:aN@KЍژ̝osIlC=:_/]6WH-/KwWCe&)%`0&j@If5jƝfl7cf Q2J~eshP2mMȤtƽ{|v~#L]Ē't dB*yvte#qS':YK89R'W?,O/,JwĿ`q*e;+LQ$3 Ё-7Ff*XRj/FZ藭/X/MO,<՞B7ѓסB>x1hx/,ecs4,BLL&'#5FR[cv:Pr *9n+A2P[|%fbחO q%y܌7෮w |Q ɓt ]r%㌖ƈq($(Y9AyX&&Q&ÆI5Ñpa<#Qau$  c],od-ȤvrQHل|/G#u;_&&600 z,MehGLS3_i,֫pq﮹j9̿msowXnO3[1 "%b;D,a>ŚN%-"&E;@k/DۃʡƋ<6.xS2{%?>?"v*zb%C.CጁPB +{b~̝~W{why髯H?7c:Fk U%C8^S^D=qjB5 Gs;t/7`237 `WDb?2%eߝXvv.ՇQ|XʈC=xfLJV;'BŞ]tdaلco>rȩܑo;d";V(ߚ+2: evU|'|w@ޭ_yn⼅sY'ZbGowIl0 :a(X3O2 B0 PlI("9׉;v':1ĐK<s_[DL Кq< +endstream +endobj + +10 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 9 0 R +>> +endobj + +11 0 obj +<< +/Type /Font +/FontDescriptor 10 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 0 354.98047 ] 15 [ 277.83203 333.00781 277.83203 ] 19 22 556.15234 29 [ 277.83203 ] 36 [ 666.99219 0 722.16797 722.16797 666.99219 610.83984 0 722.16797 277.83203 0 666.99219 0 833.00781 722.16797 777.83203 666.99219 0 722.16797 666.99219 610.83984 0 666.99219 0 0 666.99219 0 277.83203 0 277.83203 ] 66 75 556.15234 76 [ 222.16797 ] 79 [ 222.16797 0 556.15234 ] 87 [ 277.83203 ] ] +/DW 500 +>> +endobj + +12 0 obj +<< +/Filter /FlateDecode +/Length 371 +>> +stream +x]n0E +/E@ !%$H,Pi>$Ej rEbnR sg|0QQm*})C:O[{:Nh# 7w{jFզ*wDI}ѱ?/nLD#߻|LDeD.H%\vtQ֌͉de#p$ v<6-IdJ)ˬ,2ߵE46RFL 0Zb21SA[К.T ((cڀ 7$X7Z<㗬ӐREVtfc4{³ρabTvϘXױgmbb ,%貰7i^'x5y==wƩjz}a +endstream +endobj + +xref +0 13 +0000000000 65535 f +0000000016 00000 n +0000040542 00000 n +0000040794 00000 n +0000040874 00000 n +0000040914 00000 n +0000041065 00000 n +0000041883 00000 n +0000041943 00000 n +0000042065 00000 n +0000049734 00000 n +0000049987 00000 n +0000050615 00000 n + +trailer +<< +/Size 13 +/Root 8 0 R +/Info 1 0 R +>> + +startxref +51060 +%%EOF \ No newline at end of file diff --git a/graphics/quicr_handshake.pdf b/graphics/quicr_handshake.pdf new file mode 100644 index 0000000..2c7f072 --- /dev/null +++ b/graphics/quicr_handshake.pdf @@ -0,0 +1,248 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260501214022+00'00') +/ModDate (D:20260501214022Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +/G6 6 0 R +>> +/Font << +/F5 5 0 R +>> +>> +/MediaBox [ 0 0 336 246 ] +/Contents 7 0 R +/StructParents 0 +/Tabs /S +/Parent 8 0 R +>> +endobj + +3 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +4 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +5 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 12 0 R ] +/ToUnicode 13 0 R +>> +endobj + +6 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +7 0 obj +<< +/Filter /FlateDecode +/Length 5668 +>> +stream +x]t9qb_GTKQ`@DU.0l`Wvum| oh*.T*ĕQ~ǿ\珚jYX_J=\\[ֻ;'5_O]fNRƐviI9Rۏ?|JOYr.&Q)T*ӣp-?}w߳J뾨2gE-_]/~>5Um?ف_}U?4rhihozU͹՜5gos}[W=mT8Qn>hFv|ÌDkӴHtnmvCڛsv}f$klFRjʝ(/32ML1~lHسm|YR+]B#xXM\ [5?InKHvdc47ٚ:7V)lICY v*KaI; ;&դLvvr)rJU? QjY53ۨ]%ԒwCUQ4)S4T՜sʥ%Ӑ!D\RiM/#YDgK5s[j^%qeqsj)5!dFjs[Bjb%z]TW]Rn/fG͏g_|H"hW)dIژcLI5cM,Q_GS{|I7<4=|d=oQS榲/GNepVMutwsKݜz.\3jV9I{g|X׵[,rӗ}e3e,-> +Z +|)摆=Vj3M{f[g,`sIq7GbΩǤipLHDa.'e{٨y&uBYA#J)7bݚ7qהK`^uwNl#+wJB{"oXy̵hr_6pbu:~bT<ĵzY`0C-u-xi}InqU{iHα,sr ')K4,s^|A̶BD̔ZO,>֓esO%\ƹ%\n[ʽ皨@$57$gCp%^ۅA(kpurNT0朚mDʜS!2w0fۺrO>o9! +07ǹULS@2ng=ʘs;?A2^X}EX=0=+b}=ʉQ]DPvØ'g4zf͜ Osa7=2谠i Ra%qδcM PMfRtDVE $2JoZ{1$ƍ}cQC{Tl{oyy z3cI=5(v@WOe,2Lz|s#R-l((#oTKu*tBfH٨kf]pqΗg1T,t15G1d17/HG `x,Ofdw,.->Z hl,SnS! +FE=0?!Rw}A͠o",+< JC BI&5TRӄ9ӗߩH@-@j!P ( ZHI^TCs +T!P8kíZVoM6ۘ)rcGq] # !TQ y1-2Uu +aFM,PW5`J$|/3˦ iSM\ rN/\+mwM^uc~ݱ=5~_D|[Ov۞lC>o,8`7B m͖ +Ӡꛩzs4)^B@kK@lKAn!% &%,WacBv/[uGouLWQ1}̄+[K\t!Whкh{ ^]^uv`9dQuiCO] + Z!TE {ukI`k.c2D{8 z }ˆDnRX +\b ǁŅlhofM{0:6ض`nw +i~lTl+ݞWVz2mnY)-] t$ot1&1ARy79?Aj 9ā.d䐕l0Dr`XdD;F +HN@ +}2FBnrvR;=ҢF?4~hCF?4~hC}_qV+@ʩyFr᭼՜󸒦]EoU7s}^~ƒ\d_~x[ YS:~H+q~AGn<YY齜G,ުJt>?,OwB'_ T1؂o6j׀L,TXgߑilԞ~TYYho*:@~18m@Tfmʩ*V|*QP3M]}SyWߔ=r;U~Wߔ77ƕ +x)ThJQ+RTiBPU k(b +vP}=CyhPsE {>ڢ!mo⛶ޤmzSz\:hXZg-uiL|.io&i.iJ$.YWM$ 'E77wҁWM3M]|gK  XrpR-lg)0lw^7o6Sb)5폧m4 T®bQfc⛍ HD]a 8u<ɡx9˾}7mM|4i/]|=X j4Cp7C3 H4M8D71]}(,;X#ntŗM17G>}|-,+3[[8Vop[|C BIķ7mF}+<W}vo+ķ{P|Q.A8"Fuax<-A5\bM{gz {ˆ<2XmgNP{ä)v ҫm |m +&vǤ0d[yÔ(o|n$u{Ǐ0 vLL cҽ +| FHj!d R܄ͅ0x&W닇 Ģv7mS@ȃd1Bː}x8:9Ar!i~HC4?!i~HCߤ թ)TSZIppg#뻏_~;_װۙ^ ++x;{l ^{K~-z[^RvzMYg鞮TSGURk/~+X{`bgC^R{{{`z۬$ +:jY i7 g)h>Nᯧќ6 K ll{`ymlc͂mo?l}uO>N@N>i@k?um:[+*Іޛk`Yf6 c2@@}=R1./ BX +hKamEd݂О2,X@`)h-4J&;A[0t _:Cm +]P7@ԍGU گABh + _\El04Нvb qFDy.( :Fԃ޽oDR(Ò_S6 ,xzk`w,gx ^{ +6Tg7X-9͂Y$R7 f}ol,Z+1B]~!+ݏYc,xx 7 +fWOb`K }yW0s0^Q%lcbYK`>q +c`;k`+P}ol͂^{`,s$'f,ŋh/p!zY`%|⟍ZFJ{ol͂},34 #a B)E$pIJlf/4 U(7ȸ`!7 [.l=. ! {f`-xt GnR A> +5x3d>@nHr8@@0LA(xA H*s8O,pc`QE !Gln[ V-x5hh+DI OG nápC?~8ápC??Ih/ hU~+<ߙӠ׺an`nU?FC#{ +endstream +endobj + +8 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +9 0 obj +<< +/Type /Catalog +/Pages 8 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +10 0 obj +<< +/Length1 10368 +/Filter /FlateDecode +/Length 6542 +>> +stream +xz `SU9/I4IдהPAPBJ)&Ŷ Pih*mRD8JgEDx":]qfXΌ0:ÀM{/imQgw9w9{9{#@Bp~Ev P:Cxxfߔ]D;МP,E`\U뗕Lh%0>Npd5ټ+DƥW;C”vun pc9;0CÃHj %ŀi{p,ہt{ +(@ A+P̌΃k_'i,q$1Ę+G3k3R&-Iц\R!]HY~v5$JHf(BJ^<`<~݊x8x_tdpJZ%F0 t@BP0*V@#4Z,H-44D}߲hpQ!\}!Y&yDRO*~(7SUo9+-P%yAؑh#u6)2&a +LM<4CF̀n B,Gj,dȅX +drNY찴P.X!hoxa,2:`N  K°dh&R(!XaˑMofdߖV_ңTjX +)G (]po5s+pF~80 +w~/ʭ]o=^ JX? /8t,ݢ<^cp 6_cXM|H`7mɳC <PxhE4_XkSzlKB;h ^pT64VQJ$^&J?F5zOga?.8# +Z~ `/>~B#EP3/ۨl@~.#h[Ynt[v*"-#$@!Q⿛m{b?}%A,;P3(l8  o7NJn*&׻c DĤא_&ؾN;vj/\"_ҡKt>kcM1 +{Ͷ^ۙsHa=;ؾ]?T^(3T})T;lt72f~`+]{u|o5_NŎ7KXok;96X㱖c:]ä0vE(jR{sU QE2RKDbط?1߶}D޾}'QOʲva<wx3moOi۶l߶=Txh}Z۰o[6bõ7>L~7mlkxl_q jo--cܖJdȘ-˶m{'WڪmWj%d%"+W&g{IRyL+'i^1{Ƈs[`-9%/ETGmΥ$*fz-ik۴1£m^Ғ[Hc/vv/^ElA-]tTHP^%2"TV-w#>xpVY&*b03P&UEAjVE]ff"͑x 0ހfDJ=>N[Gx# G1iHss95Hs$ <%5|M&"D"DYj@*\X7ޭuH,ݻL4/6D!gfy|GQQ$2v [zX㴋x% J!RQ9{!Ru\ +Q[lhN'j:Rla^@eE1n+"#9@!:㢵Cl!IrJ`غq|<E-Pc%y%\I((bpEL1 Fnw%JVT!aH(1DWlIG8$+wl{ +k=)(E~.-mAk~]"> 'Xȱ_VW%$q:1#QP~JDʡi)7{H9DC)*:c=ʼnD8'G p**H]EV{'!R61H;QKH)R$E2JE +zs_Zd c6Ojc8E-Huq9r[zyPrep.!D1W)iz yCc -fn. up2w}{R qv0n+ulBa@w%$:ԑ$-&2*S)!"8ai/e @^*N)XګZe LHԄv:L B8F Z[2[U5 +*W~3ue4h@ 0[g+N +{ ,pL nf7ZLgl 8 +nf[E'vN'X;t%Ogw9@Han`4C R$$xN֧baޭwO7vޮ?M_u ynB\K(}l];` .ͬT:2ݪMC f0@m@R>eKٯP*դRV3b5xx=-y5ߴ&+!@7kHc(n\QJS"i,5jDyW;_SWGFoc˯vX/Er/]O + Ҵt`41):5Ï0  ,:zkj*]??2|/z>z9'3?HEwF"k( @E6HV T6OиLZ$M"U@THe5#BjkaMw&{o/c럓OmOEg<5=׀fe 4IRJd*YQ荝r s+6+ +JI> ` jЧAI.̫&*gޭz*4ȜMx8ㅟEzLHo}9,⭿xߋE:~KIDO0mB$h4*L Q0SkZ- kL$'<)GļޭO-M.ddHNɖ5z8XtI/aOh|r][<|·6d/'ޭ)͉tT,/>}h' <@~A Mz}Rn S&R tKG1/u,qٕR$]N-(mI|rJMӟO|`eΞm+`qq7=MoOwB)PE)U2!Tb*P9PTn0B +AGTة2i(5 CbK+лWԻ{zzhk Id*,W0IDAr(ڦh4VohBP4iti4ASi5B8Q)T$QJ- LxG-xǟ"[xc#7dW~{2Lnq1yxKa<'eqLXxM.yd,lHdy{dT,GOcPHH|x5Cak0g0y8rPq" \ION=Rf>s;N97O O5*I`Rg42E>ʌQeN oA ,osw~8Ǯ=\+l?m!F?~vK_~(G&Np1FIQxpGL閬`6FH3}_IeY̦^ǖeI%3x + +cȗ2u 3ΔaXM ;5H dXtd/ :'/;q}N :Չ'꜉]_c~5C<% +Lu_w&ɗY-%m6G'4<[m/\(MuoKo,w$GM7$+bIP"didVEQfS +}d +դJPjTjzM?][SNKZ n/Ĥ@Tݞb+_7~yI Wj:$FDD&UA.5nRcP XFVF5RjP/Ը}4Oay$qeu4~/jM6Scuj5*jy{7z҈7M*%s n}_hq|>(Lxod1oJnL +4# +k!<ůՅ6aD_hˌ~OS@Pu&&볉ɓ^_|T2! +endstream +endobj + +11 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 10 0 R +>> +endobj + +12 0 obj +<< +/Type /Font +/FontDescriptor 11 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 ] 38 39 722.16797 40 [ 666.99219 0 0 722.16797 ] 50 [ 777.83203 0 0 722.16797 666.99219 ] 68 69 556.15234 71 75 556.15234 76 [ 222.16797 ] 79 [ 222.16797 833.00781 556.15234 556.15234 0 0 333.00781 ] 87 [ 277.83203 ] 98 [ 277.83203 ] 163 [ 556.15234 ] ] +/DW 500 +>> +endobj + +13 0 obj +<< +/Filter /FlateDecode +/Length 316 +>> +stream +x]n E|d#dYJX80vj0Y+3+upgXYk=en xiLI7!JKˡ'Cm9z=y7Q78mz͖n `<(oٮV`Z67f TЍLZ9缠yUUUA UN~.܎ s.x8JbTJ_@推;bKz>Vk"fc4PT`<,Ga L.O]+LhY> + +startxref +54050 +%%EOF \ No newline at end of file diff --git a/graphics/replicator_optimization_final.png b/graphics/replicator_optimization_final.png new file mode 100644 index 0000000..10536fd Binary files /dev/null and b/graphics/replicator_optimization_final.png differ diff --git a/graphics/replicator_optimization_final_2.png b/graphics/replicator_optimization_final_2.png new file mode 100644 index 0000000..cc05dd9 Binary files /dev/null and b/graphics/replicator_optimization_final_2.png differ diff --git a/graphics/zone_server_architecture.pdf b/graphics/zone_server_architecture.pdf new file mode 100644 index 0000000..51ee35a --- /dev/null +++ b/graphics/zone_server_architecture.pdf @@ -0,0 +1,345 @@ +%PDF-1.7 +% + +1 0 obj +<< +/Title (Untitled Diagram) +/Creator +/Producer +/CreationDate (D:20260501205116+00'00') +/ModDate (D:20260501205116Z) +/Subject +>> +endobj + +2 0 obj +<< +/Type /Page +/Resources << +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/ExtGState << +/G3 3 0 R +/G4 4 0 R +/G5 5 0 R +/G7 7 0 R +>> +/Font << +/F6 6 0 R +/F8 8 0 R +>> +>> +/MediaBox [ 0 0 451.91998 297.12 ] +/Contents 9 0 R +/StructParents 0 +/Tabs /S +/Parent 10 0 R +>> +endobj + +3 0 obj +<< +/ca 1 +/BM /Normal +>> +endobj + +4 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +5 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 1 +/ML 4 +/SA true +/BM /Normal +>> +endobj + +6 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /AAAAAA+LiberationSans +/Encoding /Identity-H +/DescendantFonts [ 14 0 R ] +/ToUnicode 15 0 R +>> +endobj + +7 0 obj +<< +/CA 1 +/ca 1 +/LC 0 +/LJ 0 +/LW 3 +/ML 10 +/SA true +/BM /Normal +>> +endobj + +8 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /BAAAAA+LiberationSans-Bold +/Encoding /Identity-H +/DescendantFonts [ 18 0 R ] +/ToUnicode 19 0 R +>> +endobj + +9 0 obj +<< +/Filter /FlateDecode +/Length 5413 +>> +stream +x]Q%m~?b xBIDA4:Fq@$Ҝލ;axđ8#Iԙ{T89]1rx[3D:Pb̑?n, rPeME:C)ߤә +(v~}:?7Jp23㣕 zX[׭'j,j˭k,jj˭kh, {;%1REEv' 5?ѕ_g9B+{FWV<4{yj̼j,3<4{yjd\5VMcX4fXi13L+ !/Oi3<4x<5:3gZyh@_:3ϴА~yjmfxމ~yjXi塡eX:3Rsw{yj̔OV/OLl~\Qpי)͏9Jgmf6?--rr o~ʛ-r :3)o~[`g:3)o~[ :3)o~[`gii!\RC̩ջ[Oݢ >C!Qqs½n\êӪq/[{Ъ1U^.j婑ꪑªRQ0 cA(p3<{JwcepO5.SyUvb1w^=!]LތU8BK~۟~9QTgۇGLJoM7JgF9ҿP f2v_u'@ʘ9?ۡ3}He0CF @}L봸&|f4f"孍Pt\yg?coTjBsv{#Odw3T50ř6[m>)cW5 +f52!e!1v;v1R5P7BJr+J_IfQK?5IK!^Jk#@]J?ٟAE4/x1v;*9 +_K]1X,H49͟~f"7gYL?6pc}>=v +c)c~<1:6r9~IAɄ8+T>啯6ic$8 VUv_bk/u>BPv,(k +ֹlE◪y٪;W3FzRz+gġ:!鼕xF +Qį3`vWl=,* +_@co5[`~ fzYlK]}}7J Qߠ^nS]Z/]k,d;;]{GZ^^-j\bmT#߻{{*`#{sV~L4ojE+;D +?NG+;4OkVtwt<Wt˥v_nMe^.Rw7P__iuUցmKl?QC-_4/E&5CejjU4IAF^OĬB(:Yc.0ql*ipF*Qe1QML Κc'y,&B73Ad )?Rg%R(CdTr;U"i^$*ږB%SY".'^#@ s(R1P%aN!5emLgeJ"qhʤM$(mZm!teId T<ҕi4hEǢ */'\zCy!N(cxl2`,Eq=Yvǚ`&c LgA}6d)>52 xV)~b< sbc3sZ,P*bPY"AfFwDuZ3ũL?RVۋ:'DZ#ĚfG٧&D~,`&dQuxDBM} mT?l,2%* uDdAF3uc\ĵrͪ6.ڛ8\pl!٨$g{pzGs+6 ]'`? O~|Lk +?$j4Rirڥ٤W=91~~6џTvD\/,! XuhI=P3ȝ@pcz?c2Rg~Rg~vΎo{L{[M=:YUA<$Y;xgJc.kS;m IpcoRWQΐ5tmۘQGwQfc7.p̻oْ -f{m8>K.(ٓI;z~'(?A OP~$(۞E_$TMJqYnV>pO'Y oS_T]+?G/\Wy`\T֣"HD.oMglpAd 6{L=kE8هB6\m\vכuu 0 )J 3mxn ui6 U\`35OH~B'$?!q~2{#'4}A?}' T?qMi(pߦ7mor}z!re7Y7'ɺkӛ{xzeuћqCd=,&җq&7&=~L7y̻79]Mܾ!8< or@䙊r&-i#8GP;p;ywpᝯS;}a8/ PKL +ٞLPKA,Z"K3a@31Z$.G)]Wx!8" .GttgAKܪ8}F蟝uFdae9~6 hBC;7%:1uxB9X Q;6Hs#Ρ& q7؊sP3N[znw]z[%3\8qa^zD'7lf3g:1>m]yrͨ 6.›8,pTǡCNCΎ=b 6Ct!VHmND'B?O~"/'cvDx@'-4κK =v;%۶#lGԴ$[GTd.\G;uj/޴Hw#눬MSTGD;ٕX/TGd;Iu*lTGD{avDڏ 3e';"[j[D}7qwԏ\w#="vsIp|mPgf[OSlTGD#:58t:5…PP&dEk3%#ҍH@=zC |:5E4ѶӇɁ<9[H.UѨ(wyzD_#?*L lTƀ1?kN`0 [̀Zo[x+T`&ݪK^@%dɺ82 sxnwt\șo*N眀z:>")M׼f$NŃNCΎ=` 6#ttIlx|2,'\D7"܈1Ada +endstream +endobj + +10 0 obj +<< +/Type /Pages +/Count 1 +/Kids [ 2 0 R ] +>> +endobj + +11 0 obj +<< +/Type /Catalog +/Pages 10 0 R +/ViewerPreferences << +/Type /ViewerPreferences +/DisplayDocTitle true +>> +>> +endobj + +12 0 obj +<< +/Length1 11272 +/Filter /FlateDecode +/Length 7409 +>> +stream +xz |e9LMwv0MyPdm,V!m)4Z(>h!ETZA"R]/JQY V\u륮]E`Uh{gswh ڀ@xNUnmw#-tWW";ڰewD7xᥑh 8@gK>9>cBSc!6JMM!N̦{r56м8Žj?c&9}/85a|9-+O`<b%̅k + POP4Ѐ@@)c2ϟ( ×x:R@m}.xCaɚKOB{CED! 0@.%ʬfB'\gT`>y(̓:ܛwБmHҮWd h"\tTP+{--,lMF-:p]N`LL!4 d3YgAW2X" +ˠCD`92hC|0a94(4<AnJ<7@V%L-s+4BРPF -V*TM +<0V1!x <C3}yVs~+r)YxsngpV .Cޱ{Oȳp5 }`7R ۣ7Y&x:X QIOOMxv a; +*a9!i;^;qlVV'p,; B#4it“p+]1}!Xf +`s }#_A{< sJ2rse3]\=K^@o:e%l՟@꿖ACO#+HHeķ\WX4,K`wKw[7nsAudΑ#kf{Pȭ_XW_W«4R'sQ~Zimr&+8!KnLLvnǖqc= 7.{֣xqh}|?ˬfB:,1ͮhFPO,YhPբ:TRR:Vtl}Hg9>e2kC&doIciaT&Uhwy 11?کbo>7OqD_돽 g}xښ;e 42 diF Xmlj}%>Ęy"aBNV*Z FHh4q{\w>]l?Ǝ>˴ǶŞC-6r/*Ei+0 h +hQׇ63{0 !$, uu+6wn:AR;Ӿ#6mGR LG ðj%e dT*cSF:*ۆKqw/_?ӾC1M$`cg 0XtA] 0f0Ƞ .03J vd((+e_6bB7>ӱr&;L9HQkT)-MZR4fiC-?ύ*`@W>~znj}g+;>y. TY + ٤ s&,!۶8~KZvJ2ԌT'GJR͝N\'68ĉ;įxʉ: Չa'UN>- +:Tp_;}~ǍJ;ډ8!R8|%'DE_t_JX'1CO}JTT3d+&LbU(`.P'Ĵ8 }&f&tlݱ͓݄{ ozXO-ߐ};:5gc}sܩ󸍼{qm24%s|1u:B^C4P!=@ށ\<0'P fi :N=tɑ_awO?'zi׏+rvM{wd߬cB/t0)Y;3Zet!21P_,0OX":Z't><C#|fD:M40, }uuuENbļJcXvdHL,0=NtE@ڬ#1m$C{'EQԡoW>~zC!ڐz=K|eFW{x޼vMYvU nܫr44Ϩ5Sitt5"UeBMFZRa +Q3\F֖q8t~~[vsx/Ñ[8\*#c9PaS?g9wp8k9,p^p÷9|i6q9s9?Ga?(pe9jB=9N~INl9v7qF[QE@@+}#nW&PL +.zn-;Ν FZCz=3Åuu+VԯZV/C}h4pzdN^:93/%5:占Ş6l?#1>#3~&y?'7y 7 +կs?j>iR>@Q7~\Yj4*)*B3(5ChnK `0L.iʞIyc݅n/=JjΓ"nx)y3?~ҳA<_ǏRR 12;&؊Je*RSj2C&#dC`)]YmR `t{oɬ촡(|y̨ X8!KŪFvjL¨B*.W*YO|ܲzyKqߍ.a˖]p赵}[wfWV֚0Ů`Ÿ嶥>Rl-z6V RY$3C.Zfi+m<¶^Ȇf{Uij$]w+aYNqv_Ii(LFo0eýv}Σ+mnF멦t;^@ZЄ}^kٶgyaG@j!5ٖ +Bj>RIF0D읙ؒLgbo&db"/~XY/=IA,mix,LL#a8RX'_tz`CC){8a'mp0a+~{dG O(;adDևܴ)HlK`g6Gbpdˎg9MJl>9OaNh\4c2uҴT'SPTF81<|'f2 ɥ+TfG>g^Ӏzw_|dtxJM?*[WqǪb7eWg9y,2rj޾boo|^ix(xsB%X. +hZa *`OkGwjM-ti4xaj;58GAh%HBht(وg o^zʥʿ sR`TAFKCiΥ)Ui>Q]gbռMKߣ?gN6 z>O/& zBVm`O+…u+V.[R#ɋ=a,19s^Wv^Ov2ئ\ !GN0WRݡJv8̜8PM9Gφ 2l; ٍzlDɉw܉y&ܥxV+HV,eY`07JMGq׆z݋W|zU>ڿTdi:џȮz6hebMT%Z唺ˁL :0ρw +F*ODɞJdMG\?v#n6R#cgbMT^|޷><%HL'9eR5he!QgPsԨ`KY,lBWƳ7 {009bP֤Q*m*챕1aY:7~{ֻ_߰5Ԩ^R? 1%ױOJmZ7 l Y@gX6$@,=!GMѠ~v,dNkYEl\}RP?Ka4T(p6fG 9F TnF ؛=ƶlg1,}ʱfPg×e2pTᄉdyؽ3޵5ڷ꽷|̰ny |Ǭ1]\+\~8OWE䝌+~dJL՚b0hhnKeL0bРhD2>fW8)gDf,'aQ&7gلĶ>f u_}z?UY=2^jVS0=%ə%z 0߰(G5䞄,`Y&(W*qNE_s]@\{z +hZ;V%jINCXmzu8W%:uh!^WuK[$& P +K \hQn9,8=_MW 6A?h +endstream +endobj + +13 0 obj +<< +/Type /FontDescriptor +/FontName /AAAAAA+LiberationSans +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 45.898438 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -543.94531 -303.22266 1301.75781 979.98047 ] +/FontFile2 12 0 R +>> +endobj + +14 0 obj +<< +/Type /Font +/FontDescriptor 13 0 R +/BaseFont /AAAAAA+LiberationSans +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 0 [ 750 0 0 277.83203 ] 36 37 666.99219 38 39 722.16797 40 [ 666.99219 610.83984 0 0 277.83203 0 666.99219 556.15234 833.00781 ] 53 [ 722.16797 666.99219 0 0 0 943.84766 0 0 610.83984 ] 68 [ 556.15234 ] 71 74 556.15234 76 [ 222.16797 ] 79 [ 222.16797 ] 81 83 556.15234 85 [ 333.00781 ] 87 [ 277.83203 556.15234 ] ] +/DW 500 +>> +endobj + +15 0 obj +<< +/Filter /FlateDecode +/Length 324 +>> +stream +x]n0E +/Edc)BJIX|j8 Q 0w5cV5hO٧d (pmH$?)Yª.1DR[; p +6ݪvOXF0rRTAOXnʂ(0^pڿbv\g 眗. U^~w.t%-8\IT-Xw lNvU/5v +endstream +endobj + +16 0 obj +<< +/Length1 7720 +/Filter /FlateDecode +/Length 4951 +>> +stream +xY tTյdnd0e& h0!$3F$! +U22*(+g}js?Vڧm]+XmW_A[3 jZﭷ>ܳr0 议~t/+Ia0@pmCꕽ`vmHn2PXۘH%!>M΍W\H8g8|&s*0Ѥk˴|x؊]K^'i]Le4j &Ȃ}>jń{_wrGNnJ S cI0vd/^tF+~3srm<' N'iqSFk9M .l]H/n7<Lq/^Nw(z'|M(N8/eq3O:2d(~a3؊qxVPCsu3pACB HC#hqqQ-i1zh1C5h4J@ +Uc衅hrPyG#C\_&~~@Q#BVr=B&IrN໤Kç%JNr'Dx7T7o4*M+hT^m|?R + +=+4'̓J<#4O_X6'+>eР'/Ǐ獊?r|89̑ǎwaO4*q?zH??<$C<$5*x<8cs#Ž1A1.CcS_VFGFrHGGN>}%Cr<4`'ur{_qQ ٱg3w专;펰vv[J-ܶ_+C$y'T~mHR,I㙓d~Axps9\̦Ҟ`i5Xxo+kW)˕KW_/Vj {D{Zg'w^&{aeX7?w?;Ύ9JcRQ:6upTW}p*( ӽaqq:z8B!|ГS)jGcб#69v8N8APhM"ޱU݁@5άKbn;W3.՗FLj>en4mgQkg}Q(ss9J m RCFJT0TjhhYT Q) +HT*e ܏p0d"SCtjfDP*dVE{VuwuF:.l0jmi^7-ol`Y-]zQUro6߫dcV=?f*UF}Nh!-VUJZ*CZ8Ԅq&6S%W? u m8g4j!4mqZTU-}fUyUbm#xkU%[J[{U%B-9F q2JHg4zcU+,4Ťdf5)MFC<2rOK\e|"VU9‡FFncrUh7J*CRk 5=N!>֛gk9< ɸF]Q!55<IgiSd(2Doa;ce](|au x}M|WD> fma#^;uhb @qqrdRcX,q[Uaoe;lxS 9٬=^mPVc&Veoe&~f1f:0o8ά[&B^S ~J:aUj܊jCZ(gj.&̥֒5OVhSwtɹ1W C|}΋UsF .3zXy4:Z %xh$ڷ)qOSԨDLnjm9Yń1swk흫 ::Fz4L1ϦF9cDfOkn`Y}6f9%56ns%ЬbUE*۩mbt[<ޘ7+U|jn`&lFRۦLOe8_K2rYjlz5k1m@ez$jH\2̜jYɪd𶯚dgfrمfvyYi##|+-/{wqpBSj8{Gt8 me߈m0]댱 +N*84isL]ݫkU G\K96vuFnj9Ck(jt Af=u`ش +':۔~ف@:8} +-`-6uH/6=O3F꠨۾E@Q +36̵tq=Y0HF=J( YbfC*CZq>c\nj7|#m9-#"|ٵfCd蛲zj͌0Z"piԫ9:Yψ-cbo~Zq'xXN9>&x4>*R}kHGwﻈ?*|gw %Ϊg +gahlV)[%7V`%b PxLC2-SLu2drgސE "2,V6ȴJ_ SLLe͔ã2aL5=dZ'SDfjM'eztxZ2iL7NdjiwSfD?Y}2*6sY|L~\2YAӔezLdd +B&21ٴDH]&&>%iZA&5k3wLY46 V˅TR/V 5^{ɛGY{r퓿۞e&,s{@^c7 \{v;1 %Pp)y<#.^Ury\ޘå8rK+].Azc"/ K^Jz)t/՘?KgfJr!KkטܤY-!PAW]<:敽K uRDM-Q-hkN3~UWM#/;s]Ro$O~b#d-1tΙZ,9*|L͝[&1UXnVM5W3 V8{f^uAo%u|nWJEŮyT2-韥~}ZrC_.' +BV5m7O'膥|߫O6\RU5~b|ɷ}r%5l"w#]1ޝ,x 8W95sUaAUvpwWdzT)Jҿ o#[%$ H2ť\nQZRP +ҎR:VJ[Jե})83pڒb=|TֺM[Ջ +۲C6_1 ːOzCؒoxOaI[$nDI䗨P"ASV$#aiICKi"74!qIOK~nI\\Viĩ$zQzC➓h_n(.%%.g8D's &1>$-$%aIG+$K1F V("Q$q;=S )#"5I5sX)q=[w$fX@"wr*r/Yz;U|q~_X6UYѿ +endstream +endobj + +17 0 obj +<< +/Type /FontDescriptor +/FontName /BAAAAA+LiberationSans-Bold +/Flags 4 +/Ascent 905.27344 +/Descent -211.91406 +/StemV 76.171875 +/CapHeight -687.98828 +/ItalicAngle 0 +/FontBBox [ -481.93359 -376.46484 1304.19922 1033.20313 ] +/FontFile2 16 0 R +>> +endobj + +18 0 obj +<< +/Type /Font +/FontDescriptor 17 0 R +/BaseFont /BAAAAA+LiberationSans-Bold +/Subtype /CIDFontType2 +/CIDToGIDMap /Identity +/CIDSystemInfo << +/Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> +/W [ 3 [ 277.83203 ] 36 37 722.16797 54 [ 666.99219 ] 61 [ 610.83984 ] 72 [ 556.15234 ] 81 82 610.83984 85 [ 389.16016 0 0 0 556.15234 ] ] +/DW 750 +>> +endobj + +19 0 obj +<< +/Filter /FlateDecode +/Length 283 +>> +stream +x]j0yY޻$Ɵ E+4m·/&H#sLвw; JK˼Z48H%ASg-S9Q-npʹ3oVUzӭlτ18vHQā3݄@HNr+ۿ pQF 1V@^u]{T :r8+v3Oi +t> + +startxref +88850 +%%EOF \ No newline at end of file diff --git a/kidiplom.acn b/kidiplom.acn index 11e331a..e69de29 100644 --- a/kidiplom.acn +++ b/kidiplom.acn @@ -1 +0,0 @@ -\glossaryentry{UPOL?\glossentry{UPOL}|setentrycounter[]{page}"\glsnumberformat}{42} diff --git a/kidiplom.aux b/kidiplom.aux index eaaebbb..e175f6a 100644 --- a/kidiplom.aux +++ b/kidiplom.aux @@ -1,4 +1,5 @@ \relax +\providecommand{\transparent@use}[1]{} \providecommand \babel@aux [2]{\global \let \babel@toc \@gobbletwo } \@nameuse{bbl@beforestart} \catcode `"\active @@ -8,8 +9,8 @@ \providecommand\HyField@AuxAddToCoFields[2]{} \providecommand\BKM@entry[2]{} \abx@aux@refcontext{none/global//global/global/global} -\BKM@entry{id=1,open,dest={6B693A7061706572},srcline={149}}{5C3337365C3337375C303030535C303030745C303030795C3030306C5C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030745C303030655C303030785C303030745C3030305C3034305C3030307A5C3030305C3334315C303030765C3030315C3033335C303030725C303030655C3030315C3031355C3030306E5C3030305C3335315C3030305C3034305C303030705C303030725C3030305C3334315C303030635C30303065} -\BKM@entry{id=2,open,dest={6B693A7469746C65},srcline={149}}{5C3337365C3337375C303030545C303030695C303030745C303030755C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C30303061} +\BKM@entry{id=1,open,dest={6B693A7061706572},srcline={150}}{5C3337365C3337375C3030304D5C303030655C303030745C3030306F5C303030645C303030795C3030305C3034305C3030306F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C303030705C3030315C3133315C303030655C3030306E5C3030306F5C303030735C303030755C3030305C3034305C303030645C303030615C303030745C3030305C3034305C303030765C3030305C3034305C303030645C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030306D5C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303075} +\BKM@entry{id=2,open,dest={6B693A7469746C65},srcline={150}}{5C3337365C3337375C303030545C303030695C303030745C303030755C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C30303061} \providecommand\@newglossary[4]{} \@newglossary{main}{glg}{gls}{glo} \@newglossary{acronym}{alg}{acr}{acn} @@ -19,239 +20,214 @@ \@istfilename{kidiplom.ist} \@glsorder{word} \babel@aux{czech}{} -\BKM@entry{id=3,open,dest={6B693A616E6F746174696F6E},srcline={149}}{5C3337365C3337375C303030415C3030306E5C3030306F5C303030745C303030615C303030635C30303065} -\BKM@entry{id=4,open,dest={6B693A746F63},srcline={149}}{5C3337365C3337375C3030304F5C303030625C303030735C303030615C30303068} -\BKM@entry{id=5,open,dest={73656374696F6E2E31},srcline={160}}{5C3337365C3337375C303030315C3030305C3034305C3030305C3333325C303030765C3030306F5C30303064} -\@writefile{toc}{\contentsline {section}{\numberline {1}Úvod}{9}{section.1}\protected@file@percent } -\BKM@entry{id=6,open,dest={73656374696F6E2E32},srcline={166}}{5C3337365C3337375C303030325C3030305C3034305C303030445C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303079} -\BKM@entry{id=7,open,dest={73756273656374696F6E2E322E31},srcline={182}}{5C3337365C3337375C303030325C3030302E5C303030315C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C303030655C3030305C3034305C303030765C3030305C3034305C303030735C3030305C3335355C303030745C30303069} -\BKM@entry{id=8,open,dest={73756273656374696F6E2E322E32},srcline={195}}{5C3337365C3337375C303030325C3030302E5C303030325C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050} -\@writefile{toc}{\contentsline {section}{\numberline {2}Distribuované systémy}{10}{section.2}\protected@file@percent } -\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~1\else \numberline {1}Definice\fi \thmtformatoptarg {Počítačová síť}}{10}{definition.1}\protected@file@percent } -\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~2\else \numberline {2}Definice\fi \thmtformatoptarg {Distribuovaný systém}}{10}{definition.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Komunikace v síti}{10}{subsection.2.1}\protected@file@percent } -\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~3\else \numberline {3}Definice\fi \thmtformatoptarg {Komunikační protokol}}{10}{definition.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}TCP/IP}{11}{subsection.2.2}\protected@file@percent } -\BKM@entry{id=9,open,dest={73756273656374696F6E2E322E33},srcline={229}}{5C3337365C3337375C303030325C3030302E5C303030335C3030305C3034305C303030415C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303079} -\BKM@entry{id=10,open,dest={73756273756273656374696F6E2E322E332E31},srcline={233}}{5C3337365C3337375C303030325C3030302E5C303030335C3030302E5C303030315C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C30303072} -\BKM@entry{id=11,open,dest={73756273756273656374696F6E2E322E332E32},srcline={237}}{5C3337365C3337375C303030325C3030302E5C303030335C3030302E5C303030325C3030305C3034305C303030505C303030655C303030655C303030725C3030302D5C303030745C3030306F5C3030302D5C303030505C303030655C303030655C30303072} -\BKM@entry{id=12,open,dest={73756273656374696F6E2E322E34},srcline={239}}{5C3337365C3337375C303030325C3030302E5C303030345C3030305C3034305C303030525C3030306F5C303030645C303030695C3030306E5C303030615C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030315C3135375C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Architektury}{12}{subsection.2.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Klient-Server}{12}{subsubsection.2.3.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Peer-to-Peer}{12}{subsubsection.2.3.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Rodina protokolů TCP/IP}{12}{subsection.2.4}\protected@file@percent } -\BKM@entry{id=13,open,dest={73756273656374696F6E2E322E35},srcline={248}}{5C3337365C3337375C303030325C3030302E5C303030355C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030745C303030725C303030615C3030306E5C303030735C303030705C3030306F5C303030725C303030745C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333} -\BKM@entry{id=14,open,dest={73756273756273656374696F6E2E322E352E31},srcline={252}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030535C3030306F5C303030635C3030306B5C303030655C303030745C30303079} -\BKM@entry{id=15,open,dest={73756273756273656374696F6E2E322E352E32},srcline={258}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030545C303030435C30303050} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{13}{subsection.2.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.1}Sockety}{13}{subsubsection.2.5.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.2}TCP}{13}{subsubsection.2.5.2}\protected@file@percent } -\BKM@entry{id=16,open,dest={73756273756273656374696F6E2E322E352E33},srcline={266}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074} -\BKM@entry{id=17,open,dest={73756273756273656374696F6E2E322E352E34},srcline={274}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030345C3030305C3034305C303030555C303030445C30303050} -\BKM@entry{id=18,open,dest={73756273756273656374696F6E2E322E352E35},srcline={281}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030355C3030305C3034305C303030515C303030555C303030495C30303043} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.3}Spolehlivost}{14}{subsubsection.2.5.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.4}UDP}{14}{subsubsection.2.5.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.5}QUIC}{15}{subsubsection.2.5.5}\protected@file@percent } -\BKM@entry{id=19,open,dest={73756273656374696F6E2E322E36},srcline={299}}{5C3337365C3337375C303030325C3030302E5C303030365C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030615C303030705C3030306C5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333} -\BKM@entry{id=20,open,dest={73756273756273656374696F6E2E322E362E31},srcline={303}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030315C3030305C3034305C303030485C303030545C303030545C30303050} -\BKM@entry{id=21,open,dest={73756273756273656374696F6E2E322E362E32},srcline={309}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030485C303030545C303030545C303030505C3030302F5C30303033} -\BKM@entry{id=22,open,dest={73756273756273656374696F6E2E322E362E33},srcline={313}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030675C303030525C303030505C30303043} -\BKM@entry{id=23,open,dest={73756273756273656374696F6E2E322E362E34},srcline={317}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030345C3030305C3034305C3030304D5C303030695C303030645C303030645C3030306C5C303030655C303030775C303030615C303030725C30303065} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.6}Protokoly v aplikační vrstvě}{16}{subsection.2.6}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.1}HTTP}{16}{subsubsection.2.6.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.2}HTTP/3}{16}{subsubsection.2.6.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.3}gRPC}{16}{subsubsection.2.6.3}\protected@file@percent } -\BKM@entry{id=24,open,dest={73756273656374696F6E2E322E37},srcline={324}}{5C3337365C3337375C303030325C3030302E5C303030375C3030305C3034305C303030505C3030306F5C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076} -\BKM@entry{id=25,open,dest={73756273756273656374696F6E2E322E372E31},srcline={328}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030315C3030305C3034305C303030535C303030655C303030725C303030695C303030615C3030306C5C303030695C3030307A5C303030615C303030635C30303065} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.4}Middleware}{17}{subsubsection.2.6.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.7}Posílání zpráv}{17}{subsection.2.7}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.1}Serializace}{17}{subsubsection.2.7.1}\protected@file@percent } -\BKM@entry{id=26,open,dest={73756273756273656374696F6E2E322E372E32},srcline={363}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030325C3030305C3034305C3030304B5C3030305C3336335C303030645C3030306F5C303030765C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}C++}{18}{lstlisting.1}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}C++}{18}{lstlisting.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.2}Kódování zpráv}{18}{subsubsection.2.7.2}\protected@file@percent } -\BKM@entry{id=27,open,dest={73756273756273656374696F6E2E322E372E33},srcline={371}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030705C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C303030615C303030635C30303065} -\BKM@entry{id=28,open,dest={73756273756273656374696F6E2E322E372E34},srcline={377}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030345C3030305C3034305C303030445C303030655C303030745C303030655C3030306B5C303030635C303030655C3030305C3034305C303030615C3030305C3034305C3030306E5C3030305C3334315C303030705C303030725C303030615C303030765C303030615C3030305C3034305C303030635C303030685C303030795C30303062} -\BKM@entry{id=29,open,dest={73756273656374696F6E2E322E38},srcline={385}}{5C3337365C3337375C303030325C3030302E5C303030385C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C3030305C3335355C3030305C3034305C303030495C3030304F} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.3}Implementace}{19}{subsubsection.2.7.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.4}Detekce a náprava chyb}{19}{subsubsection.2.7.4}\protected@file@percent } -\BKM@entry{id=30,open,dest={73756273756273656374696F6E2E322E382E31},srcline={391}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030315C3030305C3034305C3030305A5C303030655C303030725C3030306F5C3030304D5C30303051} -\BKM@entry{id=31,open,dest={73756273756273656374696F6E2E322E382E32},srcline={397}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030325C3030305C3034305C303030575C3030306F5C303030725C3030306B5C3030305C3034305C303030735C303030745C303030655C303030615C3030306C5C303030695C3030306E5C30303067} -\BKM@entry{id=32,open,dest={73756273756273656374696F6E2E322E382E33},srcline={401}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030335C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C3030302F5C303030415C303030775C303030615C303030695C30303074} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.8}Asynchroní IO}{20}{subsection.2.8}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{20}{subsubsection.2.8.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{20}{subsubsection.2.8.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{20}{subsubsection.2.8.3}\protected@file@percent } -\BKM@entry{id=33,open,dest={73756273756273656374696F6E2E322E382E34},srcline={407}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030345C3030305C3034305C303030425C3030306F5C3030306F5C303030735C303030745C3030305C3034305C303030415C303030735C303030695C3030306F} -\BKM@entry{id=34,open,dest={73756273756273656374696F6E2E322E382E35},srcline={419}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030355C3030305C3034305C303030535C303030745C303030615C303030635C3030306B5C3030305C3034305C303030705C3030306F5C303030695C3030306E5C303030745C303030655C30303072} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{21}{subsubsection.2.8.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.5}Stack pointer}{21}{subsubsection.2.8.5}\protected@file@percent } -\BKM@entry{id=35,open,dest={73756273656374696F6E2E322E39},srcline={431}}{5C3337365C3337375C303030325C3030302E5C303030395C3030305C3034305C3030304D5C303030655C303030745C303030725C303030695C3030306B5C30303079} -\BKM@entry{id=36,open,dest={73756273756273656374696F6E2E322E392E31},srcline={435}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030315C3030305C3034305C303030545C303030695C3030306D5C303030655C303030735C303030635C303030615C3030306C5C303030655C303030445C30303042} -\BKM@entry{id=37,open,dest={73756273756273656374696F6E2E322E392E32},srcline={439}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030325C3030305C3034305C303030475C303030725C303030615C303030665C303030615C3030306E5C30303061} -\BKM@entry{id=38,open,dest={73756273756273656374696F6E2E322E392E33},srcline={445}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030475C303030755C30303069} -\BKM@entry{id=39,open,dest={73756273756273656374696F6E2E322E392E34},srcline={449}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030345C3030305C3034305C303030545C303030725C303030615C303030635C30303079} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.9}Metriky}{22}{subsection.2.9}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.1}TimescaleDB}{22}{subsubsection.2.9.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.2}Grafana}{22}{subsubsection.2.9.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.3}ImGui}{22}{subsubsection.2.9.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.4}Tracy}{22}{subsubsection.2.9.4}\protected@file@percent } -\BKM@entry{id=40,open,dest={73756273756273656374696F6E2E322E392E35},srcline={453}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030355C3030305C3034305C3030304B5C3030306F5C3030306E5C3030306B5C303030725C3030305C3335315C303030745C3030306E5C3030305C3335355C3030305C3034305C3030306D5C303030655C303030745C303030725C303030695C3030306B5C30303079} -\BKM@entry{id=41,open,dest={73756273756273656374696F6E2E322E392E36},srcline={469}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030365C3030305C3034305C303030535C303030625C3030305C3335355C303030725C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C303030765C3030305C3034305C303030725C303030655C3030305C3334315C3030306C5C3030306E5C3030305C3335315C3030306D5C3030305C3034305C3030315C3031355C303030615C303030735C30303065} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.5}Konkrétní metriky}{23}{subsubsection.2.9.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.6}Sbírání v reálném čase}{23}{subsubsection.2.9.6}\protected@file@percent } -\BKM@entry{id=42,open,dest={73656374696F6E2E33},srcline={487}}{5C3337365C3337375C303030335C3030305C3034305C303030485C303030725C303030615C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537} -\BKM@entry{id=43,open,dest={73756273656374696F6E2E332E31},srcline={493}}{5C3337365C3337375C303030335C3030302E5C303030315C3030305C3034305C303030485C303030725C30303079} -\BKM@entry{id=44,open,dest={73756273756273656374696F6E2E332E312E31},srcline={507}}{5C3337365C3337375C303030335C3030302E5C303030315C3030302E5C303030315C3030305C3034305C303030455C3030306E5C303030745C30303074} -\@writefile{toc}{\contentsline {section}{\numberline {3}Hra pro více hráčů}{24}{section.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Hry}{24}{subsection.3.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}Entt}{24}{subsubsection.3.1.1}\protected@file@percent } -\BKM@entry{id=45,open,dest={73756273656374696F6E2E332E32},srcline={546}}{5C3337365C3337375C303030335C3030302E5C303030325C3030305C3034305C303030535C303030765C3030315C3033335C30303074} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {3}C++}{25}{lstlisting.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Svět}{25}{subsection.3.2}\protected@file@percent } -\BKM@entry{id=46,open,dest={73756273756273656374696F6E2E332E322E31},srcline={550}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030315C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C3030306A5C303030655C303030645C3030306E5C3030306F5C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065} -\BKM@entry{id=47,open,dest={73756273756273656374696F6E2E332E322E32},srcline={554}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030325C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537} -\BKM@entry{id=48,open,dest={73756273656374696F6E2E332E33},srcline={562}}{5C3337365C3337375C303030335C3030302E5C303030335C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C303030725C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061} -\BKM@entry{id=49,open,dest={73756273656374696F6E2E332E34},srcline={574}}{5C3337365C3337375C303030335C3030302E5C303030345C3030305C3034305C303030535C303030655C303030725C303030765C303030655C30303072} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{26}{subsubsection.3.2.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{26}{subsubsection.3.2.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{26}{subsection.3.3}\protected@file@percent } -\BKM@entry{id=50,open,dest={73756273756273656374696F6E2E332E342E31},srcline={579}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030525C303030655C303030675C303030695C303030735C303030745C303030725C3030305C3034305C303030735C303030705C3030306F5C3030306A5C303030655C3030306E5C3030305C333535} -\BKM@entry{id=51,open,dest={73756273756273656374696F6E2E332E342E32},srcline={587}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030325C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C30303072} -\BKM@entry{id=52,open,dest={73756273756273656374696F6E2E332E342E33},srcline={593}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030335C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030655C303030735C303030745C3030305C3034305C3030306D5C303030615C3030306E5C303030615C303030675C303030655C30303072} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Server}{27}{subsection.3.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.1}Registr spojení}{27}{subsubsection.3.4.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2}Replikátor}{27}{subsubsection.3.4.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.3}Interest manager}{27}{subsubsection.3.4.3}\protected@file@percent } -\BKM@entry{id=53,open,dest={73756273656374696F6E2E332E35},srcline={603}}{5C3337365C3337375C303030335C3030302E5C303030355C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C30303074} -\BKM@entry{id=54,open,dest={73756273756273656374696F6E2E332E352E31},srcline={607}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C303030635C303030615C303030745C3030306F5C303030725C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C5C3030306C5C303030655C30303072} -\BKM@entry{id=55,open,dest={73756273756273656374696F6E2E332E352E32},srcline={611}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030705C3030306F5C3030306C5C303030615C303030635C30303065} -\BKM@entry{id=56,open,dest={73756273756273656374696F6E2E332E352E33},srcline={620}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030525C3030306F5C3030306C5C3030306C5C303030625C303030615C303030635C3030306B5C3030305C3034305C303030615C3030305C3034305C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030635C303030655C3030305C3034305C303030765C3030306C5C303030615C303030735C303030745C3030306E5C3030305C3335355C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Klient}{28}{subsection.3.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.1}Replicator controller}{28}{subsubsection.3.5.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.2}Interpolace}{28}{subsubsection.3.5.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.3}Rollback a simulace vlastního hráče}{28}{subsubsection.3.5.3}\protected@file@percent } -\BKM@entry{id=57,open,dest={73756273656374696F6E2E332E36},srcline={628}}{5C3337365C3337375C303030335C3030302E5C303030365C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C} -\BKM@entry{id=58,open,dest={73756273656374696F6E2E332E37},srcline={640}}{5C3337365C3337375C303030335C3030302E5C303030375C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030305C3034305C303030515C303030555C303030495C303030435C30303072} -\gdef \LT@i {\LT@entry - {1}{142.93542pt}\LT@entry - {1}{1048.79956pt}\LT@entry - {1}{0.0pt}} -\BKM@entry{id=59,open,dest={73756273756273656374696F6E2E332E372E31},srcline={663}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C3030305C3034305C303030465C303030725C303030615C3030306D5C30303065} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Komunikační protokol}{29}{subsection.3.6}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Protokol QUICr}{29}{subsection.3.7}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{29}{table.1}\protected@file@percent } -\newlabel{tab:prepinace}{{1}{29}{Rozhraní třídy QuicrEndpoint}{table.1}{}} -\BKM@entry{id=60,open,dest={73756273756273656374696F6E2E332E372E32},srcline={669}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030325C3030305C3034305C303030485C303030615C3030306E5C303030645C303030735C303030685C303030615C3030306B5C30303065} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}Frame}{30}{subsubsection.3.7.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2}Handshake}{30}{subsubsection.3.7.2}\protected@file@percent } -\BKM@entry{id=61,open,dest={73756273756273656374696F6E2E332E372E33},srcline={696}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.3}Spolehlivost}{31}{subsubsection.3.7.3}\protected@file@percent } -\BKM@entry{id=62,open,dest={73756273756273656374696F6E2E332E372E34},srcline={724}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030345C3030305C3034305C303030455C3030306E5C3030306B5C3030306F5C303030645C3030305C3335315C30303072} -\BKM@entry{id=63,open,dest={73756273756273656374696F6E2E332E372E35},srcline={730}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030355C3030305C3034305C303030545C303030655C303030735C303030745C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.4}Enkodér}{32}{subsubsection.3.7.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.5}Testování}{32}{subsubsection.3.7.5}\protected@file@percent } -\BKM@entry{id=64,open,dest={73756273756273656374696F6E2E332E372E36},srcline={767}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030365C3030305C3034305C3030304F5C303030645C303030655C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C333535} -\BKM@entry{id=65,open,dest={73756273756273656374696F6E2E332E372E37},srcline={778}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030375C3030305C3034305C3030315C3031345C303030745C303030655C3030306E5C3030305C333535} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.6}Odesílání}{33}{subsubsection.3.7.6}\protected@file@percent } -\newlabel{integrationcomparison}{{3.7.5}{34}{Testování}{subsubsection.3.7.5}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Integrace}}{34}{figure.1}\protected@file@percent } -\newlabel{playerbenchmark}{{3.7.5}{34}{Testování}{figure.1}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces 301 připojených hráčů}}{34}{figure.2}\protected@file@percent } -\BKM@entry{id=66,open,dest={73756273756273656374696F6E2E332E372E38},srcline={784}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030385C3030305C3034305C3030315C3134305C303030695C303030665C303030725C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535} -\BKM@entry{id=67,open,dest={73756273756273656374696F6E2E332E372E39},srcline={788}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030395C3030305C3034305C303030535C303030505C303030525C3030302D5C30303036} -\BKM@entry{id=68,open,dest={73756273756273656374696F6E2E332E372E3130},srcline={793}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030305C3030305C3034305C3030304C5C3030306F5C303030635C3030306B5C303030735C303030745C303030655C30303070} -\BKM@entry{id=69,open,dest={73756273756273656374696F6E2E332E372E3131},srcline={797}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030315C3030305C3034305C303030435C3030306F5C3030306E5C303030675C303030655C303030735C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C} -\BKM@entry{id=70,open,dest={73756273756273656374696F6E2E332E372E3132},srcline={799}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030325C3030305C3034305C303030425C303030615C3030306E5C303030645C303030775C303030695C303030645C303030745C303030685C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.7}Čtení}{35}{subsubsection.3.7.7}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.8}Šifrování}{35}{subsubsection.3.7.8}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.9}SPR-6}{35}{subsubsection.3.7.9}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.10}Lockstep}{35}{subsubsection.3.7.10}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.11}Congestion control}{35}{subsubsection.3.7.11}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.12}Bandwidth control}{35}{subsubsection.3.7.12}\protected@file@percent } -\BKM@entry{id=71,open,dest={73756273656374696F6E2E332E38},srcline={803}}{5C3337365C3337375C303030335C3030302E5C303030385C3030305C3034305C303030535C303030685C303030615C303030725C303030645C303030695C3030306E5C30303067} -\BKM@entry{id=72,open,dest={73756273656374696F6E2E332E39},srcline={807}}{5C3337365C3337375C303030335C3030302E5C303030395C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C30303065} -\BKM@entry{id=73,open,dest={73756273756273656374696F6E2E332E392E31},srcline={811}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030315C3030305C3034305C303030425C303030695C303030745C3030305C3034305C303030425C303030755C303030665C303030665C303030655C30303072} -\BKM@entry{id=74,open,dest={73756273756273656374696F6E2E332E392E32},srcline={815}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030325C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030515C303030555C303030495C303030435C30303072} -\BKM@entry{id=75,open,dest={73756273756273656374696F6E2E332E392E33},srcline={819}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030335C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030755C3030305C3034305C303030725C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075} -\BKM@entry{id=76,open,dest={73656374696F6E2E34},srcline={830}}{5C3337365C3337375C303030345C3030305C3034305C303030535C303030745C303030795C3030306C5C303030795C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030705C303030735C303030615C3030306E5C3030305C3335355C3030305C3034305C303030625C303030615C3030306B5C303030615C3030306C5C3030305C3334315C3030315C3133315C303030735C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030615C3030305C3034305C303030645C303030695C303030705C3030306C5C3030306F5C3030306D5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C303030705C303030725C303030615C303030635C3030305C333535} -\BKM@entry{id=77,open,dest={73756273656374696F6E2E342E31},srcline={833}}{5C3337365C3337375C303030345C3030302E5C303030315C3030305C3034305C303030505C3030306F5C3030315C3137365C303030615C303030645C303030615C303030765C3030306B5C303030795C3030305C3034305C303030615C3030305C3034305C303030705C3030306F5C303030645C303030705C303030725C3030306F5C303030765C303030615C3030306E5C3030305C3334315C3030305C3034305C303030705C303030725C3030306F5C303030735C303030745C3030315C3133315C303030655C303030645C3030305C333535} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Sharding}{36}{subsection.3.8}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Komprese}{36}{subsection.3.9}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.1}Bit Buffer}{36}{subsubsection.3.9.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2}Komprese QUICr}{36}{subsubsection.3.9.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.3}Komprese protokolu replikátoru}{36}{subsubsection.3.9.3}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{36}{section.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{36}{subsection.4.1}\protected@file@percent } -\BKM@entry{id=78,open,dest={73756273656374696F6E2E342E32},srcline={855}}{5C3337365C3337375C303030345C3030302E5C303030325C3030305C3034305C303030505C3030315C3133315C303030655C303030705C3030305C3335355C3030306E5C303030615C3030315C3031355C30303065} -\gdef \LT@ii {\LT@entry - {1}{83.40999pt}\LT@entry - {1}{98.16246pt}\LT@entry - {1}{239.62204pt}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Přepínače}{37}{subsection.4.2}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {4}Volání třídy \textbf {kidiplom}}{37}{lstlisting.4}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {2}{Seznam přepínačů}}{37}{table.2}\protected@file@percent } -\newlabel{tab:prepinace}{{2}{37}{Seznam přepínačů}{table.2}{}} -\BKM@entry{id=79,open,dest={73756273656374696F6E2E342E33},srcline={947}}{5C3337365C3337375C303030345C3030302E5C303030335C3030305C3034305C303030475C303030655C3030306F5C3030306D5C303030655C303030745C303030725C303030695C303030655C3030305C3034305C303030735C303030745C303030725C3030305C3334315C3030306E5C3030306B5C30303079} -\BKM@entry{id=80,open,dest={73656374696F6E2E35},srcline={950}}{5C3337365C3337375C303030355C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030315C3031355C3030305C3334315C303030735C303030745C3030305C3335355C3030305C3034305C303030645C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C30303075} -\BKM@entry{id=81,open,dest={73756273656374696F6E2E352E31},srcline={951}}{5C3337365C3337375C303030355C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030305C3337325C303030765C3030306F5C303030645C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C303030795C3030305C3034305C3030315C3031355C303030695C3030305C3034305C3030306F5C303030625C303030735C303030615C303030685C30303075} -\BKM@entry{id=82,open,dest={73756273656374696F6E2E352E32},srcline={954}}{5C3337365C3337375C303030355C3030302E5C303030325C3030305C3034305C3030305A5C3030305C3334315C303030765C3030315C3033335C303030725C30303079} -\BKM@entry{id=83,open,dest={73756273656374696F6E2E352E33},srcline={969}}{5C3337365C3337375C303030355C3030302E5C303030335C3030305C3034305C3030304D5C303030615C303030745C303030655C3030306D5C303030615C303030745C303030695C3030306B5C30303061} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{40}{subsection.4.3}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {5}Sazba částí dokumentu}{40}{section.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{40}{subsection.5.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Závěry}{40}{subsection.5.2}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {5}Sazba závěrů}{40}{lstlisting.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}Matematika}{40}{subsection.5.3}\protected@file@percent } -\BKM@entry{id=84,open,dest={73756273656374696F6E2E352E34},srcline={994}}{5C3337365C3337375C303030355C3030302E5C303030345C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030306C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303079} -\BKM@entry{id=85,open,dest={73756273756273656374696F6E2E352E342E31},srcline={996}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C303030655C3030305C3034305C303030705C3030315C3133315C303030655C303030735C3030305C3034305C303030425C303030695C303030625C3030304C5C303030615C303030545C303030655C30303058} -\BKM@entry{id=86,open,dest={73756273756273656374696F6E2E352E342E32},srcline={1005}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030325C3030305C3034305C3030304D5C303030615C3030306E5C303030755C3030305C3334315C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C30303065} -\BKM@entry{id=87,open,dest={73756273656374696F6E2E352E35},srcline={1010}}{5C3337365C3337375C303030355C3030302E5C303030355C3030305C3034305C303030445C303030725C3030306F5C303030625C3030306E5C3030305C3334315C3030305C3034305C3030306D5C303030615C3030306B5C303030725C30303061} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}Sazba literatury}{41}{subsection.5.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{41}{subsubsection.5.4.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{41}{subsubsection.5.4.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.5}Drobná makra}{41}{subsection.5.5}\protected@file@percent } -\BKM@entry{id=88,open,dest={73756273656374696F6E2E352E36},srcline={1036}}{5C3337365C3337375C303030355C3030302E5C303030365C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030725C303030655C3030306A5C303030735C303030745C3030315C3133315C3030305C3335355C3030306B5C30303075} -\BKM@entry{id=89,open,dest={73756273656374696F6E2E352E37},srcline={1051}}{5C3337365C3337375C303030355C3030302E5C303030375C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030307A5C303030645C303030725C3030306F5C3030306A5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C3030306B5C3030305C3336335C303030645C3030315C313537} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{42}{subsection.5.6}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{42}{subsection.5.7}\protected@file@percent } -\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~4\else \numberline {4}Definice\fi \thmtformatoptarg {Název definice}}{42}{definition.4}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{43}{table.3}\protected@file@percent } -\newlabel{tab:odstavce}{{3}{43}{Odstavce v tabulkách}{table.3}{}} -\@writefile{loe}{\contentsline {proof}{\ifthmt@listswap \else \numberline {\let \autodot \@empty }\fi D\r {u}kaz\thmtformatoptarg {Název důkazu}}{44}{thmt@dummyctr.dummy.5}\protected@file@percent } -\@writefile{loe}{\contentsline {remark}{\ifthmt@listswap Pozn\'{a}mka~5\else \numberline {5}Pozn\'{a}mka\fi \thmtformatoptarg {Pumpovací věta}}{44}{remark.5}\protected@file@percent } -\@writefile{loe}{\contentsline {example}{\ifthmt@listswap P\v {r}\'{i}klad~6\else \numberline {6}P\v {r}\'{i}klad\fi \thmtformatoptarg {Pumpovací věta}}{44}{example.6}\protected@file@percent } -\@writefile{loe}{\contentsline {lemma}{\ifthmt@listswap Lemma~7\else \numberline {7}Lemma\fi \thmtformatoptarg {Název definice}}{44}{lemma.7}\protected@file@percent } -\@writefile{loe}{\contentsline {consequence}{\ifthmt@listswap D\r {u}sledek~8\else \numberline {8}D\r {u}sledek\fi \thmtformatoptarg {Název důkazu}}{44}{consequence.8}\protected@file@percent } -\@writefile{loe}{\contentsline {theorem}{\ifthmt@listswap V\v {e}ta~9\else \numberline {9}V\v {e}ta\fi \thmtformatoptarg {Pumpovací věta}}{44}{theorem.9}\protected@file@percent } -\newlabel{kod:cpp}{{6}{44}{\cpp }{lstlisting.6}{}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {6}C\kern -.05em\raise .38ex\hbox {\scriptsize {++}}}{44}{lstlisting.6}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {7}JS}{44}{lstlisting.7}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {8}C\kern -.03em\raise .38ex\hbox {\scriptsize {\#}}}{45}{lstlisting.8}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {9}SQL}{45}{lstlisting.9}\protected@file@percent } -\@writefile{lol}{\contentsline {lstlisting}{\numberline {10}TutorialD}{45}{lstlisting.10}\protected@file@percent } -\BKM@entry{id=90,open,dest={73656374696F6E2A2E33},srcline={1120}}{5C3337365C3337375C3030305A5C3030305C3334315C303030765C3030315C3033335C30303072} -\@writefile{toc}{\contentsline {section}{Z\'av\v er}{46}{section*.3}\protected@file@percent } +\BKM@entry{id=3,open,dest={6B693A616E6F746174696F6E},srcline={150}}{5C3337365C3337375C303030415C3030306E5C3030306F5C303030745C303030615C303030635C30303065} +\BKM@entry{id=4,open,dest={6B693A746F63},srcline={150}}{5C3337365C3337375C3030304F5C303030625C303030735C303030615C30303068} +\BKM@entry{id=5,open,dest={73656374696F6E2E31},srcline={161}}{5C3337365C3337375C303030315C3030305C3034305C3030305C3333325C303030765C3030306F5C30303064} +\@writefile{toc}{\contentsline {section}{\numberline {1}Úvod}{8}{section.1}\protected@file@percent } +\BKM@entry{id=6,open,dest={73656374696F6E2E32},srcline={203}}{5C3337365C3337375C303030325C3030305C3034305C303030445C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303079} +\BKM@entry{id=7,open,dest={73756273656374696F6E2E322E31},srcline={218}}{5C3337365C3337375C303030325C3030302E5C303030315C3030305C3034305C303030415C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303079} +\BKM@entry{id=8,open,dest={73756273756273656374696F6E2E322E312E31},srcline={224}}{5C3337365C3337375C303030325C3030302E5C303030315C3030302E5C303030315C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C3030306F5C303030765C3030305C3334315C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061} +\@writefile{toc}{\contentsline {section}{\numberline {2}Distribuované systémy}{9}{section.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Architektury}{9}{subsection.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.1}Softwarová architektura}{9}{subsubsection.2.1.1}\protected@file@percent } +\BKM@entry{id=9,open,dest={73756273756273656374696F6E2E322E312E32},srcline={238}}{5C3337365C3337375C303030325C3030302E5C303030315C3030302E5C303030325C3030305C3034305C303030535C303030795C303030735C303030745C3030305C3335315C3030306D5C3030306F5C303030765C3030305C3335315C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303079} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.1.2}Systémové architektury}{10}{subsubsection.2.1.2}\protected@file@percent } +\newlabel{sec:system_architecture}{{2.1.2}{10}{Systémové architektury}{subsubsection.2.1.2}{}} +\BKM@entry{id=10,open,dest={73756273656374696F6E2E322E32},srcline={253}}{5C3337365C3337375C303030325C3030302E5C303030325C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C30303065} +\BKM@entry{id=11,open,dest={73756273756273656374696F6E2E322E322E31},srcline={266}}{5C3337365C3337375C303030325C3030302E5C303030325C3030302E5C303030315C3030305C3034305C3030304D5C3030306F5C303030645C303030655C3030306C5C303030795C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C3030306B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C30303069} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Komunikace}{11}{subsection.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.2.1}Modely pro komunikaci}{11}{subsubsection.2.2.1}\protected@file@percent } +\BKM@entry{id=12,open,dest={73756273656374696F6E2E322E33},srcline={288}}{5C3337365C3337375C303030325C3030302E5C303030335C3030305C3034305C303030505C3030306F5C3030315C3031355C3030305C3335355C303030745C303030615C3030315C3031355C3030306F5C303030765C3030305C3334315C3030305C3034305C303030535C3030305C3335355C3030315C313435} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Počítačová Síť}{12}{subsection.2.3}\protected@file@percent } +\newlabel{sec:NetworkCommunication}{{2.3}{12}{Počítačová Síť}{subsection.2.3}{}} +\BKM@entry{id=13,open,dest={73756273656374696F6E2E322E34},srcline={296}}{5C3337365C3337375C303030325C3030302E5C303030345C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C303030655C3030305C3034305C303030765C3030305C3034305C303030735C3030305C3335355C303030745C30303069} +\BKM@entry{id=14,open,dest={73756273756273656374696F6E2E322E342E31},srcline={302}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030525C3030306F5C303030645C303030695C3030306E5C303030615C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030315C3135375C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Komunikace v síti}{13}{subsection.2.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}Rodina protokolů TCP/IP}{13}{subsubsection.2.4.1}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Vrstvená architektura TODO předělat}}{14}{figure.1}\protected@file@percent } +\newlabel{fig:layer_architecture}{{1}{14}{Vrstvená architektura TODO předělat}{figure.1}{}} +\BKM@entry{id=15,open,dest={73756273656374696F6E2E322E35},srcline={349}}{5C3337365C3337375C303030325C3030302E5C303030355C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030615C303030705C3030306C5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333} +\BKM@entry{id=16,open,dest={73756273756273656374696F6E2E322E352E31},srcline={353}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030485C303030545C303030545C30303050} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Komunikace vrstev TCP/IP}}{15}{figure.2}\protected@file@percent } +\newlabel{fig:tcpip}{{2}{15}{Komunikace vrstev TCP/IP}{figure.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Protokoly v aplikační vrstvě}{15}{subsection.2.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.1}HTTP}{15}{subsubsection.2.5.1}\protected@file@percent } +\BKM@entry{id=17,open,dest={73756273756273656374696F6E2E322E352E32},srcline={374}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030485C303030545C303030545C303030505C3030302F5C30303033} +\BKM@entry{id=18,open,dest={73756273656374696F6E2E322E36},srcline={400}}{5C3337365C3337375C303030325C3030302E5C303030365C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030745C303030725C303030615C3030306E5C303030735C303030705C3030306F5C303030725C303030745C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.2}HTTP/3}{16}{subsubsection.2.5.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.6}Protokoly v transportní vrstvě}{16}{subsection.2.6}\protected@file@percent } +\BKM@entry{id=19,open,dest={73756273756273656374696F6E2E322E362E31},srcline={406}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030315C3030305C3034305C303030545C303030435C30303050} +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Vizualizace HTTP/2 blokování}}{17}{figure.3}\protected@file@percent } +\newlabel{fig:http_blocking}{{3}{17}{Vizualizace HTTP/2 blokování}{figure.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.1}TCP}{17}{subsubsection.2.6.1}\protected@file@percent } +\BKM@entry{id=20,open,dest={73756273756273656374696F6E2E322E362E32},srcline={418}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030555C303030445C30303050} +\BKM@entry{id=21,open,dest={73756273756273656374696F6E2E322E362E33},srcline={424}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030515C303030555C303030495C30303043} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.2}UDP}{18}{subsubsection.2.6.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.3}QUIC}{18}{subsubsection.2.6.3}\protected@file@percent } +\BKM@entry{id=22,open,dest={73756273656374696F6E2E322E37},srcline={468}}{5C3337365C3337375C303030325C3030302E5C303030375C3030305C3034305C303030535C3030306F5C3030306B5C303030655C303030745C30303079} +\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces QUIC handshake}}{20}{figure.4}\protected@file@percent } +\newlabel{fig:quic_handshake}{{4}{20}{QUIC handshake}{figure.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.7}Sokety}{20}{subsection.2.7}\protected@file@percent } +\BKM@entry{id=23,open,dest={73756273656374696F6E2E322E38},srcline={474}}{5C3337365C3337375C303030325C3030302E5C303030385C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C3030305C3335355C3030305C3034305C303030765C303030735C303030745C303030755C303030705C3030306E5C3030315C3033335C3030305C3034305C303030765C3030305C3337355C303030735C303030745C303030755C303030705C3030306E5C3030305C3335355C3030305C3034305C3030306F5C303030705C303030655C303030725C303030615C303030635C30303065} +\BKM@entry{id=24,open,dest={73756273756273656374696F6E2E322E382E31},srcline={480}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030315C3030305C3034305C3030305A5C303030655C303030725C3030306F5C3030304D5C30303051} +\BKM@entry{id=25,open,dest={73756273756273656374696F6E2E322E382E32},srcline={486}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030325C3030305C3034305C303030575C3030306F5C303030725C3030306B5C3030305C3034305C303030735C303030745C303030655C303030615C3030306C5C303030695C3030306E5C30303067} +\BKM@entry{id=26,open,dest={73756273756273656374696F6E2E322E382E33},srcline={490}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030335C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C3030302F5C303030415C303030775C303030615C303030695C30303074} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.8}Asynchroní vstupně výstupní operace}{21}{subsection.2.8}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{21}{subsubsection.2.8.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{21}{subsubsection.2.8.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{21}{subsubsection.2.8.3}\protected@file@percent } +\BKM@entry{id=27,open,dest={73756273756273656374696F6E2E322E382E34},srcline={499}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030345C3030305C3034305C303030425C3030306F5C3030306F5C303030735C303030745C3030305C3034305C303030415C303030735C303030695C3030306F} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{22}{subsubsection.2.8.4}\protected@file@percent } +\BKM@entry{id=28,open,dest={73656374696F6E2E33},srcline={567}}{5C3337365C3337375C303030335C3030305C3034305C303030485C303030725C30303061} +\BKM@entry{id=29,open,dest={73756273656374696F6E2E332E31},srcline={583}}{5C3337365C3337375C303030335C3030302E5C303030315C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C3030306F5C303030765C3030305C3334315C3030305C3034305C303030415C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061} +\BKM@entry{id=30,open,dest={73756273756273656374696F6E2E332E312E31},srcline={601}}{5C3337365C3337375C303030335C3030302E5C303030315C3030302E5C303030315C3030305C3034305C303030455C3030306E5C303030745C303030695C303030745C303030795C3030302D5C303030435C3030306F5C3030306D5C303030705C3030306F5C3030306E5C303030655C3030306E5C303030745C3030302D5C303030535C303030795C303030735C303030745C303030655C3030306D} +\@writefile{toc}{\contentsline {section}{\numberline {3}Hra}{23}{section.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Softwarová Architektura}{23}{subsection.3.1}\protected@file@percent } +\BKM@entry{id=31,open,dest={73756273656374696F6E2E332E32},srcline={615}}{5C3337365C3337375C303030335C3030302E5C303030325C3030305C3034305C303030455C3030306E5C303030675C303030695C3030306E5C30303065} +\BKM@entry{id=32,open,dest={73756273756273656374696F6E2E332E322E31},srcline={619}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030315C3030305C3034305C303030465C303030795C3030307A5C303030695C303030635C3030306B5C3030305C3337355C3030305C3034305C303030655C3030306E5C303030675C303030695C3030306E5C30303065} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}Entity-Component-System}{24}{subsubsection.3.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Engine}{24}{subsection.3.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}Fyzický engine}{24}{subsubsection.3.2.1}\protected@file@percent } +\BKM@entry{id=33,open,dest={73756273756273656374696F6E2E332E322E32},srcline={627}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030325C3030305C3034305C303030565C303030795C3030306B5C303030725C303030655C303030735C3030306C5C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535} +\BKM@entry{id=34,open,dest={73756273756273656374696F6E2E332E322E33},srcline={635}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030335C3030305C3034305C303030455C3030306E5C303030745C30303074} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}Vykreslování}{25}{subsubsection.3.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.3}Entt}{25}{subsubsection.3.2.3}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}Příklad použití knihovny Entt}{25}{lstlisting.1}\protected@file@percent } +\BKM@entry{id=35,open,dest={73756273756273656374696F6E2E332E322E34},srcline={678}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030345C3030305C3034305C303030535C303030745C303030615C303030765C3030305C3034305C303030685C303030725C30303079} +\BKM@entry{id=36,open,dest={73756273656374696F6E2E332E33},srcline={687}}{5C3337365C3337375C303030335C3030302E5C303030335C3030305C3034305C303030485C303030725C303030615C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.4}Stav hry}{26}{subsubsection.3.2.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Hra více hráčů}{26}{subsection.3.3}\protected@file@percent } +\BKM@entry{id=37,open,dest={73756273656374696F6E2E332E34},srcline={695}}{5C3337365C3337375C303030335C3030302E5C303030345C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C303030725C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061} +\BKM@entry{id=38,open,dest={73756273656374696F6E2E332E35},srcline={709}}{5C3337365C3337375C303030335C3030302E5C303030355C3030305C3034305C303030535C303030655C303030725C303030765C303030655C30303072} +\BKM@entry{id=39,open,dest={73756273756273656374696F6E2E332E352E31},srcline={719}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030525C303030655C303030675C303030695C303030735C303030745C303030725C3030305C3034305C3030306B5C3030306C5C303030695C303030655C3030306E5C303030745C3030315C313537} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Klient-Server architektura}{27}{subsection.3.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Server}{27}{subsection.3.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.1}Registr klientů}{27}{subsubsection.3.5.1}\protected@file@percent } +\BKM@entry{id=40,open,dest={73756273756273656374696F6E2E332E352E32},srcline={725}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030535C303030655C303030725C303030765C303030655C303030725C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075} +\BKM@entry{id=41,open,dest={73756273756273656374696F6E2E332E352E33},srcline={729}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030535C303030705C303030725C3030305C3334315C303030765C303030615C3030305C3034305C3030307A5C3030305C3334315C3030306A5C3030306D5C3030315C313537} +\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces Softwarová architektura hry}}{28}{figure.5}\protected@file@percent } +\newlabel{fig:client_server_architecture}{{5}{28}{Softwarová architektura hry}{figure.5}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.2}Server Replikátoru}{28}{subsubsection.3.5.2}\protected@file@percent } +\BKM@entry{id=42,open,dest={73756273656374696F6E2E332E36},srcline={739}}{5C3337365C3337375C303030335C3030302E5C303030365C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C30303074} +\BKM@entry{id=43,open,dest={73756273756273656374696F6E2E332E362E31},srcline={743}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030315C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075} +\BKM@entry{id=44,open,dest={73756273756273656374696F6E2E332E362E32},srcline={747}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030705C3030306F5C3030306C5C303030615C303030635C30303065} +\BKM@entry{id=45,open,dest={73756273756273656374696F6E2E332E362E33},srcline={751}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030525C3030306F5C3030306C5C3030306C5C303030625C303030615C303030635C3030306B} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.3}Správa zájmů}{29}{subsubsection.3.5.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Klient}{29}{subsection.3.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.1}Klient Replikátoru}{29}{subsubsection.3.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.2}Interpolace}{29}{subsubsection.3.6.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.3}Rollback}{29}{subsubsection.3.6.3}\protected@file@percent } +\BKM@entry{id=46,open,dest={73756273656374696F6E2E332E37},srcline={760}}{5C3337365C3337375C303030335C3030302E5C303030375C3030305C3034305C303030505C3030306F5C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076} +\BKM@entry{id=47,open,dest={73756273756273656374696F6E2E332E372E31},srcline={769}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C3030305C3034305C3030304B5C3030305C3336335C303030645C3030306F5C303030765C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076} +\BKM@entry{id=48,open,dest={73756273756273656374696F6E2E332E372E32},srcline={777}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030325C3030305C3034305C303030495C3030306D5C303030705C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C303030615C303030635C30303065} +\BKM@entry{id=49,open,dest={73756273756273656374696F6E2E332E372E33},srcline={781}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030445C303030655C303030745C303030655C3030306B5C303030635C303030655C3030305C3034305C303030615C3030305C3034305C3030306E5C3030305C3334315C303030705C303030725C303030615C303030765C303030615C3030305C3034305C303030635C303030685C303030795C30303062} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Posílání zpráv}{30}{subsection.3.7}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}Kódování zpráv}{30}{subsubsection.3.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2}Implementace}{30}{subsubsection.3.7.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.3}Detekce a náprava chyb}{30}{subsubsection.3.7.3}\protected@file@percent } +\BKM@entry{id=50,open,dest={73756273656374696F6E2E332E38},srcline={788}}{5C3337365C3337375C303030335C3030302E5C303030385C3030305C3034305C303030535C303030655C303030725C303030695C303030615C3030306C5C303030695C3030307A5C303030615C303030635C30303065} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Serializace}{31}{subsection.3.8}\protected@file@percent } +\BKM@entry{id=51,open,dest={73756273656374696F6E2E332E39},srcline={816}}{5C3337365C3337375C303030335C3030302E5C303030395C3030305C3034305C3030304D5C303030655C303030745C303030725C303030695C3030306B5C30303079} +\BKM@entry{id=52,open,dest={73756273756273656374696F6E2E332E392E31},srcline={820}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030315C3030305C3034305C303030505C3030306F5C303030735C303030745C303030675C303030725C303030655C303030535C303030515C3030304C} +\BKM@entry{id=53,open,dest={73756273756273656374696F6E2E332E392E32},srcline={824}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030325C3030305C3034305C303030545C303030695C3030306D5C303030655C303030735C303030635C303030615C3030306C5C303030655C303030445C30303042} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}cpp}{32}{lstlisting.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Metriky}{32}{subsection.3.9}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.1}PostgreSQL}{32}{subsubsection.3.9.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2}TimescaleDB}{32}{subsubsection.3.9.2}\protected@file@percent } +\BKM@entry{id=54,open,dest={73756273756273656374696F6E2E332E392E33},srcline={828}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030335C3030305C3034305C303030475C303030725C303030615C303030665C303030615C3030306E5C30303061} +\BKM@entry{id=55,open,dest={73756273756273656374696F6E2E332E392E34},srcline={840}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030345C3030305C3034305C3030304F5C303030725C303030635C303030685C303030655C303030735C303030745C303030725C303030615C303030635C30303065} +\BKM@entry{id=56,open,dest={73756273756273656374696F6E2E332E392E35},srcline={846}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030355C3030305C3034305C303030495C3030306D5C303030475C303030755C30303069} +\BKM@entry{id=57,open,dest={73756273756273656374696F6E2E332E392E36},srcline={852}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030365C3030305C3034305C303030545C303030725C303030615C303030635C30303079} +\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces Příklad Grafana dashboardu}}{33}{figure.6}\protected@file@percent } +\newlabel{fig:grafana}{{6}{33}{Příklad Grafana dashboardu}{figure.6}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.3}Grafana}{33}{subsubsection.3.9.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.4}Orchestrace}{33}{subsubsection.3.9.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.5}ImGui}{33}{subsubsection.3.9.5}\protected@file@percent } +\BKM@entry{id=58,open,dest={73756273756273656374696F6E2E332E392E37},srcline={866}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030375C3030305C3034305C3030304B5C3030306F5C3030306E5C3030306B5C303030725C3030305C3335315C303030745C3030306E5C3030305C3335355C3030305C3034305C3030306D5C303030655C303030745C303030725C303030695C3030306B5C30303079} +\BKM@entry{id=59,open,dest={73756273756273656374696F6E2E332E392E38},srcline={882}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030385C3030305C3034305C303030535C303030625C3030305C3335355C303030725C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C303030765C3030305C3034305C303030725C303030655C3030305C3334315C3030306C5C3030306E5C3030305C3335315C3030306D5C3030305C3034305C3030315C3031355C303030615C303030735C30303065} +\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces Jeden snímek v Tracy}}{34}{figure.7}\protected@file@percent } +\newlabel{fig:frame_in_tracy}{{7}{34}{Jeden snímek v Tracy}{figure.7}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.6}Tracy}{34}{subsubsection.3.9.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.7}Konkrétní metriky}{34}{subsubsection.3.9.7}\protected@file@percent } +\BKM@entry{id=60,open,dest={73756273656374696F6E2E332E3130},srcline={892}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030305C3034305C303030515C303030555C303030495C303030435C30303072} +\BKM@entry{id=61,open,dest={73756273756273656374696F6E2E332E31302E31},srcline={902}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030315C3030305C3034305C303030525C3030305C3334315C3030306D5C303030655C30303063} +\BKM@entry{id=62,open,dest={73756273756273656374696F6E2E332E31302E32},srcline={913}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030325C3030305C3034305C303030485C303030615C3030306E5C303030645C303030735C303030685C303030615C3030306B5C30303065} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.8}Sbírání v reálném čase}{35}{subsubsection.3.9.8}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.10}Protokol QUICr}{35}{subsection.3.10}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.1}Rámec}{35}{subsubsection.3.10.1}\protected@file@percent } +\BKM@entry{id=63,open,dest={73756273756273656374696F6E2E332E31302E33},srcline={947}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.2}Handshake}{36}{subsubsection.3.10.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.3}Spolehlivost}{36}{subsubsection.3.10.3}\protected@file@percent } +\newlabel{sec:quicr_reliability}{{3.10.3}{36}{Spolehlivost}{subsubsection.3.10.3}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces Stavový stroj QUICr handshake}}{37}{figure.8}\protected@file@percent } +\newlabel{fig:quicr_handshake}{{8}{37}{Stavový stroj QUICr handshake}{figure.8}{}} +\BKM@entry{id=64,open,dest={73756273756273656374696F6E2E332E31302E34},srcline={969}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030345C3030305C3034305C303030455C3030306E5C3030306B5C3030306F5C303030645C3030305C3335315C30303072} +\BKM@entry{id=65,open,dest={73756273756273656374696F6E2E332E31302E35},srcline={976}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030355C3030305C3034305C303030545C303030655C303030735C303030745C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.4}Enkodér}{38}{subsubsection.3.10.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.5}Testování}{38}{subsubsection.3.10.5}\protected@file@percent } +\BKM@entry{id=66,open,dest={73756273756273656374696F6E2E332E31302E36},srcline={983}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030302E5C303030365C3030305C3034305C3030304D5C3030315C3033335C3030315C3133315C303030655C3030306E5C3030305C333535} +\BKM@entry{id=67,open,dest={73756273656374696F6E2E332E3131},srcline={1034}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C303030725C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.6}Měření}{39}{subsubsection.3.10.6}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {3}Příklad volání TC}{39}{lstlisting.3}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces Porovnání odezvy TCP a QUICr}}{40}{figure.9}\protected@file@percent } +\newlabel{fig:latencycomparison}{{9}{40}{Porovnání odezvy TCP a QUICr}{figure.9}{}} +\newlabel{fig:integrationcomparison}{{3.10.6}{40}{Měření}{figure.9}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces Porovnání integrace TCP a QUICr}}{40}{figure.10}\protected@file@percent } +\newlabel{fig:playerbenchmark}{{3.10.6}{41}{Měření}{figure.10}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces 301 připojených hráčů}}{41}{figure.11}\protected@file@percent } +\newlabel{fig:tracyreplicator}{{3.11}{41}{Optimalizace replikátoru}{subsection.3.11}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces Analýza replikátoru}}{41}{figure.12}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.11}Optimalizace replikátoru}{41}{subsection.3.11}\protected@file@percent } +\newlabel{fig:ecs_optimization_tracy_01}{{3.11}{42}{Optimalizace replikátoru}{figure.12}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces Analýza optimalizace replikátoru pro ECS}}{42}{figure.13}\protected@file@percent } +\newlabel{fig:ecs_optimization_tracy_02}{{3.11}{42}{Optimalizace replikátoru}{figure.13}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces Analýza optimalizace replikátoru pro ECS}}{42}{figure.14}\protected@file@percent } +\BKM@entry{id=68,open,dest={73756273656374696F6E2E332E3132},srcline={1087}}{5C3337365C3337375C303030335C3030302E5C303030315C303030325C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C3030306D5C303030615C3030306E5C303030615C3030315C3137365C303030655C303030725C303030615C3030305C3034305C3030307A5C3030305C3334315C3030306A5C3030306D5C3030315C313537} +\BKM@entry{id=69,open,dest={73756273756273656374696F6E2E332E31322E31},srcline={1130}}{5C3337365C3337375C303030335C3030302E5C303030315C303030325C3030302E5C303030315C3030305C3034305C303030435C3030306F5C3030306E5C303030675C303030655C303030735C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C} +\BKM@entry{id=70,open,dest={73756273756273656374696F6E2E332E31322E32},srcline={1132}}{5C3337365C3337375C303030335C3030302E5C303030315C303030325C3030302E5C303030325C3030305C3034305C303030425C303030615C3030306E5C303030645C303030775C303030695C303030645C303030745C303030685C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C} +\newlabel{table:serialization_comparison}{{3.11}{43}{Optimalizace replikátoru}{figure.14}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces Porovnání serializátorů}}{43}{figure.15}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.12}Optimalizace manažera zájmů}{43}{subsection.3.12}\protected@file@percent } +\BKM@entry{id=71,open,dest={73756273656374696F6E2E332E3133},srcline={1136}}{5C3337365C3337375C303030335C3030302E5C303030315C303030335C3030305C3034305C303030535C303030685C303030615C303030725C303030645C303030695C3030306E5C30303067} +\BKM@entry{id=72,open,dest={73756273656374696F6E2E332E3134},srcline={1140}}{5C3337365C3337375C303030335C3030302E5C303030315C303030345C3030305C3034305C303030485C3030306F5C303030725C303030695C3030307A5C3030306F5C3030306E5C303030745C3030305C3334315C3030306C5C3030306E5C3030305C3335355C3030305C3034305C3030315C3134315C3030306B5C3030305C3334315C3030306C5C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535} +\newlabel{table:range_query_comparison}{{3.12}{44}{Optimalizace manažera zájmů}{subsection.3.12}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces Porovnání algoritmů}}{44}{figure.16}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.12.1}Congestion control}{44}{subsubsection.3.12.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.12.2}Bandwidth control}{44}{subsubsection.3.12.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.13}Sharding}{44}{subsection.3.13}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.14}Horizontální škálování}{44}{subsection.3.14}\protected@file@percent } +\BKM@entry{id=73,open,dest={73756273656374696F6E2E332E3135},srcline={1158}}{5C3337365C3337375C303030335C3030302E5C303030315C303030355C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C30303065} +\newlabel{fig:zone_cluster_architecture}{{3.14}{45}{Horizontální škálování}{subsection.3.14}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces Architektura systému s zone clusterem}}{45}{figure.17}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.15}Komprese}{45}{subsection.3.15}\protected@file@percent } +\BKM@entry{id=74,open,dest={73756273756273656374696F6E2E332E31352E31},srcline={1162}}{5C3337365C3337375C303030335C3030302E5C303030315C303030355C3030302E5C303030315C3030305C3034305C303030425C303030695C303030745C3030305C3034305C303030425C303030755C303030665C303030665C303030655C30303072} +\BKM@entry{id=75,open,dest={73756273656374696F6E2E332E3136},srcline={1168}}{5C3337365C3337375C303030335C3030302E5C303030315C303030365C3030305C3034305C3030305A5C3030305C3334315C303030765C3030315C3033335C303030725C30303079} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.15.1}Bit Buffer}{46}{subsubsection.3.15.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.16}Závěry}{46}{subsection.3.16}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {4}Sazba závěrů}{46}{lstlisting.4}\protected@file@percent } +\BKM@entry{id=76,open,dest={73656374696F6E2A2E33},srcline={1189}}{5C3337365C3337375C3030305A5C3030305C3334315C303030765C3030315C3033335C30303072} +\@writefile{toc}{\contentsline {section}{Z\'av\v er}{47}{section*.3}\protected@file@percent } \babel@aux{czech}{} \babel@aux{czech}{} -\BKM@entry{id=91,open,dest={73656374696F6E2A2E35},srcline={1123}}{5C3337365C3337375C303030435C3030306F5C3030306E5C303030635C3030306C5C303030755C303030735C303030695C3030306F5C3030306E5C30303073} -\@writefile{toc}{\contentsline {section}{Conclusions}{47}{section*.5}\protected@file@percent } +\BKM@entry{id=77,open,dest={73656374696F6E2A2E35},srcline={1192}}{5C3337365C3337375C303030435C3030306F5C3030306E5C303030635C3030306C5C303030755C303030735C303030695C3030306F5C3030306E5C30303073} +\@writefile{toc}{\contentsline {section}{Conclusions}{48}{section*.5}\protected@file@percent } \babel@aux{english}{} \babel@aux{czech}{} -\BKM@entry{id=92,open,dest={617070656E6469782E41},srcline={1130}}{5C3337365C3337375C303030415C3030305C3034305C303030505C303030725C303030765C3030306E5C3030305C3335355C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061} -\BKM@entry{id=93,open,dest={617070656E6469782E42},srcline={1133}}{5C3337365C3337375C303030425C3030305C3034305C303030445C303030725C303030755C303030685C3030305C3334315C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061} -\BKM@entry{id=94,open,dest={617070656E6469782E43},srcline={1138}}{5C3337365C3337375C303030435C3030305C3034305C3030304F5C303030625C303030735C303030615C303030685C3030305C3034305C303030655C3030306C5C303030655C3030306B5C303030745C303030725C3030306F5C3030306E5C303030695C303030635C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030645C303030615C30303074} -\@writefile{toc}{\contentsline {section}{\numberline {A}První příloha}{48}{appendix.A}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {B}Druhá příloha}{48}{appendix.B}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {C}Obsah elektronických dat}{48}{appendix.C}\protected@file@percent } -\newlabel{sec:ObsahData}{{C}{48}{Obsah elektronických dat}{appendix.C}{}} -\BKM@entry{id=95,open,dest={73656374696F6E2A2E37},srcline={1205}}{5C3337365C3337375C303030535C303030655C3030307A5C3030306E5C303030615C3030306D5C3030305C3034305C3030307A5C3030306B5C303030725C303030615C303030745C303030655C3030306B} +\BKM@entry{id=78,open,dest={617070656E6469782E41},srcline={1199}}{5C3337365C3337375C303030415C3030305C3034305C303030505C303030725C303030765C3030306E5C3030305C3335355C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061} +\BKM@entry{id=79,open,dest={617070656E6469782E42},srcline={1202}}{5C3337365C3337375C303030425C3030305C3034305C303030445C303030725C303030755C303030685C3030305C3334315C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061} +\BKM@entry{id=80,open,dest={617070656E6469782E43},srcline={1207}}{5C3337365C3337375C303030435C3030305C3034305C3030304F5C303030625C303030735C303030615C303030685C3030305C3034305C303030655C3030306C5C303030655C3030306B5C303030745C303030725C3030306F5C3030306E5C303030695C303030635C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030645C303030615C30303074} +\@writefile{toc}{\contentsline {section}{\numberline {A}První příloha}{49}{appendix.A}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {B}Druhá příloha}{49}{appendix.B}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {C}Obsah elektronických dat}{49}{appendix.C}\protected@file@percent } +\newlabel{sec:ObsahData}{{C}{49}{Obsah elektronických dat}{appendix.C}{}} +\BKM@entry{id=81,open,dest={73656374696F6E2A2E37},srcline={1274}}{5C3337365C3337375C303030535C303030655C3030307A5C3030306E5C303030615C3030306D5C3030305C3034305C3030307A5C3030306B5C303030725C303030615C303030745C303030655C3030306B} \abx@aux@nociteall -\@writefile{toc}{\contentsline {section}{Seznam zkratek}{50}{section*.7}\protected@file@percent } -\BKM@entry{id=96,open,dest={73656374696F6E2A2E38},srcline={1215}}{5C3337365C3337375C3030304C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303061} -\abx@aux@read@bbl@mdfivesum{D41D8CD98F00B204E9800998ECF8427E} +\@writefile{toc}{\contentsline {section}{Seznam zkratek}{51}{section*.7}\protected@file@percent } +\BKM@entry{id=82,open,dest={73656374696F6E2A2E38},srcline={1284}}{5C3337365C3337375C3030304C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303061} +\abx@aux@read@bbl@mdfivesum{nobblfile} \abx@aux@read@bblrerun -\newlabel{LastPage}{{C}{50}{Obsah elektronických dat}{page.50}{}} -\gdef\lastpage@lastpage{50} -\gdef\lastpage@lastpageHy{50} -\gdef \@abspage@last{50} +\newlabel{LastPage}{{C}{51}{Obsah elektronických dat}{page.51}{}} +\gdef\lastpage@lastpage{51} +\gdef\lastpage@lastpageHy{51} +\gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{\m@ne }} +\gdef \@abspage@last{51} diff --git a/kidiplom.bbl b/kidiplom.bbl-SAVE-ERROR similarity index 100% rename from kidiplom.bbl rename to kidiplom.bbl-SAVE-ERROR diff --git a/kidiplom.bcf-SAVE-ERROR b/kidiplom.bcf-SAVE-ERROR new file mode 100644 index 0000000..3c4de35 --- /dev/null +++ b/kidiplom.bcf-SAVE-ERROR @@ -0,0 +1,2159 @@ + + + + + + output_encoding + utf8 + + + input_encoding + utf8 + + + debug + 0 + + + mincrossrefs + 2 + + + minxrefs + 2 + + + sortcase + 1 + + + sortupper + 1 + + + + + + + alphaothers + + + + + extradatecontext + labelname + labeltitle + + + labelalpha + 0 + + + labelnamespec + shortauthor + author + shorteditor + editor + translator + + + labeltitle + 0 + + + labeltitlespec + shorttitle + title + maintitle + + + labeltitleyear + 0 + + + labeldateparts + 0 + + + labeldatespec + date + year + eventdate + origdate + urldate + nodate + + + julian + 0 + + + gregorianstart + 1582-10-15 + + + maxalphanames + 3 + + + maxbibnames + 5 + + + maxcitenames + 5 + + + maxsortnames + 5 + + + maxitems + 3 + + + minalphanames + 1 + + + minbibnames + 3 + + + mincitenames + 3 + + + minsortnames + 3 + + + minitems + 1 + + + nohashothers + 0 + + + noroman + 0 + + + nosortothers + 0 + + + pluralothers + 0 + + + singletitle + 0 + + + skipbib + 0 + + + skipbiblist + 0 + + + skiplab + 0 + + + sortalphaothers + + + + + sortlocale + cs_CZ + + + sortingtemplatename + none + + + sortsets + 0 + + + uniquelist + false + + + uniquename + false + + + uniqueprimaryauthor + 0 + + + uniquetitle + 0 + + + uniquebaretitle + 0 + + + uniquework + 0 + + + useprefix + 0 + + + useafterword + 1 + + + useannotator + 1 + + + useauthor + 1 + + + usebookauthor + 1 + + + usecommentator + 1 + + + useeditor + 1 + + + useeditora + 1 + + + useeditorb + 1 + + + useeditorc + 1 + + + useforeword + 1 + + + useholder + 1 + + + useintroduction + 1 + + + usenamea + 1 + + + usenameb + 1 + + + usenamec + 1 + + + usetranslator + 0 + + + useshortauthor + 1 + + + useshorteditor + 1 + + + usesupervisor + 1 + + + + + datamodel + labelalphanametemplate + labelalphatemplate + inheritance + translit + uniquenametemplate + namehashtemplate + sortingnamekeytemplate + sortingtemplate + extradatespec + extradatecontext + labelnamespec + labeltitlespec + labeldatespec + controlversion + alphaothers + sortalphaothers + presort + citepagerange + texencoding + bibencoding + sortingtemplatename + sortlocale + language + autolang + langhook + indexing + hyperref + backrefsetstyle + block + pagetracker + citecounter + citetracker + ibidtracker + idemtracker + opcittracker + loccittracker + labeldate + labeltime + dateera + date + time + eventdate + eventtime + origdate + origtime + urldate + urltime + alldatesusetime + alldates + alltimes + gregorianstart + autocite + notetype + uniquelist + uniquename + refsection + refsegment + citereset + sortlos + babel + datelabel + backrefstyle + arxiv + familyinits + giveninits + prefixinits + suffixinits + useafterword + useannotator + useauthor + usebookauthor + usecommentator + useeditor + useeditora + useeditorb + useeditorc + useforeword + useholder + useintroduction + usenamea + usenameb + usenamec + usetranslator + useshortauthor + useshorteditor + usesupervisor + debug + loadfiles + safeinputenc + sortcase + sortupper + terseinits + abbreviate + dateabbrev + clearlang + sortcites + sortsets + backref + backreffloats + trackfloats + parentracker + labeldateusetime + datecirca + dateuncertain + dateusetime + eventdateusetime + origdateusetime + urldateusetime + julian + datezeros + timezeros + timezones + seconds + autopunct + punctfont + labelnumber + labelalpha + labeltitle + labeltitleyear + labeldateparts + pluralothers + nohashothers + nosortothers + noroman + singletitle + uniquetitle + uniquebaretitle + uniquework + uniqueprimaryauthor + defernumbers + locallabelwidth + bibwarn + useprefix + skipbib + skipbiblist + skiplab + dataonly + defernums + firstinits + sortfirstinits + sortgiveninits + labelyear + spacecolon + bibtexcaseprotection + mincrossrefs + minxrefs + maxnames + minnames + maxbibnames + minbibnames + maxcitenames + mincitenames + maxsortnames + minsortnames + maxitems + minitems + maxalphanames + minalphanames + maxparens + dateeraauto + + + alphaothers + sortalphaothers + presort + indexing + citetracker + ibidtracker + idemtracker + opcittracker + loccittracker + uniquelist + uniquename + familyinits + giveninits + prefixinits + suffixinits + useafterword + useannotator + useauthor + usebookauthor + usecommentator + useeditor + useeditora + useeditorb + useeditorc + useforeword + useholder + useintroduction + usenamea + usenameb + usenamec + usetranslator + useshortauthor + useshorteditor + usesupervisor + terseinits + abbreviate + dateabbrev + clearlang + labelnumber + labelalpha + labeltitle + labeltitleyear + labeldateparts + nohashothers + nosortothers + noroman + singletitle + uniquetitle + uniquebaretitle + uniquework + uniqueprimaryauthor + useprefix + skipbib + skipbiblist + skiplab + dataonly + skiplos + labelyear + bibtexcaseprotection + labelalphatemplate + translit + sortexclusion + sortinclusion + extradatecontext + labelnamespec + labeltitlespec + labeldatespec + maxnames + minnames + maxbibnames + minbibnames + maxcitenames + mincitenames + maxsortnames + minsortnames + maxitems + minitems + maxalphanames + minalphanames + + + noinherit + nametemplates + labelalphanametemplatename + uniquenametemplatename + namehashtemplatename + sortingnamekeytemplatename + presort + indexing + citetracker + ibidtracker + idemtracker + opcittracker + loccittracker + uniquelist + uniquename + familyinits + giveninits + prefixinits + suffixinits + useafterword + useannotator + useauthor + usebookauthor + usecommentator + useeditor + useeditora + useeditorb + useeditorc + useforeword + useholder + useintroduction + usenamea + usenameb + usenamec + usetranslator + useshortauthor + useshorteditor + usesupervisor + terseinits + abbreviate + dateabbrev + clearlang + labelnumber + labelalpha + labeltitle + labeltitleyear + labeldateparts + nohashothers + nosortothers + noroman + singletitle + uniquetitle + uniquebaretitle + uniquework + uniqueprimaryauthor + useprefix + skipbib + skipbiblist + skiplab + dataonly + skiplos + bibtexcaseprotection + maxnames + minnames + maxbibnames + minbibnames + maxcitenames + mincitenames + maxsortnames + minsortnames + maxitems + minitems + maxalphanames + minalphanames + + + nametemplates + labelalphanametemplatename + uniquenametemplatename + namehashtemplatename + sortingnamekeytemplatename + uniquelist + uniquename + familyinits + giveninits + prefixinits + suffixinits + terseinits + nohashothers + nosortothers + useprefix + + + nametemplates + labelalphanametemplatename + uniquenametemplatename + namehashtemplatename + sortingnamekeytemplatename + uniquename + familyinits + giveninits + prefixinits + suffixinits + terseinits + useprefix + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + prefix + family + + + + + shorthand + label + labelname + labelname + + + year + + + + + + labelyear + year + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + prefix + family + given + + + + family + given + prefix + suffix + + + + + prefix + family + + + given + + + suffix + + + prefix + + + mm + + + + sf,sm,sn,pf,pm,pn,pp + family,given,prefix,suffix + boolean,integer,string,xml + default,transliteration,transcription,translation + + + article + artwork + audio + bibnote + book + bookinbook + booklet + collection + commentary + customa + customb + customc + customd + custome + customf + dataset + inbook + incollection + inproceedings + inreference + image + jurisdiction + legal + legislation + letter + manual + misc + movie + music + mvcollection + mvreference + mvproceedings + mvbook + online + patent + performance + periodical + proceedings + reference + report + review + set + software + standard + suppbook + suppcollection + suppperiodical + thesis + unpublished + video + xdata + + + sortyear + volume + volumes + abstract + addendum + annotation + booksubtitle + booktitle + booktitleaddon + chapter + edition + eid + entrysubtype + eprintclass + eprinttype + eventtitle + eventtitleaddon + gender + howpublished + indexsorttitle + indextitle + isan + isbn + ismn + isrn + issn + issue + issuesubtitle + issuetitle + issuetitleaddon + iswc + journalsubtitle + journaltitle + journaltitleaddon + label + langid + langidopts + library + mainsubtitle + maintitle + maintitleaddon + nameaddon + note + number + origtitle + pagetotal + part + relatedstring + relatedtype + reprinttitle + series + shorthandintro + subtitle + title + titleaddon + usera + userb + userc + userd + usere + userf + venue + version + shorthand + shortjournal + shortseries + shorttitle + sorttitle + sortshorthand + sortkey + presort + institution + lista + listb + listc + listd + liste + listf + location + organization + origlocation + origpublisher + publisher + afterword + annotator + author + bookauthor + commentator + editor + editora + editorb + editorc + foreword + holder + introduction + namea + nameb + namec + translator + shortauthor + shorteditor + sortname + authortype + editoratype + editorbtype + editorctype + editortype + bookpagination + nameatype + namebtype + namectype + pagination + pubstate + type + language + origlanguage + crossref + xref + date + endyear + year + month + day + hour + minute + second + timezone + yeardivision + endmonth + endday + endhour + endminute + endsecond + endtimezone + endyeardivision + eventdate + eventendyear + eventyear + eventmonth + eventday + eventhour + eventminute + eventsecond + eventtimezone + eventyeardivision + eventendmonth + eventendday + eventendhour + eventendminute + eventendsecond + eventendtimezone + eventendyeardivision + origdate + origendyear + origyear + origmonth + origday + orighour + origminute + origsecond + origtimezone + origyeardivision + origendmonth + origendday + origendhour + origendminute + origendsecond + origendtimezone + origendyeardivision + urldate + urlendyear + urlyear + urlmonth + urlday + urlhour + urlminute + urlsecond + urltimezone + urlyeardivision + urlendmonth + urlendday + urlendhour + urlendminute + urlendsecond + urlendtimezone + urlendyeardivision + doi + eprint + file + verba + verbb + verbc + url + xdata + ids + entryset + related + keywords + options + relatedoptions + pages + execute + supervisor + dateaddon + + + abstract + annotation + authortype + bookpagination + crossref + day + doi + eprint + eprintclass + eprinttype + endday + endhour + endminute + endmonth + endsecond + endtimezone + endyear + endyeardivision + entryset + entrysubtype + execute + file + gender + hour + ids + indextitle + indexsorttitle + isan + ismn + iswc + keywords + label + langid + langidopts + library + lista + listb + listc + listd + liste + listf + minute + month + namea + nameb + namec + nameatype + namebtype + namectype + nameaddon + options + origday + origendday + origendhour + origendminute + origendmonth + origendsecond + origendtimezone + origendyear + origendyeardivision + orighour + origminute + origmonth + origsecond + origtimezone + origyear + origyeardivision + origlocation + origpublisher + origtitle + pagination + presort + related + relatedoptions + relatedstring + relatedtype + second + shortauthor + shorteditor + shorthand + shorthandintro + shortjournal + shortseries + shorttitle + sortkey + sortname + sortshorthand + sorttitle + sortyear + timezone + url + urlday + urlendday + urlendhour + urlendminute + urlendmonth + urlendsecond + urlendtimezone + urlendyear + urlhour + urlminute + urlmonth + urlsecond + urltimezone + urlyear + usera + userb + userc + userd + usere + userf + verba + verbb + verbc + xdata + xref + year + yeardivision + + + set + entryset + + + article + addendum + annotator + author + commentator + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + eid + issn + issue + issuetitle + issuesubtitle + issuetitleaddon + journalsubtitle + journaltitle + journaltitleaddon + language + note + number + origlanguage + pages + pubstate + series + subtitle + title + titleaddon + translator + version + volume + + + bibnote + note + + + book + author + addendum + afterword + annotator + chapter + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + eid + foreword + introduction + isbn + language + location + maintitle + maintitleaddon + mainsubtitle + note + number + origlanguage + pages + pagetotal + part + publisher + pubstate + series + subtitle + title + titleaddon + translator + volume + volumes + + + mvbook + addendum + afterword + annotator + author + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + foreword + introduction + isbn + language + location + note + number + origlanguage + pagetotal + publisher + pubstate + series + subtitle + title + titleaddon + translator + volume + volumes + + + inbook + bookinbook + suppbook + addendum + afterword + annotator + author + booktitle + bookauthor + booksubtitle + booktitleaddon + chapter + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + eid + foreword + introduction + isbn + language + location + mainsubtitle + maintitle + maintitleaddon + note + number + origlanguage + part + publisher + pages + pubstate + series + subtitle + title + titleaddon + translator + volume + volumes + + + booklet + addendum + author + chapter + editor + editortype + eid + howpublished + language + location + note + pages + pagetotal + pubstate + subtitle + title + titleaddon + type + + + collection + reference + addendum + afterword + annotator + chapter + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + eid + foreword + introduction + isbn + language + location + mainsubtitle + maintitle + maintitleaddon + note + number + origlanguage + pages + pagetotal + part + publisher + pubstate + series + subtitle + title + titleaddon + translator + volume + volumes + + + mvcollection + mvreference + addendum + afterword + annotator + author + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + foreword + introduction + isbn + language + location + note + number + origlanguage + publisher + pubstate + subtitle + title + titleaddon + translator + volume + volumes + + + incollection + suppcollection + inreference + addendum + afterword + annotator + author + booksubtitle + booktitle + booktitleaddon + chapter + commentator + edition + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + eid + foreword + introduction + isbn + language + location + mainsubtitle + maintitle + maintitleaddon + note + number + origlanguage + pages + part + publisher + pubstate + series + subtitle + title + titleaddon + translator + volume + volumes + + + dataset + addendum + author + edition + editor + editortype + language + location + note + number + organization + publisher + pubstate + series + subtitle + title + titleaddon + type + version + + + manual + addendum + author + chapter + edition + editor + editortype + eid + isbn + language + location + note + number + organization + pages + pagetotal + publisher + pubstate + series + subtitle + title + titleaddon + type + version + + + misc + software + addendum + author + editor + editortype + howpublished + language + location + note + organization + pubstate + subtitle + title + titleaddon + type + version + + + online + addendum + author + editor + editortype + language + note + organization + pubstate + subtitle + title + titleaddon + version + + + patent + addendum + author + holder + location + note + number + pubstate + subtitle + title + titleaddon + type + version + + + periodical + addendum + editor + editora + editorb + editorc + editortype + editoratype + editorbtype + editorctype + issn + issue + issuesubtitle + issuetitle + issuetitleaddon + language + note + number + pubstate + series + subtitle + title + titleaddon + volume + yeardivision + + + mvproceedings + addendum + editor + editortype + eventday + eventendday + eventendhour + eventendminute + eventendmonth + eventendsecond + eventendtimezone + eventendyear + eventendyeardivision + eventhour + eventminute + eventmonth + eventsecond + eventtimezone + eventyear + eventyeardivision + eventtitle + eventtitleaddon + isbn + language + location + note + number + organization + pagetotal + publisher + pubstate + series + subtitle + title + titleaddon + venue + volumes + + + proceedings + addendum + chapter + editor + editortype + eid + eventday + eventendday + eventendhour + eventendminute + eventendmonth + eventendsecond + eventendtimezone + eventendyear + eventendyeardivision + eventhour + eventminute + eventmonth + eventsecond + eventtimezone + eventyear + eventyeardivision + eventtitle + eventtitleaddon + isbn + language + location + mainsubtitle + maintitle + maintitleaddon + note + number + organization + pages + pagetotal + part + publisher + pubstate + series + subtitle + title + titleaddon + venue + volume + volumes + + + inproceedings + addendum + author + booksubtitle + booktitle + booktitleaddon + chapter + editor + editortype + eid + eventday + eventendday + eventendhour + eventendminute + eventendmonth + eventendsecond + eventendtimezone + eventendyear + eventendyeardivision + eventhour + eventminute + eventmonth + eventsecond + eventtimezone + eventyear + eventyeardivision + eventtitle + eventtitleaddon + isbn + language + location + mainsubtitle + maintitle + maintitleaddon + note + number + organization + pages + part + publisher + pubstate + series + subtitle + title + titleaddon + venue + volume + volumes + + + report + addendum + author + chapter + eid + institution + isrn + language + location + note + number + pages + pagetotal + pubstate + subtitle + title + titleaddon + type + version + + + thesis + addendum + author + chapter + eid + institution + language + location + note + pages + pagetotal + pubstate + subtitle + title + titleaddon + type + + + unpublished + addendum + author + eventday + eventendday + eventendhour + eventendminute + eventendmonth + eventendsecond + eventendtimezone + eventendyear + eventendyeardivision + eventhour + eventminute + eventmonth + eventsecond + eventtimezone + eventyear + eventyeardivision + eventtitle + eventtitleaddon + howpublished + language + location + note + pubstate + subtitle + title + titleaddon + type + venue + + + thesis + supervisor + + + dateaddon + + + abstract + addendum + afterword + annotator + author + bookauthor + booksubtitle + booktitle + booktitleaddon + chapter + commentator + editor + editora + editorb + editorc + foreword + holder + institution + introduction + issuesubtitle + issuetitle + issuetitleaddon + journalsubtitle + journaltitle + journaltitleaddon + location + mainsubtitle + maintitle + maintitleaddon + nameaddon + note + organization + origlanguage + origlocation + origpublisher + origtitle + part + publisher + relatedstring + series + shortauthor + shorteditor + shorthand + shortjournal + shortseries + shorttitle + sortname + sortshorthand + sorttitle + subtitle + title + titleaddon + translator + venue + + + article + book + inbook + bookinbook + suppbook + booklet + collection + incollection + suppcollection + manual + misc + mvbook + mvcollection + online + patent + periodical + suppperiodical + proceedings + inproceedings + reference + inreference + report + set + thesis + unpublished + + + date + year + + + + + set + + entryset + + + + article + + author + journaltitle + title + + + + book + mvbook + + author + title + + + + inbook + bookinbook + suppbook + + author + title + booktitle + + + + booklet + + + author + editor + + title + + + + collection + reference + mvcollection + mvreference + + editor + title + + + + incollection + suppcollection + inreference + + author + editor + title + booktitle + + + + dataset + + title + + + + manual + + title + + + + misc + software + + title + + + + online + + title + + url + doi + eprint + + + + + patent + + author + title + number + + + + periodical + + editor + title + + + + proceedings + mvproceedings + + title + + + + inproceedings + + author + title + booktitle + + + + report + + author + title + type + institution + + + + thesis + + author + title + type + institution + + + + unpublished + + author + title + + + + + isbn + + + issn + + + ismn + + + gender + + + + + + + bibliografie.bib + + diff --git a/kidiplom.fdb_latexmk b/kidiplom.fdb_latexmk new file mode 100644 index 0000000..5c188a6 --- /dev/null +++ b/kidiplom.fdb_latexmk @@ -0,0 +1,283 @@ +# Fdb version 4 +["biber kidiplom"] 1777641420.71466 "kidiplom.bcf" "kidiplom.bbl" "kidiplom" 1784485267.16205 2 + "kidiplom.bcf" 1784485267.03736 100507 e04409a00ea07820a76aae942e927593 "pdflatex" + (generated) + "kidiplom.bbl" + "kidiplom.blg" + (rewritten before read) +["makeindex kidiplom.idx"] 1777641420.69393 "kidiplom.idx" "kidiplom.ind" "kidiplom" 1784485267.15871 0 + "kidiplom.idx" 1784485265.44133 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + (generated) + "kidiplom.ilg" + "kidiplom.ind" + (rewritten before read) +["pdflatex"] 1784485264.83133 "/home/martin/projects/kidiplom/kidiplom.tex" "kidiplom.pdf" "kidiplom" 1784485267.15887 2 + "/home/martin/projects/kidiplom/kidiplom.tex" 1784485264.71132 119092 182002268412b0b42392d53087902db8 "" + "/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc" 1775415801 4850 80dc9bab7f31fb78a000ccfed0e27cab "" + "/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc" 1775415801 2375 baa924870cfb487815765f9094cf3728 "" + "/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc" 1775415801 2405 5dcf2c1b967ee25cc46c58cd52244aed "" + "/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc" 1775415801 2840 216e6e45ad352e2456e1149f28885bee "" + "/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc" 1775415801 2327 9d6df24f9c4f7368395224341a95523a "" + "/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc" 1775415801 3031 6c4d3515bf7115d8518af1c9ab97ca44 "" + "/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1775415801 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm" 1775415801 1292 3059476c50a24578715759f22652f3d0 "" + "/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm" 1775415801 1384 87406e4336af44af883a035f17f319d9 "" + "/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm" 1775415801 1292 bd42be2f344128bff6d35d98474adfe3 "" + "/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm" 1775415801 1384 4632f5e54900a7dadbb83f555bc61e56 "" + "/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1775415801 916 f87d7c45f9c908e672703b83b72241a3 "" + "/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1775415801 928 2dc8d444221b7a635bb58038579b861a "" + "/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1775415801 908 2921f8a10601f252058503cc6570e581 "" + "/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1775415801 940 228d6584342e91276bf566bcf9716b83 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1775415801 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx10.tfm" 1775415801 12076 b54175e02101bea1addf6b2d0197ed12 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm" 1775415801 12088 d750ac78274fa7c9f73ba09914c04f8a "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm" 1775415801 12056 7e13df7fe4cbce21b072ba7c4f4deb6e "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm" 1775415801 12092 7b1546e2d096cfd5dcbd4049b0b1ec2e "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm" 1775415801 12156 ca1ae6a3c8564e89597f1f993fba1608 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr8.tfm" 1775415801 12064 a35db870f0b76c338d749c56dc030ef5 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri12.tfm" 1775415801 17144 271aaf9ebb339934b04110dc5211fba4 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri8.tfm" 1775415801 17152 c8240fef851c4991afefdae37a539ee1 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmex10.tfm" 1775415801 992 ce925c9346c7613270a79afbee98c070 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi10.tfm" 1775415801 1528 6d36b2385e0ca062a654de6ac59cb34f "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi12.tfm" 1775415801 1524 753b192b18f2991794f9d41a8228510b "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi6.tfm" 1775415801 1512 94a3fd88c6f27dbd9ecb46987e297a4e "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi8.tfm" 1775415801 1520 a3fe5596932db2db2cbda300920dd4e9 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm" 1775415801 1308 02cc510f9dd6012e5815d0c0ffbf6869 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy6.tfm" 1775415801 1300 b0605d44c16c22d99dc001808e4f24ea "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy8.tfm" 1775415801 1304 cdc9a17df9ef0d2dc320eff37bbab1c4 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr10.tfm" 1775415801 11868 4f81e9b6033c032bdaf9884f4d7ef412 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr12.tfm" 1775415801 11888 6841b91e46b65cf41a49b160e6e74130 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr6.tfm" 1775415801 11836 e3b6ce3e601aec94f64a536e7f4224d5 "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr8.tfm" 1775415801 11864 309fd7f43e4a0ba39f6f7644d76e8edf "" + "/usr/share/texmf-dist/fonts/tfm/public/lm/ts1-lmr12.tfm" 1775415801 1596 1d4548788e389ded56d0b01b28377882 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmbx10.pfb" 1775415801 121021 1bf809ce4a594679006bd72263eba59b "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmbx12.pfb" 1775415801 116908 1fca96723793882c2e0160350c192fc8 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmmi12.pfb" 1775415801 30696 2654571912f9cd384da9f7cb8a60c568 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmmi8.pfb" 1775415801 30635 833ec815d446ec453a4913fc26d24cbc "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmr10.pfb" 1775415801 119235 f35b44530a1d90eb90fe15d9cba67ea0 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmr12.pfb" 1775415801 113634 f99c44d58bae0863375faf0e1d74d612 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmr17.pfb" 1775415801 119752 1bd8d06e4079df624bf59ce3ad7c9aa6 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmr8.pfb" 1775415801 122174 a7a08406857c9530a0320a2517f60370 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmri12.pfb" 1775415801 109265 32320cb6133d4d76bf83e27b5eb4009b "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmri8.pfb" 1775415801 109952 3dd76c0c5c680d519bb6d59a066c0826 "" + "/usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb" 1775415801 27863 09ce3735688ffde955e72da27c95b61a "" + "/usr/share/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb" 1775415801 50493 4ed1f7e9eba8f1f3e1ec25195460190d "" + "/usr/share/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb" 1775415801 45758 19968a0990191524e34e1994d4a31cb6 "" + "/usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf" 1775415801 2184 5d20c8b00cd914e50251116c274e2d0b "" + "/usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf" 1775415801 2184 8475af1b9cfa983db5f46f5ed4b8f9f7 "" + "/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1775415801 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf" 1775415801 15910 20b36fee6c6cdcfa90232891da7a9f34 "" + "/usr/share/texmf-dist/tex/generic/babel-english/english.ldf" 1775415801 7008 9ff5fdcc865b01beca2b0fe4a46231d4 "" + "/usr/share/texmf-dist/tex/generic/babel/babel.sty" 1775415801 147019 f2ca437186bfeb562e1066ad59426a04 "" + "/usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini" 1775415801 4447 101a02f96e435504c452e6c6f0f16371 "" + "/usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex" 1775415801 372 c7568ddcbdc696082db4d13e860e7448 "" + "/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini" 1775415801 3936 fef897bbcfe8e9d18c93a3d2d53cf9d8 "" + "/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex" 1775415801 374 a9c05f002d9437e6de45ac1cc23d56c2 "" + "/usr/share/texmf-dist/tex/generic/babel/txtbabel.def" 1775415801 5231 c1599e5bf7d2ee42743212a7f8d20a56 "" + "/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1775415801 40635 c40361e206be584d448876bba8a64a3b "" + "/usr/share/texmf-dist/tex/generic/bitset/bitset.sty" 1775415801 33961 6b5c75130e435b2bfdb9f480a09a39f9 "" + "/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1775415801 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty" 1775415801 480 5778104efadad304ced77548ca2184b1 "" + "/usr/share/texmf-dist/tex/generic/iftex/iftex.sty" 1775415801 7984 7dbb9280f03c0a315425f1b4f35d43ee "" + "/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty" 1775415801 1057 525c2192b5febbd8c1f662c9468335bb "" + "/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1775415801 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty" 1775415801 31769 002a487f55041f8e805cfbf6385ffd97 "" + "/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1775415801 5412 d5a2436094cd7be85769db90f29250a6 "" + "/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1775415801 17865 1a9bd36b4f98178fa551aca822290953 "" + "/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1775415801 19007 15924f7228aca6c6d184b115f4baa231 "" + "/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1775415801 20089 80423eac55aa175305d35b49e04fe23b "" + "/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex" 1775415801 116 760d50e6a16543bf6edb475635793673 "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg" 1775415801 926 2963ea0dcf6cc6c0a770b69ec46a477b "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def" 1775415801 5542 32f75a31ea6c3a7e1148cd6d5e93dbb7 "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def" 1775415801 12612 7774ba67bfd72e593c4436c2de6201e3 "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex" 1775415801 61355 39904e7552da3800a6838d41440943a5 "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex" 1775415801 1896 b8e0ca0ac371d74c0ca05583f6313c91 "" + "/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex" 1775415801 7778 53c8b5623d80238f6a20aa1df1868e63 "" + "/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex" 1775415801 39784 414c54e866ebab4b801e2ad81d9b21d8 "" + "/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex" 1775415801 37436 50ba7794827e363eec9ea3467c15c6d7 "" + "/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex" 1775415801 4385 510565c2f07998c8a0e14f0ec07ff23c "" + "/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex" 1775415801 30029 c49ea8f95207c46731469c614daf4e33 "" + "/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def" 1775415801 7067 11553488d1600cac6a0cfca012fca111 "" + "/usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty" 1775415801 21514 b7557edcee22835ef6b03ede1802dad4 "" + "/usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex" 1775415801 152705 c906707a12ed9475745f81566006dbd7 "" + "/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1775415801 7008 f92eaa0a3872ed622bbf538217cd2ab7 "" + "/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex" 1775415801 19299 c7c03646b32f5a7caaa137673b7e76d2 "" + "/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex" 1775415801 7787 7dfc2f158253fc82fd655393220e6620 "" + "/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty" 1775415801 12594 0d51ac3a545aaaa555021326ff22a6cc "" + "/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1775415801 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1775415801 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty" 1775415801 1319 275cecae59b75cbd38ce73df76acdb23 "" + "/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd" 1775415801 961 6518c6525a34feb5e8250ffa91731cff "" + "/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd" 1775415801 961 d02606146ba5601b5645f987c92e6193 "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1775415801 2222 27db7d52163edae53881b71ff62e754e "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty" 1775415801 4173 1b3e76addfb8afcb47db4811d66e1dc6 "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty" 1775415801 88471 b1bb09142edddebd46ba986341b867bd "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty" 1775415801 4474 c510a88aa5f51b8c773b50a7ee92befd "" + "/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty" 1775415801 2444 9983e1d0683f102e3b190c64a49313aa "" + "/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty" 1775415801 3935 57aa3c3e203a5c2effb4d2bd2efbc323 "" + "/usr/share/texmf-dist/tex/latex/base/article.cls" 1775415801 20144 b966087dda3b194755eb460d32e2ef75 "" + "/usr/share/texmf-dist/tex/latex/base/fontenc.sty" 1775415801 5275 6f9d359641b36842524cdb97716ab75f "" + "/usr/share/texmf-dist/tex/latex/base/ifthen.sty" 1775415801 5525 1593ca62a2554dd7423fc8a4e5a82125 "" + "/usr/share/texmf-dist/tex/latex/base/inputenc.sty" 1775415801 5048 0270515b828149155424600fd2d58ac5 "" + "/usr/share/texmf-dist/tex/latex/base/makeidx.sty" 1775415801 1939 6a53b9b28a14b26311df6cf40fff84ab "" + "/usr/share/texmf-dist/tex/latex/base/size12.clo" 1775415801 8449 8dc66c6c313c8eb2d774af83bca435dd "" + "/usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx" 1775415801 402 83e064b3bf05af557635d4cb8ec3c5d8 "" + "/usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg" 1775415801 69 249fa6df04d948e51b6d5c67bea30c42 "" + "/usr/share/texmf-dist/tex/latex/biblatex/biblatex.def" 1775415801 96838 ffbc2c4ed45b0b76660254a85df40e90 "" + "/usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty" 1775415801 537439 2a9e171c3538c29f9ba74ff3cff6f014 "" + "/usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty" 1775415801 9961 107fdb78f652fccae7bce0d23bdc19cd "" + "/usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def" 1775415801 13919 5426dbe90e723f089052b4e908b56ef9 "" + "/usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def" 1775415801 32761 18d14e3b502c120f79b2184de4e21d14 "" + "/usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def" 1775415801 2190 4b4fcc6752fa7201177431e523c40d74 "" + "/usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx" 1775415801 4676 d3f90f6377ee43f043262aa587deb6de "" + "/usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx" 1775415801 40021 daa5a82ed0967f3ac4b77cb8384cac55 "" + "/usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def" 1775415801 8818 aa5157b46368efebf023abff55611467 "" + "/usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty" 1775415801 18245 97e6be180cf07bb6f7008cfdaaecfce5 "" + "/usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty" 1775415801 12709 4ca3cf5f9f1d551b8a1090fba11ac95d "" + "/usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg" 1775415801 7068 06f8d141725d114847527a66439066b6 "" + "/usr/share/texmf-dist/tex/latex/csquotes/csquotes.def" 1775415801 22135 0975a49eeaed232aa861e9425ffb2e7c "" + "/usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty" 1775415801 62767 e79d6d7a989e7da62dcf3d0a65c1faee "" + "/usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf" 1775415801 3089 d52a4c355b25c3dd529891c3a45f909f "" + "/usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf" 1775415801 13644 e87d3e24e9d57f23552bacd982741384 "" + "/usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty" 1775415801 300696 d64c0f6926b342caf0237aca7adc4565 "" + "/usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def" 1775415801 8399 46cc9ec75e799cc8dab7047c95556626 "" + "/usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf" 1775415801 4460 214e95070da2307b91ff7e1a67406558 "" + "/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1775415801 13886 d1306dcf79a944f6988e688c1785f9ce "" + "/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1775415801 46885 8953c67ffba03252c6090aa19568b8ba "" + "/usr/share/texmf-dist/tex/latex/geometry/geometry.sty" 1775415801 41601 9cf6c5257b1bc7af01a58859749dd37a "" + "/usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf" 1775415801 3656 cfd7063dcf1f89f4d3681b9a8bd5be4d "" + "/usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty" 1775415801 263604 afa61de25e12f99bb1305606fa9e1ddf "" + "/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty" 1775415801 7346 20a6fbcba8f370c2b7d92a5a20321b54 "" + "/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty" 1775415801 7729 7146f0a2bfdee482a9b65ea7004d6500 "" + "/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty" 1775415801 9620 8591e606650ad0f162261aac7c7e8507 "" + "/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty" 1775415801 10639 48c47d2eadf7b08958cc1dd323db6849 "" + "/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty" 1775415801 96632 7b39c1bccbc94c2cff19084b6ff5ed7e "" + "/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1775415801 1213 620bba36b25224fa9b7e1ccb4ecb76fd "" + "/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1775415801 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def" 1775415801 19626 23e2822b9b2b5005f4c549ca98b9334d "" + "/usr/share/texmf-dist/tex/latex/graphics/color.sty" 1775415801 7245 a7e8457a46cda4920df85d975267efb4 "" + "/usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def" 1775415801 5009 f48e1006c67ca6c50094e2f41e884d72 "" + "/usr/share/texmf-dist/tex/latex/graphics/graphics.sty" 1775415801 18363 69bb4f5538964bfea50d1e6d89cbe69f "" + "/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty" 1775415801 8118 43b99e52946c33a23f5f43b52d5cc5ec "" + "/usr/share/texmf-dist/tex/latex/graphics/keyval.sty" 1775415801 2671 d9941f4bf4750e9b0603c9a2ec54693b "" + "/usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1775415801 2885 9c645d672ae17285bba324998918efd8 "" + "/usr/share/texmf-dist/tex/latex/graphics/trig.sty" 1775415801 4023 e66acf578d6b564c4670fb57ff336a7a "" + "/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty" 1775415801 17914 4c28a13fc3d975e6e81c9bea1d697276 "" + "/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def" 1775415801 48140 0d317d7fb0c7460a10b7b2713db57305 "" + "/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty" 1775415801 223349 c7928c099a8656537a829ba316c95536 "" + "/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty" 1775415801 11459 697f11f6c439d25d39d2674b99566af4 "" + "/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def" 1775415801 14249 b94983bbccc8d5739c16cc91d1fd1c3b "" + "/usr/share/texmf-dist/tex/latex/hyperref/puenc.def" 1775415801 117118 2e3ba580751de5583beacf2e5fee69a9 "" + "/usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty" 1775415801 101071 5c33e7845f9afaab8705ab53e1c47a1a "" + "/usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty" 1775415801 11187 bb19b68b7570b0a5839776e49029dfc6 "" + "/usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty" 1775415801 3330 524ef98f49a363d012453fece1f26677 "" + "/usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty" 1775415801 2164 c44cdb4bc4dc3e1eacfb6a8e57830b70 "" + "/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1775415801 22555 6d8e155cfef6d82c3d5c742fea7c992e "" + "/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1775415801 13815 760b0c02f691ea230f5359c4e1de23a7 "" + "/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1775415801 30662 bfd6e864f4ffc5018b0e2b6260c3181c "" + "/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty" 1775415801 6558 45786cbbf5684a09ee65aa45a7b367e0 "" + "/usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty" 1775415801 4674 ff006c14a0adf55e7318570f962bcbbb "" + "/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty" 1775415801 10176 c2fc1c663b3f3899ddac6e6ed3fb1d7e "" + "/usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty" 1775415801 2865 8ccb2521cf80bdb5bc6042e2df32d144 "" + "/usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty" 1775415801 2716 b320fe74b8aadca5b2805ffb7b0f33c6 "" + "/usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty" 1775415801 9397 191b1ee46e1309b0f90d3f19218f6750 "" + "/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1775415801 678 4792914a8f45be57bb98413425e4c7af "" + "/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex" 1775415801 95525 6fd0552101a6b1f9b7a84b402ec435ba "" + "/usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty" 1775415801 14690 c2c754218a7108db7823a4839c1bc3cd "" + "/usr/share/texmf-dist/tex/latex/listings/listings.cfg" 1775415801 1865 73df61e45e2dfdc239ef37ab16d87d6a "" + "/usr/share/texmf-dist/tex/latex/listings/listings.sty" 1775415801 81627 6a9c17f89f356724d1c9813b7025f0c1 "" + "/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty" 1775415801 206518 095934a0019dcba14af528744bf9b295 "" + "/usr/share/texmf-dist/tex/latex/listings/lstlang2.sty" 1775415801 106030 54239571eb5e01f352181dfbfb7c527f "" + "/usr/share/texmf-dist/tex/latex/listings/lstlang3.sty" 1775415801 92877 426b9bccf7c135073bc47c1f72c07086 "" + "/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty" 1775415801 77105 002e983b638eadbf04e580642335f689 "" + "/usr/share/texmf-dist/tex/latex/listings/lstpatch.sty" 1775415801 353 9024412f43e92cd5b21fe9ded82d0610 "" + "/usr/share/texmf-dist/tex/latex/lm/lmodern.sty" 1775415801 1608 b00724785a9e9c599e5181bb8729160b "" + "/usr/share/texmf-dist/tex/latex/lm/omllmm.fd" 1775415801 890 57f5adccd504fb5c98bdf99ed7e7f195 "" + "/usr/share/texmf-dist/tex/latex/lm/omslmsy.fd" 1775415801 807 3de192f3efa968913bd2f096a7b430d8 "" + "/usr/share/texmf-dist/tex/latex/lm/omxlmex.fd" 1775415801 568 a5494d810f2680caf10205cd1226c76c "" + "/usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd" 1775415801 1882 28c08db1407ebff35a658fd141753d16 "" + "/usr/share/texmf-dist/tex/latex/lm/t1lmr.fd" 1775415801 1867 996fe743d88a01aca041ed22cc10e1bb "" + "/usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd" 1775415801 1914 884882d7ebb0fd65cea93fca77ff6f5a "" + "/usr/share/texmf-dist/tex/latex/logreq/logreq.def" 1775415801 1620 fb1c32b818f2058eca187e5c41dfae77 "" + "/usr/share/texmf-dist/tex/latex/logreq/logreq.sty" 1775415801 6187 b27afc771af565d3a9ff1ca7d16d0d46 "" + "/usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty" 1775415801 18640 ecc51f3cc513cfff843ce5d9f457c3b9 "" + "/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty" 1775415801 443 8c872229db56122037e86bcda49e14f3 "" + "/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty" 1775415801 325 f9f16d12354225b7dd52a3321f085955 "" + "/usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd" 1775415801 798 d5895e9edc628f2be019beb2c0ec66df "" + "/usr/share/texmf-dist/tex/latex/refcount/refcount.sty" 1775415801 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1775415801 9684 a33a14b82ce60d6e77cb9be689d79ee6 "" + "/usr/share/texmf-dist/tex/latex/savesym/savesym.sty" 1775415801 2076 969b46b87cb8b982a532fc328300998e "" + "/usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty" 1775415801 16217 4373543ac84bc0161205d94fecd4b8bf "" + "/usr/share/texmf-dist/tex/latex/svg/svg.sty" 1775415801 43468 671ae75b3a15019004495eff4c0911e8 "" + "/usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty" 1775415801 2547 a5a59eb03f587b4c267981c894cde4cb "" + "/usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty" 1775415801 1696 0b33b5336cb99d15b904405f9c077915 "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty" 1775415801 4682 8f2186b1227fdefc9dcd77a366d53aa3 "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty" 1775415801 3272 133720bc624d01252e2858c1a29ee3de "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty" 1775415801 15445 e93b10139ca6d334bd7f636226a85389 "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty" 1775415801 6224 5b50b2177552839e49f62ff6045310e1 "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty" 1775415801 6878 1730928da9b392ec6c2f6b0e2273b4b9 "" + "/usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty" 1775415801 8051 10018eb9c2d166333bfceb517a425f4d "" + "/usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty" 1775415801 1913 873bc7fbf18d7dd934dc3a6cc156472e "" + "/usr/share/texmf-dist/tex/latex/tools/array.sty" 1775415801 15651 9d7c62df82cb29a555c00550babfe364 "" + "/usr/share/texmf-dist/tex/latex/tools/longtable.sty" 1775415801 16014 dfa4b4d4e04a78a3f05a90c19711737a "" + "/usr/share/texmf-dist/tex/latex/tools/multicol.sty" 1775415801 33142 efe8f4750fc02524935e7423b4bdef69 "" + "/usr/share/texmf-dist/tex/latex/tools/shellesc.sty" 1775415801 4121 d611256e8b768e99aa5a680aad44990d "" + "/usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty" 1775415801 10062 6009a67f1c2bd376a9f34880dc509a07 "" + "/usr/share/texmf-dist/tex/latex/translator/translator.sty" 1775415801 8765 56d370785f0143111ff9898b5adfe08e "" + "/usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty" 1775415801 4218 953818299bf47dea89e603d2b8a390d8 "" + "/usr/share/texmf-dist/tex/latex/transparent/transparent.sty" 1775415801 1797 4ef4500488e0ea48fd76f41e2a351a2e "" + "/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty" 1775415801 1380 971a51b00a14503ddf754cab24c3f209 "" + "/usr/share/texmf-dist/tex/latex/url/url.sty" 1775415801 12796 8edb7d69a20b857904dd0ea757c14ec9 "" + "/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty" 1775415801 55384 b454dec21c2d9f45ec0b793f0995b992 "" + "/usr/share/texmf-dist/tex/latex/xfor/xfor.sty" 1775415801 2689 44855b72da58344b1c1d9b3087bce6ca "" + "/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1775415801 5006 d7e899bb5d9717c7f214e9bc0284de7b "" + "/usr/share/texmf-dist/web2c/texmf.cnf" 1775415801 43569 fd570f2fa160877d211e859f687312ba "" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1780904047 5382322 468d3831690fd9b5e3d16d5c22dbf17a "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1780904038 2352582 86b484c6b78c2a90b481750cbf03de22 "" + "czech-iso.lbx" 1681557593 294 7ce53d925459ba9e674024c57d6c7af9 "" + "czech.lbx" 1681557593 23857 01707bd906156286610d5e5bcb06aa09 "" + "english-iso.lbx" 1681557593 292 ce1004c4c0d380cc5ae6d84de8c03da6 "" + "graphics/300playerstrace.png" 1775758530.81909 49763 3cc41557a1ddcc2acef988ea4667dfe8 "" + "graphics/TcpIp.png" 1775414953.33879 64639 00f2319f3474a2ac8cf43569bc9af998 "" + "graphics/UP_znak.pdf" 1681557593 3121 caaf4f5447a3a0b25b356a30208583d1 "" + "graphics/client-server-architecture.pdf" 1777452157.2459 87165 29c6b564f112814268f2465c1c3c0188 "" + "graphics/ecs_optimization_tracy_01.png" 1776022974.05461 130401 258005bf8593377b2ff6bade36c08384 "" + "graphics/ecs_optimization_tracy_02.png" 1776023016.44493 121676 ab7b6fd1d3d0d0b0a564447c2067c920 "" + "graphics/grafana.png" 1777742255.36748 177249 00bc0e853ef0c5f6e56d0e482cd0070c "" + "graphics/http2.pdf" 1776969007.60601 46800 91209613d245a76f155c3f9e6f79cdf6 "" + "graphics/http3.pdf" 1776968997.16731 79793 31bf8e82583c4435518e5143b8792c85 "" + "graphics/integrationcomparison.pdf" 1775588282.49964 20019 870793ee528516a5c736ac47a287f24f "" + "graphics/kititle-cz-nofont.pdf" 1681557593 12762 4b9f69751f3c44debf721c7e80adffc7 "" + "graphics/latencycomparison.pdf" 1778155349.2454 19017 2406ef2b6ba3de406fb00a57ae6eb4a0 "" + "graphics/layer_architecture.png" 1777273464.39449 24159 f110280074d3b9a1444f44da6168aefc "" + "graphics/playerbenchmark.png" 1774990129.78598 36699 4e11286fcaf50fefe34cf42456e981bc "" + "graphics/quic_handshake.pdf" 1777135207.08321 51400 2edd580d3287b4878651db3546952446 "" + "graphics/quicr_handshake.pdf" 1777671629.01477 54410 98ae3707915e14050914f5953b2aa2a7 "" + "graphics/zone_server_architecture.pdf" 1777668683.31198 89331 7bcdb7a734277a007eb50aab7d27d76c "" + "iso-numeric.bbx" 1681557593 319 50b9ccdb608c40ac14dd498079e9ab29 "" + "iso-numeric.cbx" 1681557593 73 45828f8df9dead5135d2c8a727f5b601 "" + "iso.bbx" 1681557593 13233 9f9e9c852fe772bfe1efaacc6b415eb7 "" + "kibase.sty" 1681557593 23853 021ae8236751950ac5e18f6a5bcf1da7 "" + "kidiplom.acr" 0 -1 0 "" + "kidiplom.aux" 1784485267.01936 39430 fdff14e0bc2410ed919f8e8110557921 "pdflatex" + "kidiplom.bbl" 0 -1 0 "biber kidiplom" + "kidiplom.cls" 1681557593 18598 7684b2d13ac67d7b017c4eea1e12fa0c "" + "kidiplom.glsdefs" 1777655247.6059 525 791a05cd0a9f8650067804d8f5ff3f41 "" + "kidiplom.ind" 1777641420.71105 0 d41d8cd98f00b204e9800998ecf8427e "makeindex kidiplom.idx" + "kidiplom.lot" 1784485267.03863 142 0f926846b4ca0023532a29a360cf54d1 "pdflatex" + "kidiplom.run.xml" 1784485267.03863 2535 4e001a965ee2f4de88dc6271855a61ea "pdflatex" + "kidiplom.tex" 1784485264.71132 119092 182002268412b0b42392d53087902db8 "" + "kidiplom.toc" 1784485267.03863 6728 b6e8cccb71c2a170c813dee8da64c213 "pdflatex" + (generated) + "kidiplom.acn" + "kidiplom.aux" + "kidiplom.bcf" + "kidiplom.glo" + "kidiplom.idx" + "kidiplom.ist" + "kidiplom.log" + "kidiplom.lot" + "kidiplom.pdf" + "kidiplom.run.xml" + "kidiplom.toc" + (rewritten before read) diff --git a/kidiplom.fls b/kidiplom.fls new file mode 100644 index 0000000..f2098c4 --- /dev/null +++ b/kidiplom.fls @@ -0,0 +1,635 @@ +PWD /home/martin/projects/kidiplom +INPUT /usr/share/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt +INPUT /home/martin/projects/kidiplom/kidiplom.tex +OUTPUT kidiplom.log +INPUT ./kidiplom.cls +INPUT kidiplom.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo +INPUT /usr/share/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT ./kibase.sty +INPUT kibase.sty +INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/txtbabel.def +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini +INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini +INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf +INPUT /usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx +INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def +INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def +INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def +INPUT /usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty +INPUT /usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/color.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/latex/url/url.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +INPUT /usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty +INPUT /usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty +INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg +INPUT /usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty +INPUT /usr/share/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/share/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/share/texmf-dist/tex/latex/savesym/savesym.sty +INPUT /usr/share/texmf-dist/tex/latex/savesym/savesym.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty +INPUT /usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +INPUT /usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +INPUT /usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +INPUT /usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +INPUT /usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty +INPUT /usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty +INPUT /usr/share/texmf-dist/tex/latex/xfor/xfor.sty +INPUT /usr/share/texmf-dist/tex/latex/xfor/xfor.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty +INPUT /usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty +INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex +INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex +INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex +INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex +INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex +INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty +INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty +INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty +INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty +INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty +INPUT /usr/share/texmf-dist/tex/latex/lm/lmodern.sty +INPUT /usr/share/texmf-dist/tex/latex/lm/lmodern.sty +INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg +INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg +OUTPUT kidiplom.glo +OUTPUT kidiplom.acn +OUTPUT kidiplom.idx +INPUT /usr/share/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/makeidx.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/multicol.sty +OUTPUT kidiplom.idx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty +INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.sty +INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.sty +INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def +INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def +INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def +INPUT ./iso-numeric.bbx +INPUT ./iso-numeric.bbx +INPUT iso-numeric.bbx +INPUT ./iso.bbx +INPUT ./iso.bbx +INPUT iso.bbx +INPUT ./iso-numeric.cbx +INPUT ./iso-numeric.cbx +INPUT iso-numeric.cbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg +INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg +INPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty +INPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty +INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty +INPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +INPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +INPUT /usr/share/texmf-dist/tex/latex/amscls/amsthm.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty +INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty +INPUT /usr/share/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty +INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty +INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty +INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty +INPUT /usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty +INPUT /usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty +INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex +INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex +INPUT /usr/share/texmf-dist/tex/latex/svg/svg.sty +INPUT /usr/share/texmf-dist/tex/latex/svg/svg.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty +INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty +INPUT /usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +INPUT /usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/shellesc.sty +INPUT /usr/share/texmf-dist/tex/latex/tools/shellesc.sty +INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent.sty +INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent.sty +INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty +INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +INPUT /usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +INPUT /usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +INPUT /usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +INPUT /usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +INPUT ./kidiplom.aux +INPUT ./kidiplom.aux +INPUT kidiplom.aux +OUTPUT kidiplom.aux +INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +OUTPUT kidiplom.pdf +INPUT ./kidiplom.glsdefs +INPUT ./kidiplom.glsdefs +INPUT kidiplom.glsdefs +INPUT ./czech-iso.lbx +INPUT ./czech-iso.lbx +INPUT czech-iso.lbx +INPUT ./czech.lbx +INPUT ./czech.lbx +INPUT czech.lbx +INPUT ./english-iso.lbx +INPUT ./english-iso.lbx +INPUT english-iso.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT ./czech.lbx +INPUT ./czech.lbx +INPUT czech.lbx +INPUT ./english-iso.lbx +INPUT ./english-iso.lbx +INPUT english-iso.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT ./english-iso.lbx +INPUT ./english-iso.lbx +INPUT english-iso.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx +OUTPUT kidiplom.bcf +INPUT ./graphics/kititle-cz-nofont.pdf +INPUT ./graphics/kititle-cz-nofont.pdf +INPUT ./graphics/kititle-cz-nofont.pdf +INPUT ./graphics/kititle-cz-nofont.pdf +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm +INPUT ./graphics/UP_znak.pdf +INPUT ./graphics/UP_znak.pdf +INPUT ./graphics/UP_znak.pdf +INPUT ./graphics/UP_znak.pdf +INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr6.tfm +INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi6.tfm +INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy6.tfm +INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmex10.tfm +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm +OUTPUT kidiplom.ist +INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map +INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm +INPUT ./kidiplom.toc +INPUT ./kidiplom.toc +INPUT kidiplom.toc +OUTPUT kidiplom.toc +INPUT ./kidiplom.lot +INPUT ./kidiplom.lot +INPUT kidiplom.lot +OUTPUT kidiplom.lot +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm +INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc +INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc +INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc +INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd +INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd +INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm +INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm +INPUT /usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc +INPUT ./graphics/layer_architecture.png +INPUT ./graphics/layer_architecture.png +INPUT ./graphics/layer_architecture.png +INPUT ./graphics/layer_architecture.png +INPUT ./graphics/layer_architecture.png +INPUT ./graphics/TcpIp.png +INPUT ./graphics/TcpIp.png +INPUT ./graphics/TcpIp.png +INPUT ./graphics/TcpIp.png +INPUT ./graphics/http2.pdf +INPUT ./graphics/http2.pdf +INPUT ./graphics/http2.pdf +INPUT ./graphics/http2.pdf +INPUT ./graphics/http2.pdf +INPUT ./graphics/http3.pdf +INPUT ./graphics/http3.pdf +INPUT ./graphics/http3.pdf +INPUT ./graphics/http3.pdf +INPUT ./graphics/http3.pdf +INPUT ./graphics/quic_handshake.pdf +INPUT ./graphics/quic_handshake.pdf +INPUT ./graphics/quic_handshake.pdf +INPUT ./graphics/quic_handshake.pdf +INPUT ./graphics/quic_handshake.pdf +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr8.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm +INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm +INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm +INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm +INPUT ./graphics/client-server-architecture.pdf +INPUT ./graphics/client-server-architecture.pdf +INPUT ./graphics/client-server-architecture.pdf +INPUT ./graphics/client-server-architecture.pdf +INPUT ./graphics/client-server-architecture.pdf +INPUT ./graphics/grafana.png +INPUT ./graphics/grafana.png +INPUT ./graphics/grafana.png +INPUT ./graphics/grafana.png +INPUT ./graphics/grafana.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/quicr_handshake.pdf +INPUT ./graphics/quicr_handshake.pdf +INPUT ./graphics/quicr_handshake.pdf +INPUT ./graphics/quicr_handshake.pdf +INPUT ./graphics/quicr_handshake.pdf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm +INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf +INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm +INPUT ./graphics/latencycomparison.pdf +INPUT ./graphics/latencycomparison.pdf +INPUT ./graphics/latencycomparison.pdf +INPUT ./graphics/latencycomparison.pdf +INPUT ./graphics/latencycomparison.pdf +INPUT ./graphics/integrationcomparison.pdf +INPUT ./graphics/integrationcomparison.pdf +INPUT ./graphics/integrationcomparison.pdf +INPUT ./graphics/integrationcomparison.pdf +INPUT ./graphics/integrationcomparison.pdf +INPUT ./graphics/playerbenchmark.png +INPUT ./graphics/playerbenchmark.png +INPUT ./graphics/playerbenchmark.png +INPUT ./graphics/playerbenchmark.png +INPUT ./graphics/playerbenchmark.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/300playerstrace.png +INPUT ./graphics/ecs_optimization_tracy_01.png +INPUT ./graphics/ecs_optimization_tracy_01.png +INPUT ./graphics/ecs_optimization_tracy_01.png +INPUT ./graphics/ecs_optimization_tracy_01.png +INPUT ./graphics/ecs_optimization_tracy_01.png +INPUT ./graphics/ecs_optimization_tracy_02.png +INPUT ./graphics/ecs_optimization_tracy_02.png +INPUT ./graphics/ecs_optimization_tracy_02.png +INPUT ./graphics/ecs_optimization_tracy_02.png +INPUT ./graphics/ecs_optimization_tracy_02.png +INPUT ./graphics/zone_server_architecture.pdf +INPUT ./graphics/zone_server_architecture.pdf +INPUT ./graphics/zone_server_architecture.pdf +INPUT ./graphics/zone_server_architecture.pdf +INPUT ./graphics/zone_server_architecture.pdf +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty +INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd +INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd +INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ts1-lmr12.tfm +INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc +INPUT ./kidiplom.ind +INPUT ./kidiplom.ind +INPUT kidiplom.ind +INPUT kidiplom.aux +INPUT kidiplom.run.xml +OUTPUT kidiplom.run.xml +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmbx10.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmbx12.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmmi12.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmmi8.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr10.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr12.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr17.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr8.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmri12.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmri8.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb +INPUT /usr/share/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb +INPUT /usr/share/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb diff --git a/kidiplom.idx b/kidiplom.idx index 8323176..e69de29 100644 --- a/kidiplom.idx +++ b/kidiplom.idx @@ -1 +0,0 @@ -\indexentry{výraz|hyperxindexformat{\hypertarget{1ind.ind}}}{42} diff --git a/kidiplom.ilg b/kidiplom.ilg new file mode 100644 index 0000000..8997fdb --- /dev/null +++ b/kidiplom.ilg @@ -0,0 +1,4 @@ +This is makeindex, version 2.18 [TeX Live 2026] (kpathsea + Thai support). +Scanning input file kidiplom.idx...done (0 entries accepted, 0 rejected). +Nothing written in kidiplom.ind. +Transcript written in kidiplom.ilg. diff --git a/kidiplom.ind b/kidiplom.ind new file mode 100644 index 0000000..e69de29 diff --git a/kidiplom.ist b/kidiplom.ist index ea5587b..9b1dc15 100644 --- a/kidiplom.ist +++ b/kidiplom.ist @@ -1,5 +1,5 @@ % makeindex style file created by the glossaries package -% for document 'kidiplom' on 2026-4-8 +% for document 'kidiplom' on 2026-7-19 actual '?' encap '|' level '!' diff --git a/kidiplom.log b/kidiplom.log index eb629ba..84afedd 100644 --- a/kidiplom.log +++ b/kidiplom.log @@ -1,9 +1,9 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.3.13) 8 APR 2026 10:03 +This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.8) 19 JUL 2026 20:21 entering extended mode restricted \write18 enabled. %&-line parsing enabled. -**kidiplom.tex -(./kidiplom.tex +**/home/martin/projects/kidiplom/kidiplom.tex +(/home/martin/projects/kidiplom/kidiplom.tex LaTeX2e <2025-11-01> L3 programming layer <2026-01-19> (./kidiplom.cls @@ -1148,6 +1148,112 @@ Package: lipsum 2021-09-20 v2.7 150 paragraphs of Lorem Ipsum dummy text \l__lipsum_b_int=\count508 (/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex)) +(/usr/share/texmf-dist/tex/latex/svg/svg.sty +Package: svg 2020/11/26 v2.02k (include SVG pictures) + +(/usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2026/02/02 v3.49.2 KOMA-Script package (KOMA-Script-independen +t basics and keyval usage) + +(/usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2026/02/02 v3.49.2 KOMA-Script package (file load hooks) + +(/usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty +Package: scrlfile-hook 2026/02/02 v3.49.2 KOMA-Script package (using LaTeX hook +s) + +(/usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty +Package: scrlogo 2026/02/02 v3.49.2 KOMA-Script package (logo) +))) +Applying: [2021/05/01] Usage of raw or classic option list on input line 254. +Already applied: [0000/00/00] Usage of raw or classic option list on input line + 370. +) +(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +(/usr/share/texmf-dist/tex/latex/tools/shellesc.sty +Package: shellesc 2023/07/08 v1.0d unified shell escape interface for LaTeX +Package shellesc Info: Restricted shell escape enabled on input line 77. +) +\c@svg@param@lastpage=\count509 +\svg@box=\box112 +\c@svg@param@currpage=\count510 +) +(/usr/share/texmf-dist/tex/latex/transparent/transparent.sty +Package: transparent 2025-06-23 v1.6 Transparency with color stacks + +(/usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty +Package: transparent-nometadata 2025-06-23 v1.6 Transparency via pdfTeX's color + stack (HO) + +(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +))) +(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks51 +\pgfutil@tempdima=\dimen268 +\pgfutil@tempdimb=\dimen269 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box113 +) +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2025-08-29 v3.1.11a (3.1.11a) +)) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2025-08-29 v3.1.11a (3.1.11a) + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks52 +\pgfkeys@temptoks=\toks53 + +(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.te +x +\pgfkeys@tmptoks=\toks54 +)) +\pgf@x=\dimen270 +\pgf@y=\dimen271 +\pgf@xa=\dimen272 +\pgf@ya=\dimen273 +\pgf@xb=\dimen274 +\pgf@yb=\dimen275 +\pgf@xc=\dimen276 +\pgf@yc=\dimen277 +\pgf@xd=\dimen278 +\pgf@yd=\dimen279 +\w@pgf@writea=\write9 +\r@pgf@reada=\read4 +\c@pgf@counta=\count511 +\c@pgf@countb=\count512 +\c@pgf@countc=\count513 +\c@pgf@countd=\count514 +\t@pgf@toka=\toks55 +\t@pgf@tokb=\toks56 +\t@pgf@tokc=\toks57 +\pgf@sys@id@count=\count515 + (/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2025-08-29 v3.1.11a (3.1.11a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2025-08-29 v3.1.11a (3.1.11a) + +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def +File: pgfsys-common-pdf.def 2025-08-29 v3.1.11a (3.1.11a) +))) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex +File: pgfsyssoftpath.code.tex 2025-08-29 v3.1.11a (3.1.11a) +\pgfsyssoftpath@smallbuffer@items=\count516 +\pgfsyssoftpath@bigbuffer@items=\count517 +) +(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex +File: pgfsysprotocol.code.tex 2025-08-29 v3.1.11a (3.1.11a) +)) Package csquotes Info: Checking for multilingual support... Package csquotes Info: ... found 'babel' package. Package csquotes Info: Enabling multilingual quotes. @@ -1160,49 +1266,45 @@ Package biblatex Warning: Attempt to redefine deprecated '\mkbibnamelast'. Package biblatex Warning: Conflicting options. (biblatex) 'urldate=iso' requires 'seconds=true'. -(biblatex) Setting 'seconds=true' on input line 144. +(biblatex) Setting 'seconds=true' on input line 145. (./kidiplom.aux Package babel Info: 'czech' activates 'czech' shorthands. -(babel) Reported on input line 21. - - -LaTeX Warning: Label `tab:prepinace' multiply defined. - +(babel) Reported on input line 22. ) \openout1 = `kidiplom.aux'. -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 144. -LaTeX Font Info: ... okay on input line 144. +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 145. +LaTeX Font Info: ... okay on input line 145. (/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count509 -\scratchdimen=\dimen268 -\scratchbox=\box112 -\nofMPsegments=\count510 -\nofMParguments=\count511 -\everyMPshowfont=\toks51 -\MPscratchCnt=\count512 -\MPscratchDim=\dimen269 -\MPnumerator=\count513 -\makeMPintoPDFobject=\count514 -\everyMPtoPDFconversion=\toks52 +\scratchcounter=\count518 +\scratchdimen=\dimen280 +\scratchbox=\box114 +\nofMPsegments=\count519 +\nofMParguments=\count520 +\everyMPshowfont=\toks58 +\MPscratchCnt=\count521 +\MPscratchDim=\dimen281 +\MPnumerator=\count522 +\makeMPintoPDFobject=\count523 +\everyMPtoPDFconversion=\toks59 ) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 @@ -1212,8 +1314,8 @@ Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv e )) -Package hyperref Info: Link coloring ON on input line 144. -\c@lstlisting=\count515 +Package hyperref Info: Link coloring ON on input line 145. +\c@lstlisting=\count524 (./kidiplom.glsdefs) Package biblatex Info: Trying to load language 'czech' -> 'czech-iso'... @@ -1268,11 +1370,11 @@ Package biblatex Info: Data encoding 'utf8' specified. \openout8 = `kidiplom.bcf'. Package biblatex Info: Trying to load bibliographic data... -Package biblatex Info: ... file 'kidiplom.bbl' found. - (./kidiplom.bbl) -Package biblatex Info: Reference section=0 on input line 144. -Package biblatex Info: Reference segment=0 on input line 144. +Package biblatex Info: ... file 'kidiplom.bbl' not found. +No file kidiplom.bbl. +Package biblatex Info: Reference section=0 on input line 145. +Package biblatex Info: Reference segment=0 on input line 145. *geometry* detected driver: pdftex *geometry* verbose mode - [ preamble ] result: * driver: pdftex @@ -1306,65 +1408,58 @@ Package biblatex Info: Reference segment=0 on input line 144. * \@reversemarginfalse * (1in=72.27pt=25.4mm, 1cm=28.453pt) - + File: graphics/kititle-cz-nofont.pdf Graphic file (type pdf) -Package pdftex.def Info: graphics/kititle-cz-nofont.pdf used on input line 149 +Package pdftex.def Info: graphics/kititle-cz-nofont.pdf used on input line 150 . (pdftex.def) Requested size: 225.24323pt x 43.36232pt. + +File: graphics/UP_znak.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/UP_znak.pdf used on input line 150. +(pdftex.def) Requested size: 101.59187pt x 101.59187pt. LaTeX Font Info: Trying to load font information for OT1+lmr on input line 1 -49. +50. (/usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd File: ot1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern ) LaTeX Font Info: Trying to load font information for OML+lmm on input line 1 -49. +50. (/usr/share/texmf-dist/tex/latex/lm/omllmm.fd File: omllmm.fd 2015/05/01 v1.6.1 Font defs for Latin Modern ) LaTeX Font Info: Trying to load font information for OMS+lmsy on input line -149. +150. (/usr/share/texmf-dist/tex/latex/lm/omslmsy.fd File: omslmsy.fd 2015/05/01 v1.6.1 Font defs for Latin Modern ) LaTeX Font Info: Trying to load font information for OMX+lmex on input line -149. +150. (/usr/share/texmf-dist/tex/latex/lm/omxlmex.fd File: omxlmex.fd 2015/05/01 v1.6.1 Font defs for Latin Modern ) LaTeX Font Info: External font `lmex10' loaded for size -(Font) <14.4> on input line 149. +(Font) <12> on input line 150. LaTeX Font Info: External font `lmex10' loaded for size -(Font) <10> on input line 149. +(Font) <8> on input line 150. LaTeX Font Info: External font `lmex10' loaded for size -(Font) <7> on input line 149. -LaTeX Font Info: Trying to load font information for U+msa on input line 149 +(Font) <6> on input line 150. +LaTeX Font Info: Trying to load font information for U+msa on input line 150 . (/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd File: umsa.fd 2013/01/14 v3.01 AMS symbols A ) -LaTeX Font Info: Trying to load font information for U+msb on input line 149 +LaTeX Font Info: Trying to load font information for U+msb on input line 150 . (/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) - -File: graphics/UP_znak.pdf Graphic file (type pdf) - -Package pdftex.def Info: graphics/UP_znak.pdf used on input line 149. -(pdftex.def) Requested size: 101.59187pt x 101.59187pt. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <12> on input line 149. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <8> on input line 149. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <6> on input line 149. - [1 +) [1 \openout3 = `kidiplom.ist'. @@ -1372,7 +1467,7 @@ LaTeX Font Info: External font `lmex10' loaded for size /enc/dvips/lm/lm-ec.enc} <./graphics/kititle-cz-nofont.pdf> <./graphics/UP_znak .pdf>] LaTeX Font Info: External font `lmex10' loaded for size -(Font) <10.95> on input line 149. +(Font) <10.95> on input line 150. [2] [3 ] [4 @@ -1380,114 +1475,334 @@ LaTeX Font Info: External font `lmex10' loaded for size ] (./kidiplom.toc [5 -] [6]) -\tf@toc=\write9 -\openout9 = `kidiplom.toc'. +]) +\tf@toc=\write10 +\openout10 = `kidiplom.toc'. - [7] (./kidiplom.lot) -\tf@lot=\write10 -\openout10 = `kidiplom.lot'. + [6] (./kidiplom.lot) +\tf@lot=\write11 +\openout11 = `kidiplom.lot'. - [8 + [7 -] [9 +] [8 -] -Package hyperref Info: bookmark level for unknown definition defaults to 0 on i -nput line 170. - [10] - -File: graphics/TcpIp.png Graphic file (type png) - -Package pdftex.def Info: graphics/TcpIp.png used on input line 221. -(pdftex.def) Requested size: 409.50119pt x 260.91075pt. - [11{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}] [12 <./graphics/T -cpIp.png>] [13] -[14] [15] [16] (/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty -File: lstlang1.sty 2025/11/14 1.11b listings language file -) -LaTeX Font Info: Trying to load font information for T1+pcr on input line 33 -0. +] [9] [10{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/share/te +xmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/share/texmf-dist/fonts/enc/dvip +s/lm/lm-rm.enc}] +LaTeX Font Info: Trying to load font information for T1+pcr on input line 25 +7. (/usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. -) [17{/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc}] -Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i -nput line 336. - [18] [19] -Overfull \hbox (15.3443pt too wide) in paragraph at lines 393--394 -\T1/lmr/m/n/12 Pi po-u-it knihovny Ze-roMQ vy-tv-me ob-jekt `ctx = zmq_co -ntext(num_threads)`. +) [11{/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc}] +Overfull \hbox (0.28238pt too wide) in paragraph at lines 274--275 +[]\T1/lmr/m/n/12 Druhm p-stu-pem je po-s-ln zprv. V tomto p-stupu po-s +-laj pro-cesy zprvy [] +[12] + +File: graphics/layer_architecture.png Graphic file (type png) + +Package pdftex.def Info: graphics/layer_architecture.png used on input line 30 +8. +(pdftex.def) Requested size: 409.50119pt x 198.24504pt. + [13] [14 <./graphics/layer_architecture.png>] + +File: graphics/TcpIp.png Graphic file (type png) + +Package pdftex.def Info: graphics/TcpIp.png used on input line 342. +(pdftex.def) Requested size: 409.50119pt x 260.91075pt. + [15 <./graphics/TcpIp.png>] + +File: graphics/http2.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/http2.pdf used on input line 381. +(pdftex.def) Requested size: 196.5588pt x 161.2807pt. + +File: graphics/http3.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/http3.pdf used on input line 387. +(pdftex.def) Requested size: 196.5588pt x 147.48642pt. -Overfull \hbox (4.16487pt too wide) in paragraph at lines 403--404 +[16] [17 <./graphics/http2.pdf> <./graphics/http3.pdf>] [18] [19] + +File: graphics/quic_handshake.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/quic_handshake.pdf used on input line 453. +(pdftex.def) Requested size: 204.7506pt x 274.7626pt. + [20 <./graphics/quic_handshake.pdf>] +! Undefined control sequence. +l.482 ...váříme objekt kontextu pomocí \inlcpp + {ctx=zmq\_context(num\_thr... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.482 ...vláken specifikovaný parametrem \inlcpp + {num\_thread}. Když násl... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.482 ...read}. Když následně zavoláme \inlcpp + {zmq\_send(ctx, x)}, prot... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.482 ...ctx, x)}, protějšek klasického \inlcpp + {send(x)}, tak nedojde k b... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.482 ...o fronty, ze které pak vlákna z \inlcpp + {zmq\_context} tzv. \uv{kr... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + + +Overfull \hbox (92.69887pt too wide) in paragraph at lines 482--483 +\T1/lmr/m/n/12 Pi po-u-it knihovny Ze-roMQ vy-tv-me ob-jekt kon-textu po- +moc ctx=zmq_context(num_threads). + [] + +! Undefined control sequence. +l.484 To samé platí o \inlcpp + {zmq\_receive}, které si v pozadí skládá ... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.492 ...ronní pomocí klíčového slova \inlcpp + {async}. Zavoláním takov... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.492 ...ním takové funkce speciálním \inlcpp + {await} voláním způsob... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.492 ...kce, kterou jsou zavolali pomocí \inlcpp + {await}. Toto volání tak... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + + +Overfull \hbox (13.61082pt too wide) in paragraph at lines 492--493 \T1/lmr/m/n/12 Populrn im-ple-men-tac, kte-rou vi-dme na-p-klad v Rust ne -bo C#, je async/await. +bo C#, je ^^R async/await^^P . [] -[20] [21] -Overfull \hbox (4.1038pt too wide) in paragraph at lines 451--452 -\T1/lmr/m/n/12 Pro m-en v-konu pro-gramu ser-veru po-u--vm v-born pro- -fi-ler Tracy. Je zdarma, - [] +[21] +! Undefined control sequence. +l.501 ...Pouze vytvoříme objekt kontextu \inlcpp + {asio\_context}, který m... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +! Undefined control sequence. +l.501 ...terý má frontu úkolů a metodu \inlcpp + {run}. Když z vlákna zav... +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. [22] [23] -Overfull \hbox (3.57536pt too wide) in paragraph at lines 509--510 -\T1/lmr/m/n/12 necraft pro Win-dows. Nej-prve vy-tvo-me re-gistr, co je ob-j -ekt typu `entt::registry`, +! Undefined control sequence. +l.623 ... a pozice). Vše jsme obalili do \inlcpp + {JoltPhysicsWorld}. +The control sequence at the end of the top line +of your error message was never \def'ed. If you have +misspelled it (e.g., `\hobx'), type `I' and the correct +spelling (e.g., `I\hbox'). Otherwise just continue, +and I'll forget about whatever was undefined. + +[24] +Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i +nput line 639. + [25] +Overfull \hbox (0.87991pt too wide) in paragraph at lines 683--684 +\T1/lmr/m/n/12 Stav hry re-pre-zen-tu-jeme kom-pletn ve td [][][][]. Ta ob- +sa-huje re-gistr z knihovny [] -[24] [25] [26] -Overfull \hbox (46.2356pt too wide) in paragraph at lines 581--582 -\T1/lmr/m/n/12 kdo se prv pi-po-jil a kdo od-po-jil. Tda na to m dv me-t -ody: [][][] +[26] + +File: graphics/client-server-architecture.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/client-server-architecture.pdf used on input + line 703. +(pdftex.def) Requested size: 409.50119pt x 271.8706pt. + [27] [28 <./graphics/client-server-architecture.pdf>] +Overfull \hbox (80.87257pt too wide) in paragraph at lines 741--742 +\T1/lmr/m/n/12 Program kli-enta se skld z tdy \T1/pcr/m/n/12 World\T1/lmr/m +/n/12 , kter re-pre-zen-tuje stav a \T1/pcr/m/n/12 ClientWorldController\T1/lm +r/m/n/12 , [] -[27] [28{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/share/tex -mf-dist/fonts/enc/dvips/lm/lm-rm.enc}] -Overfull \hbox (782.2338pt too wide) in alignment at lines 647--656 - [] [] [] + +Overfull \hbox (4.53065pt too wide) in paragraph at lines 741--742 +\T1/lmr/m/n/12 kter ob-sa-huje jed-no-du -dc lo-giku. -dc lo-gika p +o-sbr ka-dou ite-raci vstupy, [] -[29] [30] [31] -Overfull \hbox (2.99237pt too wide) in paragraph at lines 722--723 -\T1/lmr/m/n/12 do pro-to-kolu za-tm ne-pi-d-vali, pro-toe si stejn do pa-k -etu ukl-dme slo snmku, +[29] + +LaTeX Warning: Reference `sec:quicr' on page 30 undefined on input line 767. + + +Overfull \hbox (8.12425pt too wide) in paragraph at lines 779--780 +\T1/lmr/m/n/12 Vytvoili jsme tdu [][][][], kter m na roz-hran me-tody [] [] -[32] - + +Overfull \hbox (20.39532pt too wide) in paragraph at lines 779--780 +[][][][][][][][][]\T1/lmr/m/n/12 , [][][][] a [][][][]. Prvn me-toda na-stav +pro kon-cov bod [] + [] + +[30] + +LaTeX Warning: Reference `code:entity_spawn_message' on page 31 undefined on in +put line 794. + +[31] [32] + +File: graphics/grafana.png Graphic file (type png) + +Package pdftex.def Info: graphics/grafana.png used on input line 834. +(pdftex.def) Requested size: 409.50119pt x 132.9362pt. + [33 <./graphics/grafana.png>] + +File: graphics/300playerstrace.png Graphic file (type png) + +Package pdftex.def Info: graphics/300playerstrace.png used on input line 860. +(pdftex.def) Requested size: 409.50119pt x 120.74449pt. + [34 <./graphics/300playerstrace.png>] +[35] + +File: graphics/quicr_handshake.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/quicr_handshake.pdf used on input line 941. +(pdftex.def) Requested size: 409.50119pt x 299.82079pt. + +Overfull \hbox (3.49525pt too wide) in paragraph at lines 951--952 +[]\T1/lmr/m/n/12 Spolehlivost e kom-po-nenta [][][][], kter si udr-uje fro +ntu rmc, + [] + +[36] [37 <./graphics/quicr_handshake.pdf>] [38] + File: graphics/latencycomparison.pdf Graphic file (type pdf) -Package pdftex.def Info: graphics/latencycomparison.pdf used on input line 743 -. +Package pdftex.def Info: graphics/latencycomparison.pdf used on input line 100 +2. (pdftex.def) Requested size: 327.60219pt x 245.71564pt. - + File: graphics/integrationcomparison.pdf Graphic file (type pdf) Package pdftex.def Info: graphics/integrationcomparison.pdf used on input line - 749. -(pdftex.def) Requested size: 409.50119pt x 307.14322pt. - + 1010. +(pdftex.def) Requested size: 327.60219pt x 245.71564pt. + File: graphics/playerbenchmark.png Graphic file (type png) -Package pdftex.def Info: graphics/playerbenchmark.png used on input line 761. +Package pdftex.def Info: graphics/playerbenchmark.png used on input line 1022. + (pdftex.def) Requested size: 204.7506pt x 129.84302pt. - -File: graphics/OutboundArchitecture.png Graphic file (type png) - -Package pdftex.def Info: graphics/OutboundArchitecture.png used on input line -774. -(pdftex.def) Requested size: 409.50119pt x 145.32677pt. - [33 <./graphics/latencycomparison.pdf>] [34 <./graphics/integrationcomparison. -pdf> <./graphics/playerbenchmark.png>] [35 <./graphics/OutboundArchitecture.png ->] -LaTeX Font Info: Trying to load font information for TS1+lmr on input line 8 -36. - (/usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd -File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) [36{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}] + [39] [40 <./graphics/latencycomparison.pdf> <./graphics/integrationcomparison. +pdf>] +File: graphics/300playerstrace.png Graphic file (type png) + +Package pdftex.def Info: graphics/300playerstrace.png used on input line 1040. + +(pdftex.def) Requested size: 409.50119pt x 120.74449pt. + [41 <./graphics/playerbenchmark.png>] + +File: graphics/ecs_optimization_tracy_01.png Graphic file (type png) + +Package pdftex.def Info: graphics/ecs_optimization_tracy_01.png used on input +line 1051. +(pdftex.def) Requested size: 409.50119pt x 113.38686pt. + +File: graphics/ecs_optimization_tracy_02.png Graphic file (type png) + +Package pdftex.def Info: graphics/ecs_optimization_tracy_02.png used on input +line 1058. +(pdftex.def) Requested size: 409.50119pt x 199.59514pt. + [42 <./graphics/ecs_optimization_tracy_01.png> <./graphics/ecs_optimization_tr +acy_02.png>] +Underfull \hbox (badness 10000) in paragraph at lines 1099--1099 +[]|\T1/lmr/m/n/12 Nzev + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1103--1103 +[]|\T1/lmr/m/n/12 Fixn + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 1105--1105 +[]|\T1/lmr/m/n/12 Hashovac + [] + +[43] +Overfull \hbox (6.44025pt too wide) in paragraph at lines 1144--1145 +[][][][][][][][][][][][][] \T1/lmr/m/n/12 a [][][][][][][][][][][][][][][][]. K +ad + [] + +[44] +Overfull \hbox (5.32686pt too wide) in paragraph at lines 1148--1149 +[]\T1/lmr/m/n/12 Systmovou ar-chi-tek-turu vi-dme na ob-rzku [][]3.13[][]. V +i-dme, e [] + [] + + +File: graphics/zone_server_architecture.pdf Graphic file (type pdf) + +Package pdftex.def Info: graphics/zone_server_architecture.pdf used on input l +ine 1152. +(pdftex.def) Requested size: 409.50119pt x 269.24106pt. +[45 <./graphics/zone_server_architecture.pdf>] (/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty File: lstlang1.sty 2025/11/14 1.11b listings language file ) @@ -1508,71 +1823,27 @@ File: lstlang3.sty 2025/11/14 1.11b listings language file ) (/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty File: lstmisc.sty 2025/11/14 1.11b (Carsten Heinz) -) -Overfull \hbox (11.6933pt too wide) in alignment at lines 881--943 - [] [] [] - [] - - -ignored: Infinite glue shrinkage found in box being split [37] -ignored: Infinite glue shrinkage fo -und in box being split [38] -Overfull \vbox (0.47247pt too high) has occurred while \output is active [] - - -[39] [40{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathex.enc}] -Overfull \hbox (12.74097pt too wide) in paragraph at lines 995--996 -\T1/lmr/m/n/12 Pro sazbu li-te-ra-tury m ui-va-tel dv mo-nosti. Me po-u- -t slu-eb ba-lk \T1/lmr/m/sc/12 Bib\T1/lmr/m/n/12 L[]T[]X, - [] - - -LaTeX Font Warning: Font shape `T1/lmr/bx/sc' undefined -(Font) using `T1/lmr/bx/n' instead on input line 996. - - -Overfull \hbox (33.70378pt too wide) in paragraph at lines 1013--1014 -[][][][][][][][][][][]\T1/lmr/m/n/12 . Na da-nou zkratku se pak lze od-ka-zo-va -t jed-no-due, []. - [] - -[41] - -Package lipsum Warning: Unknown language 'latin'. Hyphenation patterns for -(lipsum) 'czech' will be used instead. - -\@gls@deffile=\write11 -\openout11 = `kidiplom.glsdefs'. - -Package hyperref Info: bookmark level for unknown proof defaults to 0 on input -line 1066. -[42] [43] -Package hyperref Info: bookmark level for unknown remark defaults to 0 on input - line 1070. -Package hyperref Info: bookmark level for unknown example defaults to 0 on inpu -t line 1074. -Package hyperref Info: bookmark level for unknown lemma defaults to 0 on input -line 1078. -Package hyperref Info: bookmark level for unknown consequence defaults to 0 on -input line 1082. -Package hyperref Info: bookmark level for unknown theorem defaults to 0 on inpu -t line 1086. - [44] [45] [46 - -] [47 +) [46] [47 ] [48 -] [49] +] +LaTeX Font Info: Trying to load font information for TS1+lmr on input line 1 +248. + +(/usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd +File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) [49 + +{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}] [50] No file kidiplom.acr. -[50 +[51 ] -LaTeX Warning: Empty bibliography on input line 1215. - -No file kidiplom.ind. +LaTeX Warning: Empty bibliography on input line 1284. +(./kidiplom.ind) enddocument/afterlastpage (AED): lastpage setting LastPage. (./kidiplom.aux) *********** @@ -1581,13 +1852,10 @@ L3 programming layer <2026-01-19> *********** -LaTeX Font Warning: Some font shapes were not available, defaults substituted. - - LaTeX Warning: There were undefined references. -LaTeX Warning: There were multiply-defined labels. +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. Package biblatex Warning: Please (re)run Biber on the file: @@ -1599,42 +1867,91 @@ Package logreq Info: Writing requests to 'kidiplom.run.xml'. ) Here is how much of TeX's memory you used: - 31791 strings out of 469481 - 588463 string characters out of 5469630 - 1700795 words of memory out of 5000000 - 59687 multiletter control sequences out of 15000+600000 - 713119 words of font info for 105 fonts, out of 8000000 for 9000 + 33766 strings out of 469481 + 635886 string characters out of 5469631 + 1771293 words of memory out of 5000000 + 61633 multiletter control sequences out of 15000+600000 + 692285 words of font info for 87 fonts, out of 8000000 for 9000 24 hyphenation exceptions out of 8191 - 110i,12n,125p,2606b,2308s stack positions out of 10000i,1000n,20000p,200000b,200000s + 110i,11n,125p,2637b,2312s stack positions out of 10000i,1000n,20000p,200000b,200000s pdfTeX warning (dest): name{section*.8} has been referenced but does not exist, replaced by a fixed one -pdfTeX warning (dest): name{glo:UPOL} has been referenced but does not exist, r -eplaced by a fixed one +pdfTeX warning (dest): name{subsubsection.3.14.1} has been referenced but does +not exist, replaced by a fixed one -pdfTeX warning (dest): name{1ind.ind} has been referenced but does not exist, r -eplaced by a fixed one +pdfTeX warning (dest): name{subsubsection.3.11.2} has been referenced but does +not exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.11.1} has been referenced but does +not exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.8} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.7} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.6} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.5} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.4} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.3} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.2} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.8.1} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.4.4} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.4.3} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.4.2} has been referenced but does n +ot exist, replaced by a fixed one + + +pdfTeX warning (dest): name{subsubsection.3.4.1} has been referenced but does n +ot exist, replaced by a fixed one -Output written on kidiplom.pdf (50 pages, 789781 bytes). +mmi12.pfb> + +Output written on kidiplom.pdf (51 pages, 1032333 bytes). PDF statistics: - 1073 PDF objects out of 1200 (max. 8388607) - 899 compressed objects within 9 object streams - 254 named destinations out of 1000 (max. 500000) - 804 words of extra memory for PDF output out of 10000 (max. 10000000) + 1037 PDF objects out of 1200 (max. 8388607) + 827 compressed objects within 9 object streams + 207 named destinations out of 1000 (max. 500000) + 754 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/kidiplom.lot b/kidiplom.lot index 2291cdd..6623008 100644 --- a/kidiplom.lot +++ b/kidiplom.lot @@ -1,7 +1,4 @@ \babel@toc {czech}{}\relax -\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{29}{table.1}% -\contentsline {table}{\numberline {2}{Seznam přepínačů}}{37}{table.2}% -\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{43}{table.3}% \babel@toc {czech}{}\relax \babel@toc {czech}{}\relax \babel@toc {english}{}\relax diff --git a/kidiplom.pdf b/kidiplom.pdf index 6a8f890..9ce0465 100644 Binary files a/kidiplom.pdf and b/kidiplom.pdf differ diff --git a/kidiplom.synctex.gz b/kidiplom.synctex.gz index 71ec4cc..8a4734e 100644 Binary files a/kidiplom.synctex.gz and b/kidiplom.synctex.gz differ diff --git a/kidiplom.tex b/kidiplom.tex index f155069..822633f 100644 --- a/kidiplom.tex +++ b/kidiplom.tex @@ -55,7 +55,7 @@ %% nesází (u theorems a sourcecodes výchozí) \documentclass[ -% master, + master, % program=ainfvs, % printversion, biblatex, @@ -69,8 +69,8 @@ index ]{kidiplom} -\title{Hra} -\title[english]{A style for thesis} +%\title{Hra} +%\title[english]{A style for thesis} @@ -82,13 +82,13 @@ %% použitím makra s uvedením jazyka jako nepovinného parametru. %% Název práce, česky a anglicky. Měl by se vysázet na jeden řádek. -\title{Styl pro text závěrečné práce} -\title[english]{A style for thesis} +\title{Metody optimalizace přenosu dat v distribuovaném systému} +\title[english]{Methods of data transfer optimizations in distributed systems} %% Volitelný podnázev práce, česky a anglicky. Měl by se vysázet na %% jeden řádek. Výchozí je prázdný. -\subtitle{Ukázkový text a dokumentace stylu v \LaTeX{}u} -\subtitle[english]{Sample text and documentation of the \LaTeX{} style} +%% \subtitle{Ukázkový text a dokumentace stylu v \LaTeX{}u} +%% \subtitle[english]{Sample text and documentation of the \LaTeX{} style} %% Jméno autora práce. Makro nemá nepovinný parametr pro uvedení %% jazyka. @@ -140,6 +140,7 @@ %% práce. \usepackage{lipsum} \usepackage{longtable} +\usepackage{svg} \begin{document} %% Sazba úvodních stran -- titulní, s bibliografickými údaji, s @@ -159,316 +160,376 @@ \section{Úvod} -V práci se budeme zabývat technikami a způsoby pro optimalizaci datového přenosu, ať už pro šířku pásma nebo odezvu. + + +Hry pro více hráčů jsou stále populárnější. Například na internetovém tržišti her Steam 9 z 10 nejhranějších her podporuje hru více hráčů 6 z nich dokonce ani nepodporuje hru jednoho hráče. Dokonce vznikly sporty v počítačových hrách, tzv. \uv{e-sporty}, ve kterých se utkávají profesionální týmy proti sobě a kompetetivních hrách pro více hráčů. Trochu jiný typ her pro více hráčů, ale o nic míň výdělečný, jsou masivně online hry pro více hráčů. Kompetetivní hry jsou rozdělené do zápasů pro pár hráčů a jsou optimalizované pro minimální odezvu mezi akcemi hráče a reakcí systému. Naopak MMO hry jsou masivní a zvládnou masivní online světy pro tisíce hráčů. Optimalizují pro obrovský datový tok z tisíce klientů na server, který musí rozdělit svou zátěž na vícero dalších serverů. + +V práci se zaměřujeme na metody optimalizace datového přenosu v síťových systémech ve hrách více hráčů. To znamená nejen velikost dat, ale i odezvu mezi vstupem hráče a reakcí stavu hry. Tyto optimalizace jsou obecné pro síťové systémy, distribuované nevyjímaje. Hru stavíme na vlastním herním enginu tak, abychom různé algoritmy měli pod kontrolou. Například jsme vytvořili vlastní protokol pro obousměrné posílání spolehlivých i nespolehlivých zpráv zvaný QUICr. Popíšeme, jakým způsobem jsme optimalizace měřili a jaké metriky jsou k tomu potřeba. + +% Vytvořili jsme hru vlastní herní engine a v něm hru pro více hráčů. Implementovali jsme nástroje pro různé optimalizace přenosu dat. Analyzovalili jsme výkon pomocí různých nástrojů a výsledky demonstrujeme. Nesoustředíme se jen na síťové protokoly, ale i na koncové body, které potřebují posíláním informací koordinovat a kompresovat. Změřili jsme různé datové struktury a naše výsledky představíme. +% V naší práci se zaměříme právě na síťové a distribuované systémy, které slouží pro hry. Zajímali nás optimalizace, které pro různé herní světy můžeme použít. Vytvořili jsme jednoduchou hru, ve které se hráči mohou pohybovat. Hra pro komunikaci mezi klienty a servery využívá náš vlastní protokol QUICr, který umožňuje posílat zprávy spolehlivě i nespolehlivě pro snížení odezvy a eliminaci blokování. Představíme formu serializace, která kombinuje možnost vlastního rychlého zápisu, ale pro zprávy využívá fallback ProtoBuf. + + + + + \newpage +% Distribované systémy +% - 1. Základní popis síťových systémů: centralizované a distribuované +% - 2. Motivace: Expanze a integrace +% - 3. Vlastnosti: Škálovatelnost, Robustnost, Odezva +% - 4. Zmínit World Wide Web nebo DNS +% +% Komunikace +% - 1. Jak probíhá komunikace v distribuovaných systémech bez sdílené paměti +% - 2. Dva přístupy: MOM a RPC +% - 3. Middleware, např. HTTP nebo RPC +% +% Počítačová síť +% - 1. Popsat jak vlastně jsou počítače propojeny +% - 2. Co je to síť a jak funguje +% - 3. TCP/IP model - vrstvy. Každý protokol poskytuje službu +% - 4. Popsání protokolů v aplikační vrstvě: HTTP/1 2 a 3 +% - 5. Popsání protokolů v transportní vrstvě, včetně QUIC +% - 6. Popsání IP, především jak funguje politika fronty na switchi a fragmentace +% +% Sockety +% - 1. Představit rozhraní transportní vrstvy přes Berkeley Sockety +% - 2. Ukázat další rozhraní jako ZMQ nebo Boost ASIO +% - 3. Představit asynchroní posílání zpráv + \section{Distribuované systémy} -V této kapitole si představíme problematiku distribuovaných systémů a princip jejich fungovaní. Distribuované systémy jsou takové, které svůj úkol plní pomocí více počítačů, propojených v jedné síti. Příkladem takové sítě je Internet, která je největší a skládá se z mnoha podsítí. Výhoda oproti paralelním systémům je spolehlivost a škálovatelnost. +V této kapitole představíme distribuované systémy. Popíšeme, na čem stojí a jaké jsou cíle, pokud se takový systém rozhodneme implementovat. Začneme od síťových systémů, na kterých jsou distribuované systémy stavěné. Ukážeme softwarové a systémové architektury v distribovaných systémech. Poté podrobněji rozebereme komunikaci v síti. -\begin{definition}[Počítačová síť] - Skupina komunikujících počítačů, které komunikují s ostatními v síti pomocí komunikačních protokolů, se nazývá počítačová síť. -\end{definition} -Počítačovou síť si lze představit jako graf, kde vrcholy jsou jednotlivé počítače a hrana je přímé spojení mezi dvěma počítači, jako třeba měděný kabel nebo optické vlákno. Každý počítač v síti, neboli vrchol, má síťovou adresu, jeden nebo více procesů a vlastní paměť, kterou mezi sebou nemohou počítače sdílet. Namísto sdílené paměti musejí vrcholy komunikovat pomocí zpráv. +Počítačový systém se skládá ze služeb, každá implementovaná jako kolekce procesů, které dohromady plní společný úkol. Moderní systémy jsou ale čím dál větší a úkoly, které musí plnit, jsou složitější. To vedlo ke vzniku síťových systémům, ve kterých jsou procesy rozmístěné přes více počítačů a komunikují spolu posíláním zpráv. Výhod je hned několik. Část systému může být umístěna počítači blíž zákazníkovi a snížit tak odezvu. Když jeden proces selže, může být jiný, který plní stejnou službu a může systém udržet v provozu. Konkrétní skupinou jsou distribuované systémy, které mají mnoho procesů rozmístěných přes více počítačů, které aktivně spolupracují a jeví se jako jeden celek. -\begin{definition}[Distribuovaný systém] - Systém je \uv{distribuovaný}, když svůj úkol plní pomocí více počítačů, které jsou propojené v síti a mohou tak spolu komunikovat. -\end{definition} -Podobné jsou paralelní systémy, které také řeší společný problém více procesy, které běží souběžně. Rozdíl je ten, že v distribuovaném systému má každý proces vlastní paměť, kterou mezi sebou počítače nemohou sdílet. Procesy mezi sebou musejí komunikovat posíláním zpráv. +% Počítačový systém se skládá ze služeb, každá je implementována jako kolekce procesů a dohromady plní společný úkol. Systém, ve kterém jsou procesy služeb na různých počítačích propojených v síti, se nazývá \uv{síťový systém}. Zmíníme dva důvody, proč procesy takto rozmístit. Prvním může být záměr \uv{integrace} více existujících systémů. Například se v průběhu života software zjistí, že neposkytuje všechny potřebné služby. Mohou se změnit požadavky nebo se rozšíří uživatelská základna o skupinu, se kterou se původně nepočítalo. Pokud tuto službu poskytuje jiný systém na jiném počítači, můžeme oba systémy spojit. Druhým důvodem může být \uv{expanze}, kdy jeden počítač nesplňuje požadavky na výkon. + +% Síťové systémy můžeme dále rozdělit na \uv{decentralizované} a \uv{distribuované}. Decentralizované jsou většinou ty, které se rozrostly přes více počítačů kvůli integraci. Distribuovaný systém se snaží být dostatečně rozprostřen přes více počítačů tak, aby dokázal plnit svůj úkol. Například aby umožňil snadno přidávat do systému služby, měl dostatečně nízkou odezvu nebo aby bylo možné ho škálovat pro velké množství požadavků. + +Příkladem distribuovaného systému je World Wide Web, zkráceně WWW. Jedná se o informační systém, který umožňuje prohlížet, ukládat a odkazovat dokumenty umístěné na internetu. Dokumenty mohou být například webové stránky, obrázky nebo videa a jsou uloženy na webových serverech. Odkazy na ně jsou ve formátu URL. Distribuovanost systému umožňuje snadné rozšíření, protože každý může snadno přidat svůj server se svými dokumenty, které se tak stanou dostupné v systému. To zároveň rozloží zátěž přes více počítačů a systém tak zvládá miliardy požadavků denně. Zároveň se celý systém jeví jako jeden celek, který z URL adresy vyhledá server a dokument vrátí. + + +\subsection{Architektury} + +V praktické části jsme navrhli síťový systém. V návrhu jsme využívali známé vzory, které představíme. Návrh systému rozdělíme na dvě části: softwarovou a systémovou architekturu. V softwarové architektuře řešíme komponenty a konektory mezi nimi. Mezi typy softwarových architektur patří například vrstvená, orientovaná na služby nebo publish-subscribe. Druhá část architektury, která řeší role jednotlivých služeb, se nazývá \uv{systémová architektura}. Mezi příklady patří peer-to-peer nebo klient-server. + +Pro ilustraci rozdílu představíme známý příklad třívrstvé softwarové architektury: databázová, výpočetní a frontendová vrstva. Systémová architektura definuje, že databáze jako služba pro výpočetní vrstvu má roli serveru. Naopak služba pro replikaci ve skupině databázových serverů má roli peer-to-peer. Typy si rozebereme podrobněji v této kapitole. + +\subsubsection{Softwarová architektura} + +V první části se zaměříme na softwarovou architekturu. Budeme řešit komponenty a konektory mezi nimi. Představíme tři známé vzory: vrstvená architektura, architektura orientovaná na služby a publish-subscribe architektura. + +Pokud komponenty organizujeme do vrstev, kde komponenta ve vrstvě $N$ může volat rozhraní vrstvy $N-1$, říkáme tomu \uv{vrstvená architektura}. Příkladem je vrstva operačního systému, nad kterým je vrstva uživatelského prostoru. Občas je možné, aby nižší vrstva volala vyšší, ale mělo by se dít přes rozhraní definované nižší vrstvou, které vyšší vrstva pouze implementuje. Příkladem je operační systém, který oznamuje událost aplikaci. Aplikace proto registruje funkci, která se v případě události zavolá. Rozhraní funkce ale určuje vrstva pod ní: operační systém. + +Nevýhodou vrstvené architektury je silná provázanost mezi vrstvami. Namísto toho lze software organizovat do nezávislých entit, kde každá zapouzdřuje službu. Takovým entitám se říká: služba, objekt nebo mikroslužba. Na komponenty se můžeme dívat jako na objekty a konektory mezi nimi jsou volání metod. Instance objektu mohou být rozmístěny na více počítačích. To, že jiný objekt je na jiném počítači, by mělo být skryté. Když chce klient použít jiný objekt, lokálně si vytvoří jeho instanci, která ale po zavolání metody volání zabalí do zprávy a odešle objektu, který metodu implementuje. Tomuto modelu se říká \uv{remote procedure call}, nebo zkráceně RPC. Klient obdrží zprávu s výsledkem, kterou rozbalí a pokračuje v běhu. Lokální instanci se někdy říká \uv{proxy} nebo \uv{klient-stub}. + + +Co občas může vadit je, že jsou služby \uv{referenčně vázané}. To znamená, že služby musejí znát adresu nebo jméno jiné, pokud ji chtějí používat. Od tohoto omezení můžeme upustit například tím, že budou \uv{publikovat} události do různých \uv{témat} a dělat na tyto témata dotazy. Pokud například služba publikuje událost do tématu $A$, jiná služba, která udělá dotaz na téma $A$, dostane právě tuto událost. Odesílatel tak neví, kdo zprávu zpracuje, kolikrát a kdy. Implementace je přes \uv{brokera}, který slouží jako jednotný bod pro všechny procesy, do kterého publikují události a broker je třídí vhodným jiným procesům. Tento princip lze využít u systémů pro hry více hráčů pro komunikační kanály. Klient hráče chce například napsat do lokálního kanálu pro město, ve kterém se v herním světě nachází. Komponenta pro chatovou službu tuto zprávu zařadí do správného kanálu a rozešle klientům, kteří tento kanál také odebírají. + + + + +\subsubsection{Systémové architektury} \label{sec:system_architecture} + +Pro systémové architektury představíme a využijeme dva vzory: asymetrickou klient-server a symetrickou peer-to-peer. + +Asymetrickou architekturou, kde je komponenta buď server, nebo klient, se nazývá \uv{klient-server}. Pouze klienti mohou serverům posílat dotazy a dostávat od nich odpovědi. Vztah je tedy asymetrický. Příkladem jsou webové servery a webové prohlížeče, které fungují jako klienti. Tento model se hodí například pro autoritativní server, který určuje stav hry a pouze jej replikuje klientům. Usnadňuje synchronizaci jednotlivých klientů a zvyšuje efektivitu, protože se účastníci nemusí shodovat, ale pouze přijmout fakt ze serveru. + +Symetrická architektura, kdy obě strany jsou si rovny, se nazývá \uv{peer-to-peer}. Znamená to, že obě strany mohou posílat požadavky a zprávy na druhou stranu. Využívá se například při replikaci, kdy máme několik replik, které jsou si rovny. Pouze řešíme, která vlastní jaký zdroj tak, aby nedošlo ke konfliktu dvou replik při psaní konkrétního záznamu. Libovolná replika má ale možnost odeslat svůj stav jiné, protože jsou si rovny. Tento model je vhodný například pro horizontální škálování stavových serverů, které si rozdělují část stejné služby. Například vícero serverů může zpracovávat různé části herního světa a předávají si mezi sebou entity, které mají na starost. + + + + + + + + +\subsection{Komunikace} + +V síťovém systému není sdílená paměť. Místo toho se pro komunikaci mezi procesy používá posíláním primitivních zpráv pomocí systémových volání. To se snažíme v distribuovaných systémech skrýt za vhodnějším rozhraním. V této podkapitole si představíme různé abstrakce a v podkapitole \ref{sec:NetworkCommunication} ukážeme podrobněji, jak se taková komunikace realizuje. + +Pro schování komunikace a platformy, na které proces běží, se využívá \uv{middleware}. Jedná se o komponentu, která leží mezi aplikací a operačním systémem a poskytuje komunikační služby. Není závislá na žádné konkrétní aplikaci. Příkladem je distribuovaná služba DNS, která podle doménového jména vyhledá síťovou adresu, jako například adrese \texttt{www.seznam.cz} přiřadí síťovou IP adresu \texttt{77.75.77.222}. + +Pro různé účely a situace máme jiné modely komunikace. Například email je typický příklad \uv{persistentní} komunikace. Po odeslání si persistentní middleware zprávu uloží do té doby, dokud ji příjemce nepřijme. To znamená, že proces příjemce nemusí běžět v době, kdy odesílatel odesílá. + +Na druhou stranu máme \uv{transientní} komunikaci, kdy zpráva je uložena jen po dobu, kdy běží proces odesílatele a příjemce. To znamená, že pokud příjemce není dostupný, zprávu nikdy nepřijme. Protokoly v transportní vrstvě jsou transientní. + +Dále může být komunikace \uv{synchronní} nebo \uv{asynchronní}. Asynchronní znamená, že odesílatel pokračuje v běhu okamžitě po odeslání zprávy. Ta se dočasně uloží v middleware do doby, než se odešle. Na druhou stranu při synchronní komunikaci volající proces zastaví, dokud neobdrží odpověď z cílového procesu. Obecně tedy definujeme tři body, kde může nastat synchronizace (proces odesílatele pokračuje v práci). Zaprvé hned poté, co middleware převzal zprávu a zodpovědnost za její doručení. Zadruhé v moment, kdy byla zpráva doručena druhému procesu. Zatřetí až v moment, kdy druhá strana zpracovala požadavek a dostali jsme odpověď. + + +\subsubsection{Modely pro komunikaci} + +Pro každý účel musíme vhodně zvolit konfiguraci perzistence a synchronizace. Představíme dva modely komunikace, které posílání primitivních zpráv skrývají a jsou implementovány jako middleware: Message Oriented Middleware (MOM) a Remote Procedure Call (RPC). + +Prvním přístupem je Remote Procedure Call, který procesu umožňuje zavolat lokální proceduru s implementací na jiném počítači. Když proces A zavolá proceduru na počítači B, A se pozastaví a začne se vykonávat na B. Jakmile se dokončí, pošle se výsledek zpět na A, které poté pokračuje. Tento model je synchronní a transientní. Cílem je, aby volání vypadalo jako by implementace byla lokální a skrýt tak komunikaci mezi počítači. + +Jedná se o intuitivní řešení, ale přináší pár problémů. Dva počítače mají různý adresní prostor, proto je třeba vyřešit, jak bude procedura využívat ukazatele do svého adresního prostoru, nebo jestli tuto vlastnost zakáže. + +Druhým přístupem je posílání zpráv. V tomto přístupu posílají procesy zprávy na logické cíle pomocí systémového jména, nikoliv fyzické adresy. Tento přístup méně schovává fakt, že procesy jsou rozmístěny na více počítačích a abstrakce z fyzických adres na jména pomáhá. Využívá se v architektuře publish-subscribe nebo občas v architektuře orientované na služby. + +Opět je potřeba, aby se dva koncové body shodli na významu bitů jednotlivých zpráv. Většinou jsou v programu zprávy reprezentovány objektem, který je pro síť převeden na n-tici bitů, procesem zvaným \uv{serializace}. V praktické části představíme serializaci podrobněji. + +% - Proces A chce poslat zprávu procesu B +% - Ve svém adresním prostoru zprávu sestaví +% - Systémovým voláním zprávu odešle +% - Procesy se musejí dohodnout na významu bitů + +% Druhým přístupem je posílání zpráv. V tomto přístupu aplikace posílají zprávy na čistě logický cíl. Např. identifikovaný typem zprávy. Aplikace pak může projevit zájem o různé typy zpráv a middleware se postará o to, že tyto zprávy aplikace dostane. Přístupu se říká \uv{publish-subscribe}. + + + + +\subsection{Počítačová Síť} \label{sec:NetworkCommunication} + +Nedílnou součástí distribuovaného systému je síť, přes kterou mohou procesy posílat primitivní zprávy. V této podkapitole se zaměříme na komunikaci mezi dvěma procesy v síti, a to i těch, které nejsou součástí jednoho síťového systému. Počítačová síť je skupina propojených počítačů, které si mezi sebou přenášejí data. Například lokální sítě (LAN) propojují až tisíce počítačů, které jsou geograficky blízko, například v rámci jedné budovy. Rozsáhlé sítě (WAN) propojují miliony různých zařízení po celém světě. Příkladem je síť Internet. + +Počítačovou síť si lze představit jako graf, ve kterém počítače představují vrcholy a fyzická média mezi nimi jsou hrany. Vrcholy dále dělíme na \uv{koncové body} a \uv{propojovací prvky}. Koncové body jsou počítače, mobilní telefony a jiná zařízení, na kterých běží procesy. Dva procesy na dvou různých počítačích si mezi sebou mohou posílat zprávy. Propojovací prvky jsou přepínače, rozbočovače a opakovače. Ty naopak slouží pouze k směrování zpráv po síti. Využití je propojení skupiny počítačů do sítě přes jedno spojení jako vidíme na obrázku TODO. Propojovací body jsou E a D. Není potřeba připojovat každý počítač s každým. + +Dva počítače, přímo propojené fyzickým médiem, komunikují posíláním n-tic bytů zvané \uv{rámce}. Variantou jsou \uv{přepínané} sítě, které nemusejí mít mezi všemi dvojicemi počítačů přímé spojení, ale využívají \uv{přepínače}. Proces, kdy doručujeme zprávu na cílový počítač přes vícero přepínačů se nazývá \uv{směrování}. Každý vrchol v takové síti musí mít přiřazenou unikátní \uv{síťovou adresu} a posílali se formátované rámce zvané \uv{pakety}. Ty se skládají z hlavičky, ve které najdeme informace ke směrovaní, a tělu obsahujícím samotnou přenášenou zprávu. \subsection{Komunikace v síti} -V síti počítače komunikují pomocí komunikačního protokolu, kterému musejí rozumět. Komunikační protokol je soubor pravidel pro výměnu informací mezi počítači. Mají často různé charakteristiky, např. jestli jsou vyžadují navázání spojení nebo ne. To chápejme jako domluvu mezi dvěma stranami před tím, než začne přenos aplikačních dat pro systém. +V této části představíme jak je realizována komunikace v síti. Aby si dva počítače navzájem rozuměly, musejí se shodnout na významu jednotlivých bitů rámců, které si mezi sebou budou posílat. K takové definici slouží \uv{komunikační protokol}: soubor pravidel pro výměnu informací mezi počítači. Definuje syntaxi, sémantiku a synchronizaci zpráv. -Nejčastěji se strany domlouvají na tajném klíči pro symetrické šifrování zpráv mezi sebou tak, aby nemohli být odposlouchávány. Dále si mohou vyměnit informace o verzi protokolu a omezeních, jako rychlost přenosu apod. Opakem jsou protokoly bez připojení. V takovém protokolu může na počítač A přijít zpráva z počítače B, o kterém A nemuselo nikdy předtím slyšet. Protokol pak může mít definované různé chování pro tento případ. +Každý protokol poskytuje komunikační služby. Tyto služby rozdělujeme na dvě skupiny: ty co před komunikací navážou spojení a ty co ne. V prvním případě musejí obě strany přijmout a navázat spojení a potencionálně se domluvit na jeho dalších parametrech. Jakmile jejich komunikace skončí, spojení se ukončí. Příkladem takové služby je telefoní linka. V druhém případě může odeslat zprávu kdykoliv a bez předchozího upozornění druhé strany. Příkladem takové komunikace je posílání emailu. -\begin{definition}[Komunikační protokol] - Soubor pravidel pro výměnu informací mezi počítači se nazývá \uv{komunikační protokol}. -\end{definition} +\subsubsection{Rodina protokolů TCP/IP} + +Rodina protokolů pro komunikaci v síti Internet je TCP/IP. Jedná se o více protokolů organizovaných do vrstev, kde každá může používat jen tu pod ní. Vrstvenou architekturu vidíme na obrázku \ref{fig:layer_architecture}. Vrstva $N$ používá rozhraní vrstvy $N-1$. Každá vrstva poskytuje komunikační služby. Počítač A i B tak vidí stejnou službu. Představme si, že rozhraní má dvě funkce: pro čtení a pro zápis. Aplikace do vrstvy $N$ zapíše zprávu, kterou chce, aby si proces využívající stejnou službu, ale na druhém počítači, mohl přečíst. Je potřeba, aby vrstva zapsala zprávu ve formátu, kterému bude rozumnět strana A i strana B. Tento formát je právě protokol, jak vidíme na obrázku \ref{fig:layer_architecture}. + +\begin{figure} + \begin{center} + \includegraphics[width=1\textwidth]{graphics/layer_architecture.png} + \end{center} + \caption{Vrstvená architektura TODO předělat} + \label{fig:layer_architecture} +\end{figure} +Název se skládá ze dvou důležitých protokolů: IP (Internet Protocol) a TCP (Transmission Control Protocol). IP slouží pro směrování paketů a TCP pro řízení přenosu. IP umožňuje komunikaci libovolných dvou uzlů počítačů v propojených sítích. TCP zajišťuje spolehlivý obousměrný přenos dat mezi procesy na dvou počítačích (ne nutně různých). +Protokol IP má za úkol doručit paket od odesílatele na příjemce pouze podle IP adresy, která je v hlavičce paketu. IP nenavazuje spojení a nezaručuje doručení. Důvodem je princip \uv{end-to-end}, který říká, že body mezi odesílatelem a příjemcem, jako routery a přepínače, by měli být co nejjednodušší. Spolehlivost musejí zaručit až dva koncové body, například číslováním paketů a sledováním stavu doručení. V případě, že paket chybí, ho musí odesílatel odeslat znova. -\subsection{TCP/IP} +Router udržuje frontu příchozích paketů, která má fixní velikost. Jakmile objem příchozích paketů překročí kapacitu fronty, router má různé politiky, jak se v takové situaci zachovat. Nejběžnější je politika \uv{tail-drop}, kdy paket zahodí. Proto musejí koncové body hlídat a měřit zahlcení sítě. Měli by hlídat, jak moc paketů se ztrácí a případně snížit frekvenci odesílání. V TCP/IP se o to stará protokol TCP, který si má frontu paketů, které musí odeslat a udržuje si ve frontě okno paketů, které jsou odeslané ale nepotvrzené neboli \uv{in-flight}. Pokud není potvrzeno až příliš paketů, okno zmenší a tím sníží počet paketů, které mohou být najednou v síti. -Rodina protokolů pro komunikaci v síti Internet se nazývá TCP/IP. Název se skládá ze dvou nejdůležitějších protokolů: IP, neboli Internet Protocol a TCP (Transmission Control Protocol) - protokol pro řízení přenosu. IP umožňuje komunikaci libovolných dvou uzlů počítačů v propojených sítích. TCP zajišťuje spolehlivý obousměrný přenos dat mezi procesy na dvou počítačích (ne nutně různých). - -Síťová komunikace je rozdělena do několika vrstev, každá s jinou zodpovědností. Jednotlivé vrstvy pak mezi sebou komunikují, podobně jako vidíme na obrázku . Konkrétně architektura TCP/IP je rozdělena do čtyř vrstev: aplikační, transportní, síťová a síťové rozhraní. Každá vrstva obsahuje vlastní protokoly, které lze měnit podle toho, co je třeba. +Konkrétně architektura TCP/IP je rozdělena do čtyř vrstev: aplikační, transportní, síťová a síťové rozhraní. Každá vrstva obsahuje množinu protokolů a pro každou situaci lze sestavit ideální čtveřice. Vrstvy podrobněji představíme. \begin{description} - - \item[{Síťové rozhraní}] \hfill \\ - Nejnižší vrstva, která se stará o přenos přes fyzické médium. Pro různé sítě bude vyžadovat různé protokoly. Příkladem jsou Ethernet, Token ring, apod. - - \item[{Síťová}] \hfill \\ - Pro adresaci máme vrstvu síťovou. Ta směruje a předává jednotlivé datagramy. Příkladem protokolů jsou IP, ARP, RARP nebo IPSEC. Je nutné, aby stejně jako vrstva síťového rozhraní, byla implementována ve všech prvcích sítě. - + \item[{Aplikační}] \hfill \\ + Nejvyšší je \uv{aplikační} vrstva, ve které jsou aplikace. Příkladem protokolů jsou FTP, SMTP, HTTP nebo gRPC. + \item[{Transportní}] \hfill \\ - Předposlední vrstva je transportní. Tato vrstva je rozbalena až na koncových bodech, nikoliv po cestě. Není totiž důležitá pro směrování packetů. Stará se o to, jaké packety přišli, jestli nejsou poškozené a nebo jestli jsou všechny. Příkladem je TCP, UDP nebo QUIC. - - \item[{Aplikační}] \hfill \\ - Poslední vrstva je aplikační a v ní jsou právě aplikace. Příkladem protokolů jsou HTTP nebo gRPC, které spadají do kategorie tzv. middleware. To znamená, že protokol není nutně specifický pro konkrétní aplikaci. + Druhá vrstva je \uv{transportní}. Tato vrstva, stejně jako aplikační, je rozbalena až na koncových bodech, jak vidíme na obrázku \ref{fig:tcpip}. Proto se jim někdy říká end-to-end protokoly. Není totiž důležitá pro směrování paketů. Stará se o to, jaké přišli, v jakém pořadí a jestli nejsou poškozené. Příkladem protokolů jsou TCP, UDP nebo QUIC. + + \item[{Síťová}] \hfill \\ + Pro adresaci je síťová vrstva. Ta směruje a předává jednotlivé datagramy. Příkladem protokolů jsou IP, ARP, RARP nebo IPSEC. Je nutné, aby stejně jako vrstva síťového rozhraní, byla implementována ve všech vrcholech na cestě mezi dvěma počítači, které chtějí komunikovat přes internet. + + \item[{Síťové rozhraní}] \hfill \\ + Nejnižší vrstva, která se stará o přenos přes fyzické médium. Pro různé média bude vyžadovat různé protokoly. Příkladem jsou Ethernet, Token ring, apod. \end{description} -V práci se zaměříme na rodinu protokolů TCP/IP, která na síťové vrstvě využívá Internet protokol a na transportní TCP nebo UDP. Na obrázku TODO vidíme, jak mezi sebou jednotlivé vrstvy komunikují. Aplikace na počítači $A$ odešle zprávu, kterou počítač $D$ uvidí ve své instanci aplikace. Vrstva zná pouze vrstvu pod sebou. Plnou čarou vidíme datový tok zprávy, jak putuje přes jednotlivé vrstvy. Šrafovaná čára reprezentuje abstrahovaný datový tok, tak jak ho vidí jednotlivé vrstvy, které neřeší vrstvu pod nimi. Počítače B a C jsou tzv. redistribuční body. Všimněme si, že se vůbec nedostanou do transportní nebo aplikační vrstvy, pouze si rozbalí IP paket a zjistí, kam mají pakety posílat dál. Vrstva síťového rozhraní pracuje s různými médii, jak také vidíme na obrázku. ř +Na obrázku \ref{fig:tcpip} vidíme, jak mezi sebou jednotlivé vrstvy komunikují. Aplikace na počítači $A$ zapíše do transportní vrstvy, kterou počítač $D$ ze stejné vrsvy přečte. Vrstva zná pouze vrstvu pod sebou. Plnou čarou vidíme datový tok zprávy, jak putuje přes jednotlivé vrstvy. Šrafovaná čára reprezentuje abstrahovaný datový tok tak, jak ho vidí vrstva. Počítače B a C jsou propojovací body. Všimněme si, že se nepoužívají transportní nebo aplikační vrstvy, pouze si rozbalí IP paket a zjistí, kam mají pakety posílat dál. Vrstva síťového rozhraní pracuje s různými médii, jak také vidíme na obrázku. \begin{figure} \begin{center} \includegraphics[width=1\textwidth]{graphics/TcpIp} \end{center} + \caption{Komunikace vrstev TCP/IP} + \label{fig:tcpip} \end{figure} -Vrstvy jsou modelované pomocí hlaviček. Poslaný paket obsahuje hlavičku pro každou vrstvu. Nejnižší (linková) vrstva, např. s Ethernet protokolem, přenáší \uv{rámce}. Síťová vrstva s Internet protokolem přenáší IP pakety a hlavička obsahuje IP adresu odesílatele, příjemce a další informace potřebné k nasměrování rámce. TCP protokol přenáší \uv{segmenty} a UDP \uv{datagramy}. - -% Zaměřím se na tzv. rodinou protokolů TCP/IP která definuje, jak má probíhat komunikace v síti Internet, na kterou bych se v práci chtěl zaměřit. Síť internet je celosvětová síť sítí, na které najdeme webové stránky, souborová úložiště a informační systémy. Problém jakékoliv komunikace, včetně té na internetu, je propustnost, která je omezená. Malá propustnost může způsobit pomalé načtení webové stránky, což může potenciálního zákazníka odradit. Nebo například příliš opožděné reakce v informačním systému, který tak může snižovat produktivitu. - -\subsection{Architektury} - -Distribuované systémy mají různé architektury. Liší se např. v tom, kdo má v systému jak velké slovo a kdo komunikuje s kým. My zmíníme dvě: klient-server a peer-to-peer. - -\subsubsection{Klient-Server} - -První architekturu, kterou zmíníme, je klient-server. Vrcholy v síti jsou rozděleny na - -\subsubsection{Peer-to-Peer} - -\subsection{Rodina protokolů TCP/IP} - -Mezi uzly v síti je potřeba komunikovat. Narozdíl od komunikace mezi procesy na stejném počítači, nemáme k dispozici sdílenou paměť. Komunikace v síti je založena na posílání primitivních zpráv. Primitivních znamená formou n-tice bytů. Pokud proces A chce poslat zprávu procesu B, který je na jiném počítači, tak sestaví zprávu M. Tuto zprávu odešle procesu B pomocí systémového volání `send`. Toto systémové volání podporuje většina operačních systémů. Proces B jiným systémovým voláním `read` zprávu přečte a může na ni zareagovat, například provedením výpočtu a zasláním výsledku zprávou zpět na proces A. V této interakci mezi procesy počítáme s tím, že se oba shodnou, co jednotlivé bity ve zprávě znamenají. - -% ref: https://cs.wikipedia.org/wiki/TCP/IP -Komunikační protokol je množina pravidel, která určují syntaxi a význam jednotlivých zpráv při komunikaci. - -Síťová komunikace je rozdělena do vrstev. Každá vrstva má svou zodpovědnost. Internet protokol, neboli IP, určuje navigaci zpráv v síti. IP adresa počítače je protějšek adresy domu. - -\subsection{Protokoly v transportní vrstvě} - -Nejčastější protokoly transportní vrstvy pro komunikaci v síti Internet jsou TCP a UDP. Problém jiných protokolů je, že ne všechny uzly je musí podporovat, což může způsobovat ztracené packety, nebo dokonce žádná cesta nemusí existovat. Protokoly TCP i UDP si představíme. - -\subsubsection{Sockety} - -Tyto protokoly se v aplikacích používají pomocí tzv. socketů. Jedná se o objekt, který se chová jako soubor. Můžeme ho otevřít, zapsat, přečíst a zavřít. Představím přesně tyto funkce, protože je budu v práci využívat. Konkrétně budu používat Linuxové rozhraní. - -Pro začátek komunikace pomocí těchto protokolů musím otevřít socket pomocí `socket`. Funkce má parametr pro typ protokolu, který chceme použít. Po vytvoření socketu ho můžeme navázat na konkrétní port pomocí `bind` s číslem portu. Pokud socket nenavážeme, přiřadí nám operační systém libovolný volný port. - -\subsubsection{TCP} - -Nejběžnější protokol je TCP. Při použití mezi sebou dva koncové body vytvoří spojení, přes které mohou posílat zprávy obousměrně. Protokol garantuje spolehlivé doručení dat v pořadí, ve kterém byla odeslána. Zároveň za Vás řeší tzv. congestion control. Jedná se o problém přetížení sítě, kdy v případě, že uzel může začít packety zahazovat. Příkladem může být omezení rychlosti stahování. Pokud platíte u poskytovatele 300Mb/s a začnou Vám chodit data rychlostí 500Mb/s, přebytečné packety se prostě zahodí. - -Po vytvoření socketu pro TCP můžeme použít funkci `accept`, která přijme první připojení ve frontě. Pokud se na náš socket někdo pokusí připojit, operační systém vykoná tzv. handshake a přidá nové připojení do fronty. Z fronty můžeme vytahovat právě pomocí `accept`. Zjistit, jestli ve frontě už nějaké připojení máme, můžeme pomocí funkce `listen`, která blokuje, dokud nějaké připojení nepřibyde. - -Nové přijaté připojení bude mít svůj vlastní socket s vlastním portem. Když zavoláme `write` a do argumentu dáme ukazatel na data a jejich délku, operační systém je odešle na druhou stranu, která s námi navázala spojení. Zaručí to, že na druhou stranu dojdou všechna data, nebo žádná. Druhá strana může pomocí `read` do alokované paměti přečíst to, co mu do socketu přišlo. Je nutné si uvědomit, že pokud zavoláme `write` pro data o délce řekněme 1000 bytů, tak druhá strana nemusí dostat všechna data pomocí jednoho `read`. Tento příkaz vrací počet bytů, které přečetl. Pokud tak přečte méně, než očekáváme, musíme provést volání znova, dokud nepřečteme vše co očekáváme. Mohlo by nás zarazit: jak může druhá strana vědět, kolik má očekávat dat? Pro to slouží tzv. komunikační protokol, který rozeberu v kapitole... - -\subsubsection{Spolehlivost} - -Popíšeme si, jak TCP zajišťuje spolehlivost pomocí ACK zpráv. Pokaždé, co dostane packet, odešle druhému koncovému bodu zprávu ACK s číslem packetu. V případě, že odesílatel ACK, neboli potvrzení o přijetí, nedostane, odešle packet znova. Příjemce si u sebe postupně skládá seřazený proud bytů. Jakmile je na socketu seřazená posloupnost bytů, umožní nám ji přečíst pomocí `read`. Pokud odešle jedna strana packety A, B a C, a příjemci přijde nejprve C a B, `read` nebude nic vracet, dokud nepřijde i packet A. Zmíním konkrétní případ, kdy to nemusí být žádoucí: Představme si, že A tvoří jeden příkaz a C a B tvoří druhý příkaz. Oba příkazy jsou na sobě nezávislé a příjemce je dokáže vykonat v libovolném pořadí. Stále potřebujeme spolehlivost doručení, ale stačí nám jen částečné uspořádání. - -Mezi aplikační protokoly využívající TCP patří HTTP/2, email, nebo SSH. - -Mezi nevýhodu bych zařadil to, že přenáší proud dat. Jinými slovy, v protokolu není proud rozdělen na jednotlivé, řekněme, "zprávy". Tuto logiku si musíme implementovat sami. Později si ukážeme, jak toho lze docílit. - -\subsubsection{UDP} - -Méně spolehlivá alternativa je UDP, neboli Unrealiable Datagram Protocol. Ten komunikuje pomocí tzv. datagramů, na rozdíl od proudu bytů, jako je tomu v případě TCP. Znamená to, že jedním systémovým voláním `write` odešleme právě jeden datagram, a na příjemci právě jedním `read` přečteme celý datagram. - -Zde již nebudeme volat `listen` ani `accept`. Výhoda je, že pokud zavoláme `write` a odešleme data o velikosti 100 bytů, je zaručeno, že druhá strana dostane celý tento blok právě jedním zavoláním `read`, ve kterém nebude nic dalšího. UDP totiž rozděluje data na datagramy, které v podstatě reprezentují packety. To usnadňuje práci s komunikačním protokolem. Protokol je nespolehlivý: datagramy mohou dorazit v jiném pořadí nebo vůbec. Jsou ale způsoby, jak spolehlivost, alespoň částečnou, implementovat. - - -\subsubsection{QUIC} - -QUIC je spolehlivý protokol transportní vrstvy od společnosti Google. Jeho cílem je být rychlejší varianta TCP, která využívá protokol UDP. Mezi dvěma koncovými body vytváří spolehlivé spojení. Na rozdíl od TCP umožňuje otevřít více proudů dat v jednom spojení a modelovat tak částečné uspořádání. Když se čeká na paket v TCP, tak se pozastaví celý tok dat, ale v případě QUIC se zastaví jen konkrétní proud. - -V protokolu se nachází pakety, rámce a čísla koncových bodů. Paketů máme více druhů a liší se především hlavičkou, ale také typem šifrování a její silou. Pro otevření spojení odešle klient serveru paket typu Initial, který má v hlavičce číslo lokálního spojení (LCID - Local connection ID) a číslo cílového spojení (DCID - Destination connection ID). Když server obdrží paket typu Initial, s číslem cílového spojení takovým, které nemá v registru, vytvoří úplně nové spojení s jiným číslem. Zpět klientovi pošle opět paket typu Initial a v hlavičce bude jako lokální číslo spojení mít nově vygenerované ID a jako cílové bude mít to, co klient poslal jako lokální. Touto výměnou se dva koncové body shodnou na svých číslech. Podotknu že čísla na obou koncích se liší, a prvotní cílové ID, které posílá klient, tak server nepoužívá. Jeho využití zmíním později. - -Paket v sobě obsahuje různé rámce, každý nějakého typu. Mezi typy patří třeba: ACK, CRYPTO, PADDING, PING, STREAM apod. Postupně je rozeberu. Rámec typu ACK funguje podobně jako v TCP a obsahuje čísla paketů, které chce druhé straně oznámit jako zpracované. Tento rámec najdeme právě v paketu typu Initial od serveru na klienta, kdy server chce oznámit klientovi, že paket přijal a zpracoval. Druhý rámec který už při handshake uvidíme je CRYPTO. Ten je v Initial paketu a obsahuje klient secret resp. server secret. Server je v moment, kdy mu přijde první Initial paket odvodit tzv. session key z klient secret a svého vygenerovaného server secret. Na klienta odešle paket Initial s CRYPTO rámcem obsahujícím server secret. Hned za ním odešle Handshake paket, který už je zašifrovaný pomocí session klíče a obsahuje certifikát serveru. Jakmile klient obdrží od serveru Initial a Handshake, může začít bezpečná komunikace. Druhá strana musí na všechny zprávy odpovědět pomocí ACK rámce. - -QUIC se tak shodl na tajném klíči i navázal spojení dvěma roundtripy, namísto čtyřmi, jako je tomu klasicky u TCP s TLS. Důvod je, že pakety může spojovat do jednoho datagramu. Takže server odpovídá na první Initial paket dvěma pakety: Initial a Handshake, ale v jednom datagramu. Dalším typem paketu, který už v tento moment může použít, jsou RTT-0 a RTT-1. RTT-0 lze poslat už v datagramu, ve kterém klient posílá na server Initial, a může obsahovat STREAM rámce. To znamená, že obsahuje užitečné aplikační data. Pokud nám tak v datagramu zbývá místo, nebo nechceme čekat na odpověď, můžeme okamžitě poslat RTT-0. Tento paket je sice šifrovaný, ale slabě a není odolný proti replay útoku, kdy útočník paket odposlechne a pošle znova. RTT-1 už je plně šifrovaný pomocí session klíče a nelze použít replay útok. - -Jak už jsem zmínil, užitečná aplikační data jsou ve STREAM rámcích. Pro začátek proudu ho musí jedna ze stran otevřít pomocí specifického rámce. Kdykoliv ho pak může zase zavřít. Dokonce je možné v jednom datagramu proud otevřít, poslat data a zase zavřít. Vidíme, že lze snadno modelovat částečné uspořádání a snížit blokování, které třeba v TCP běžně nastává. - -Čísla spojení, které mají dva koncové body spojení vybrané, se využívají pro identifikaci odesílatele. Normálně by TCP využilo adresu z IP hlavičky, ale ta se může třeba při přepnutí z mobilních dat na Wi-Fi, změnit. V ten moment nastává zdlouhavý TCP timeout, kdy se socket nakonec zavře a aplikace se pokusí navázat spojení znovu. V případě QUIC je přepnutí okamžité, protože druhý koncový bod se podívá jen na číslo cílového spojení v hlavičce a ví, od koho mu datagram přišel. - -Jak QUIC řeší spolehlivost už jsem trochu vysvětlil při handshake. Obecně používá ACK rámce, které posílá druhé straně, a který obsahuje úseky čísel paketů, které obdržel. Číslo paketu je v hlavičce a je postupně se inkrementující. Pokud druhá strana neobdrží ACK rámec, například pro paket n, pak odešle identický paket n, ale s novým číslem, které mu přiřadí čítač. Pokud druhá strana ACK odeslala, ale ten zrovna nepřišel, musí nějak řešit duplicity. Každý STREAM rámec obsahuje úsek dat proudu, který obsahuje, například od x do y. Díky tomu může koncový bod zjistit, že tuto část proudu už má a rámec zahodit. - - \subsection{Protokoly v aplikační vrstvě} -Nejvyšší v rodině protokolů TCP/IP je aplikační vrstva. V ní najdeme protokoly jako HTTP, gRPC nebo SMTP. Aplikačním protokolům, které ale nejsou specifické pro konkrétní aplikaci, se říká middleware. Mezi takové řadíme právě HTTP nebo gRPC, které jsou pro obecné posílání zpráv. V aplikační vrstvě děláme autentizaci a autorizaci. +Nejvyšší v rodině protokolů TCP/IP je aplikační vrstva s protokoly jako HTTP, gRPC nebo SMTP. Aplikačním protokolům, které nejsou specifické pro konkrétní aplikaci, se říká middleware. Mezi takové řadíme právě HTTP, gRPC nebo DNS, které jsou pro obecné posílání zpráv. \subsubsection{HTTP} -Velmi používaným protokolem je HTTP, neboli Hyper Text Transport Protocol. Používá se např. na přenos HTML stránek. Byl navržen ke komunikaci mezi webovými prohlížeči a webovými servery, ale často se používá i pro API pro komunikaci mezi dvěma programy. Tento protocol je bezestavový. To znamená, že žádná data si neukládá mezi dvěma HTTP dotazy. Každý HTTP dotaz musí obsahovat kompletní informace k jeho vyhodnocení. +% - Velmi častý +% - Původně pro přenos HTML hypertextových dokumentů, ale i obrázků, videí apod. - například REST API +% - Klient-server protokol - pouze jedna strana posílá požadavky +% - Čitelný člověkem +% - Rozšiřitelný - pomocí hlaviček +% - Bezestavová, ale ne bez relace. Pomocí cookies lze ukládat kontext. +% - HTTP/1 - jeden požadavek = jedno TCP spojení +% - Pomalé - pokaždé je nutný handshake +% - Head of line (HOL) blocking +% - HTTP/2 - multiplexová komunikace - jedno spojení lze využít znova +% - Odpovědi musí chodit ve stejném pořadí, jako přišli požadavky +% - Zde může docházet k blokování + +Velmi používaný protokol v systému World Wide Web je HTTP, neboli Hyper Text Transfer Protokol. Především slouží pro přenos hypertextových dokumentů, jako například HTML. Původně byl navržen pro komunikaci mezi prohlížečem, neboli klientským agentem, a webovým serverem. Dnes se využívá i pro API dotazy. Protokol je klient-server, to znamená, že jedna strana je klient a druhá server. Pouze klient může na server posílat dotazy a server posílá zpátky odpověď. Server nemůže poslat dotaz na klienta. I když už jsou způsoby, jak může server posílat alespoň události. + +Protokol je textový a snadno čitelný člověkem. Navíc je rozšiřitelný pomocí hlaviček. Protokol je bezestavový. To znamená, že server mezi dvěma dotazy nemá žádnou vazbu. Podporuje ale relace, kdy v dotazu můžeme serveru sdělit identifikátor kontextu, který chceme použít. Server si musí tyto kontexty ukládat. Je request-reply. V první verzi, HTTP/1, bylo třeba otevřít nové TCP připojení pro všechny. Ve verzi HTTP/2 je podpora pro multiplexní dotazování. To znamená, že jedno navázané spojení lze využít na více dotazů. To může ušetřit čas, protože se tak vyhneme navazování spojení. Funguje to tak, že přes jedno spojení lze odeslat více dotazů a odpovědi musejí chodit ve stejném pořadí. Už zde je vidět možný problém, který se nazývá \uv{head-of-line} blokování. Znamená to, že pokud první dotaz trvá dlouho a přitom je nepodstatný, a druhý dotaz je krátký a podstatný, může první dotaz blokovat ten druhý. Klienti by se měli snažit nejprve odeslat jednoduché dotazy a ty zdlouhavější až potom. \subsubsection{HTTP/3} -Poměrně zajímavou novinkou je HTTP/3, která běží na protokolu QUIC. Jinak je podobný protocolu HTTP/2. +Zajímavou novinkou je HTTP/3, která je založena na protokolu QUIC, který je založen na UDP namísto TCP. Podporuje více \uv{multiplexových} proudů už na transportní vrstvě. To znamená, že agent klienta může v jednom HTTP/3 stahovat najednou vícero dokumentů nezávisle. Pro jednu stránku je třeba stáhnout CSS, JS i HTML dokumenty. V HTTP/2 se všechny stahují jedním proudem střídavě, což způsobuje tzv. head-of-line blokování. Na obrázku \ref{fig:http_blocking} vidíme porovnání TCP v HTTP/2 a QUIC v HTTP/3. V prvním případě stahujeme dva dokumenty: $A$ z částí $A1$ a $A2$ a $B$ z částí $B1$ a $B2$. Když server odesílá v pořadí $A1$, $B1$, $A2$ a $B2$, a $B1$ se nedoručí, tak i když už se stihli doručit $A2$ a $B2$, tak je nemůžeme začít zpracovávat, protože protokol čeká na B1. Na druhou stranu protokol QUIC může mít pro každý dokument vlastní frontu a tím blokování kompletně eliminovat. -\subsubsection{gRPC} +\begin{figure} + \begin{minipage}{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{graphics/http2.pdf} + \par\smallskip(a) HTTP/2 + \end{minipage} + \hfill + \begin{minipage}{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{graphics/http3.pdf} + \par\smallskip(b) HTTP/3 + \end{minipage} + \caption{Vizualizace HTTP/2 blokování} + \label{fig:http_blocking} +\end{figure} -Další protokol od Googlu je gRPC, který je binární a snaží se simulovat volání metod v objektech. Je to intuitivní alternativa k posílání zpráv. +% \subsubsection{gRPC} -\subsubsection{Middleware} - -Speciálním případem protokolů v aplikační vrstvě je tzv. middleware. Je charakteristický tím, že není specifický pro žádnou aplikaci. Příkladem jsou právě protokoly zmíněné výše, jako gRPC nebo HTTP, protože libovolná aplikace je může využívat. Typické jsou různé typy rozhraní pro posílání zpráv. Pokročilejším případem jsou autentizační a autorizační middleware. Authentizace je ověření, že klient je opravdu ten, za koho se vydává. Autorizace je ověření, že klient má právo na to, co se snaží udělat. Je jasné, že tato problematika bude trápit více různých aplikací s ne nutně jinak společnou částí. +% Představíme konkrétní implementaci RPC a to gRPC. Jedná se o multiplatformní middleware od Google. Konkrétně gRPC využívá pro transport protokol HTTP/2 a ProtoBuf pro kódování dat. Využívá binární formát. ProtoBuf umožňuje definovat rozhraní pomocí zpráv a \texttt{rpc} koncových bodů. +\subsection{Protokoly v transportní vrstvě} -\subsection{Posílání zpráv} +Protokoly transportní vrstvy poskytují end-to-end komunikační služby pro aplikace. Příkladem takových služeb může být komunikace s navázáním spojení, spolehlivost doručení, zamezení zahlcení sítě nebo multiplexing. -V této sekci se budu soustředit na middleware pro komunikaci mezi procesy pomocí zpráv. Rozeberu jak lze zprávy kódovat a strukturovaná data serializovat. Komunikovat pomocí zpráv sice neschovává síťovou komunikaci, jako třeba RPC. +Nejčastějším protokolem je TCP, který naváže spojení a zaručuje spolehlivé doručení dat jako proud bytů. Alternativou je UDP, které nezaručuje doručení, ale je vhodnější pro streamovací služby. Poslední příklad, který zmíníme, je protokol QUIC od Google, který poskytuje spolehlivou komunikaci přes navázané spojení a s podporou multiplexování. Byl důležitou inspirací pro náš vlastní protokol z praktické části. -\subsubsection{Serializace} +\subsubsection{TCP} -V systému jsem chtěl zprávu reprezentovat jako instanci konkrétního objektu. To znamená pro zprávu, která říká, že hráč napsal něco do chatu, bude existovat třída \kiinlinecode{C++}{!}{NewChatMessage} a konkrétní hodnoty budou v instanci této třídy. Díky tomu jsem schopný snadno vytvářet zprávy v systému. Alternativou je implementovat dynamický strom, který bych následně kódoval jako JSON. Uzly by byly JSON objekty a listy JSON hodnoty. Podmínkou je, že každý list musí být převeditelný na hodnotu v JSONu a musí mít klíč. Druhý přístup ale zbytečně obchází vlastnosti jazyka C++, jako dědičnost, kontrolu typů (i když ta je v C++ slabá) a další. Na druhou stranu je tento přístup hodně dynamický, proto se hodí například, kdyby schéma zprávy definoval sám uživatel, až po kompilaci programu. +Nejběžnější protokol je TCP. Při použití mezi sebou dva koncové body vytvoří spojení s obousměrným proudem bytů. Protokol garantuje spolehlivé doručení dat v pořadí, ve kterém byly odeslány. Zároveň řeší zahlcení sítě udržováním okna paketů, které jsou v oběhu a redukuje jeho velikost v případě, že je síť přehlcená. To pozná tak, že si pakety čísluje a příjemce musí za každý odeslat potvrzení přijetí. Pokud odesílatel toto potvrzení nedostane, odešle paket znovu. Pokud nedostává potvrzení pro až moc velkou část okna, může toto okno zmenšit. -Pokud jsem chtěl posílat instance objektů, musel jsem instance převést na n-tici bytů. Tomuto procesu se říká serializace (resp. deserializace při převedení n-tice bytů na instance objektu). Velmi častým příkladem je serializace do JSON formátu, hojně využívaná v aplikacích s REST API rozhraním, nebo do XML v případě SOAP API rozhraní. To jsou tzv. textové formáty, které jsou pro člověka čitelné. Díky tomu jsou vhodné pro webové aplikace, kde rozhraní musí být srozumitelné pro snadnou práci. Nevýhoda je paměťová náročnost. Například číslo 1 000 000 se v JSON zakóduje do 7 bytů, i když binární reprezentace stejného čísla se vleze do 4 bytů. Rozdíl je směšný, ale téměř dvojnásobný. Druhým kamenem úrazu je struktura. Každý atribut objektu se v JSONu reprezentuje řetězcem, namísto třeba čísla o 2 bytech, které by unikátně atribut identifikovalo. +Pro navázání spojení a následnou komunikaci musejí oba procesy vytvořit koncový bod, kterému se říká \uv{soket}. Jedná se o objekt, který se chová jako soubor. Odesílatel do něj zapisuje data, která chce odeslat a příjemce je z něj může přečíst. Na jednom počítači může být otevřeno více soketů a jsou identifikované \uv{portem}. Ten slouží pro směrování paketů správnému soketu, ze kterého příjemce čte. Pro navázání musí jedna strana spojení iniciovat a druhá ho musí přijmout. -Všechna tato snížení prostorové náročnosti řeší binární formáty. Známým příkladem je ProtoBuf, FlatBuffers, Parquet nebo Cap'n'Proto. Postupně je rozeberu jejich specializace. ProtoBuf je volně dostupný protokol od Googlu pro serializaci strukturovaných dat. Pro použití je třeba definovat v univerzálním jazyce to, jakou má zpráva strukturu. Jazyk je podobný definici struktur v jazyce C. Pro přestavu si ukážeme: +Popíšeme si, jak TCP zajišťuje spolehlivost pomocí odesílání potvrzení o přijetí. Pokaždé, co příjemce dostane paket, odešle druhému koncovému bodu zprávu označenou jako \uv{ACK} s číslem paketu. V případě, že odesílatel potvrzení o přijetí nedostane, odešle paket znova. Příjemce si u sebe postupně skládá seřazený proud bytů. Jakmile je na socketu seřazená posloupnost bytů, umožní ji ze soketu přečíst. -\begin{kicode}{C++}{}{C++} - message EntitySpawnMessage { - uint32 entity_id = 1; - bool is_player = 2; - string name = 3; - } -\end{kicode} +V protokolu na transportní vrstvě dochází k head-of-line blokování. Pokud jedna strana odešle proud bytů po částech $A$, $B$ a $C$, a příjemci přijde nejprve $C$ a $B$, nebude moct příjemce ze soketu nic přečíst, dokud nepřijde i část $A$. Většinou je toto vhodná služba, ale jsou situace, například ve hrách, kdy se to stává problémem. Například posíláním zpráv s pozicí hráče. Pokud strana pošle pozici pro čas $t_1$, $t_2$ a pak $t_3$, tak by ztracená zpráva $t_1$ blokovala příjemce, který by ji v zápětí přepsal zprávou pro čas $t_3$. Lepší by bylo, aby seřazení definovala až aplikace, která by začala zpracovávat $t_3$ hned a docílila tak nižší odezvu mezi serverem a klientem. -Vidíme, že místo \kiinlinecode{C++}{!}{struct} píšeme \kiinlinecode{C++}{!}{message} a atributy musí mít unikátní ID. Důvodem je kompatibilita verzí definice. Pokud bychom měli systém o dvou službách, a v jedné bychom přidali atribut `position`, jak vidíme v příkladě, mohla by být druhá služba stále schopná serializovaná data první službou deserializovat. +Nevýhoda pro nás byla, že přenáší proud dat. Jinými slovy, v protokolu není proud rozdělen na jednotlivé bloky se zprávou. Tuto logiku si musíme implementovat sami. Proto jsme v praktické části vytvořili vlastní protokol, který umí v proudu zprávy správně oddělit. -\begin{kicode}{C++}{}{C++} -message EntitySpawnMessage { - uint32 entity_id = 1; - Vector3 position = 4; - bool is_player = 2; - string name = 3; -} -\end{kicode} +\subsubsection{UDP} -Stejnou vlastnost má i JSON, kdy unikátní ID je právě řetězec pro klíč. Serializující služba může přidávat atributy, ale deserializaci to neovlivní. Z .proto souboru se vygenerují přímo třídy do potřebného jazyka. V mém případě C++. Výhoda definovat zprávy v univerzálním jazyce je čitelnost, možnost převést do libovolného programovacího jazyka a především reflexe. +Méně spolehlivá alternativa je UDP, neboli User Datagram Protocol. Ten komunikuje posíláním \uv{datagramů}, na rozdíl od proudu bytů, jako je tomu v případě TCP. Znamená to, že to co vrátí jedno systémové volání pro čtení ze soketu je právě jedno volání pro zápis, které udělal odesílatel. Protokol nenavazuje spojení a nezaručuje doručení datagramů. -FlatBuffers je opět protokol od Googlu, který se vyvýjel pro použití v herních enginech pro hry více hráčů. Jeho výhoda je, že není třeba zprávu "deserializovat". Instanci třídy čte atributy přímo z n-tice bytů. V případě 60 zpráv za vteřinu zprávy od stovek hráčů, je rozdíl mezi deserializací a FlatBuffers znát. +Je vhodný jako základ pro vlastní transportní protokol. Například protokol QUIC, který podrobně popíšeme níže, ho využívá pro vlastní implementaci spolehlivosti a multiplexing. My jsme na něm založili vlastní protokol, inspirovaný QUIC, který umožňuje aplikaci odeslat zprávu i nespolehlivě, například pokud se jedná o pozici hráče. -Parquet je formát pro sloupcová data, který umožňuje v serializovaných datech vyhledávat a má menší paměťovou náročnost, takže je vhodný i pro přenos. +\subsubsection{QUIC} -Posledním příkladem je Cap'n'Proto, čteno Captain Proto. Je to volně dostupný protokol, který nemá deserializaci, a je tak velmi rychlý. Jeho tvůrce navíc pracoval právě na ProtoBuf. +QUIC je spolehlivý protokol transportní vrstvy, který poskytuje multiplexní komunikaci založenou na TLS 1.3, od společnosti Google. Jeho cílem je být efektivnější varianta TCP, která využívá protokol UDP. Znamená to například, že lze snížit množství blokování, ke kterému dochází z důvodu ztracených paketů. Mezi dvěma koncovými body vytváří spolehlivé spojení. Na rozdíl od TCP umožňuje otevřít více proudů v jednom spojení a modelovat tak částečné uspořádání. Když se čeká na paket v TCP, tak se pozastaví celý tok dat, ale v případě QUIC se zastaví jen konkrétní proud. -\subsubsection{Kódování zpráv} +Mezi dvěma koncovými body se posílají pakety. Ty obsahují rámce, které se rozdělují na kontrolní a proudové. Kontrolní slouží pro ovládání koncových bodů: otevírání a zavírání proudů, přesun ve stavovém stroji koncového bodu nebo udržování spojení naživu. Proudové obsahují aplikační data. Stejně jako TCP, i QUIC přenáší proud bytů a oddělení jednotlivých zpráv je nutné implementovat zvlášť. -Při čtení dat ze socketu pomocí TCP protokolu dostáváme proud bytů. Je potřeba z proudu zprávy dekódovat a naopak je být schopni do proudu zakódovat. Proto jsem definoval kódování zpráv a komponentu Messenger. TCP je spolehlivý protokol, proto se málokdy stane, že zprávy nebudou následovat hned po sobě. Pro zakódování zprávy zakóduju nejprve tzv. hlavičku. To je prvních pár bytů, které ukládají informaci o zprávě, jako třeba délku nebo typ. Za hlavičkou následuje serializovaná zpráva. V hlavičce budou první 4 byty tzv. magické číslo, které označuje začátek kóvání a slouží k synchronizaci čtecí hlavy v případě, že došlo při deserializaci k chybě. Dalšími 4 byty je n pro n-tici bytů pro serializovanou zprávu. +\begin{description} + \item[{Pakety}] \hfill \\ + Dvě strany komunikující přes QUIC protokol mezi sebou posílají sekvenční pakety různých typů. Příkladem jsou: \texttt{Initial}, \texttt{0-RTT}, \texttt{Handshake} a \texttt{1-RTT}. Liší se v síle šifrování, které používají, každý typ má svůj číselný prostor a liší se i hlavička. Každý paket má své unikátní pořadové číslo, které se v rozumném čase nesmí použít znova, a to ani při opakovaném poslání stejného paketu z důvodu ztráty. Různé typy paketů mají ale čítač nezávislý. Pakety typu \texttt{Initial} a \texttt{Handshake} mají dlouhou hlavičku a \texttt{0-RTT} a \texttt{1-RTT} mají krátkou hlavičku. -Při zavolání peek na instanci Messenger, se do bufferu v instanci, který má velikost 64KB, přečte funkcí recv z TCP socketu. Volání není nutné opakovat, protože peek budeme opakovat hned další snímek za pár milisekund. Po zavolání `recv` skenujeme vstupní buffer a hledáme magické číslo. Jakmile ho najdeme, čteme další 4 byty jako délku $n$. Pokud v bufferu zbývá ještě alespoň $n$ bytů, vložíme je do fronty zpráv a odebereme z bufferu pro uvolnění místa. Nakonec funkce `peek` ověří, jestli něco ve frontě je, pokud ano, vrátí typ nejstarší zprávy ve frontě. + \item[{Spolehlivost}] \hfill \\ + Protokol QUIC zajišťuje spolehlivost jednotlivých rámců. Příjemce musí odeslat zpět odesílateli rámec typu \texttt{ACK} se zakódovaným číslem paketu, ve kterém rámce získal. Tento rámec může obsahovat i více paketů zároveň a protokol toho využívá tak, že neposílá \texttt{ACK} tak často. -Druhou funkcí je `pop`, která má template s argumentem T pro datový typ zprávy. Uživatel instance `Messenger` musí umět z čísla, které reprezentuje typ, dostat datový typ. To jsem udělal pomocí tzv. template specialization. Uživatel musí zavolat `peek` a podle vracené hodnoty zavolat `pop` se správným template argumentem. Funkce `pop` zavolá deserializační funkci generovanou ProtoBuf. + \item[{Šifrování}] \hfill \\ + QUIC už podporuje šifrování přes TLS 1.3 přímo v transportní vrstvě. To znamená dvě výhody: protokol autentizuje klienta, který nám posílá zprávy a tajný klíč lze domluvit už při navazování spojení. TCP naváže spojení pomocí handshake a následně pokračuje další handshake pro TLS. QUIC je v tomto ohledu schopný navázat spojení rychleji. -\subsubsection{Implementace} + \item[{Unikátní identifikátory koncových bodů}] \hfill \\ + Protokol UDP směřuje datagramy do portů a identifikovat klienty umožňuje pomocí zdrojové IP adresy. Protokol QUIC přidává další vrstvu směrování pomocí \uv{unikátních identifikátorů koncových bodů}. Před začátkem komunikace se oba koncové body domluví na svých identifikátorech a odesílatel do hlavičky paketu zapíše identifikátor cílového spojení. Toto číslo je náhodně vygenerované a s délkou až 62 bitů. Díky šifrování nemůže potenciální útočník toto číslo podvrhnout a vydávat se za někoho jiného, protože kvůli neznalosti klíče by nebyl schopný správně zašifrovat zprávu. + Výhoda je, že klient může změnit IP adresu, např. z důvodu přepnutí z Wi-Fi na mobilní data, není třeba spojení znova navazovat. V případě TCP se často stává, že spojení musí vypršet, a pak znova navázat. -Bylo potřeba zadefinovat, jak se zpráva bude posílat přes síť. Cílem nebyla univerzálnost a čitelnost, jako je například protokol HTTP, ale optimalizace velikosti. Je třeba definovat, jak zpráva v toku dat vypadá, a jak ji dekódovat. -První čtyři byty obsahují tzv. `MAGIC` číslo. Může to být libovolná konstanta, protože jediný její význam je synchronizace toho, kde zpráva začíná. Důvod si ukážeme v části o nápravě chyb. Další byte je typ zprávy. Další 2 byty je délka zprávy. Průměrná délka packetu je 1200-1500 bytů, nemá proto smysl posílat delší zprávy. K tomu tento protokol není. Nakonec následuje samotná serializovaná zpráva. Těmto prvním 6 bytům se říká hlavička. +\end{description} -\subsubsection{Detekce a náprava chyb} +Popíšeme, jak v QUIC funguje handshake, který vidíme na obrázku \ref{fig:quic_handshake}. Nejprve začíná strana, která se chce připojit, posláním paketu typu \texttt{Initial} s rámcem CRYPTO s ClientHello. Server odpoví několika rámci: \texttt{Initial} s \texttt{CRYPTO} rámcem se ServerHello společně s ACK rámcem a paketem typu \texttt{Handshake} ve kterém je \texttt{CRYPTO} rámec s potřebnými informacemi pro TLS. Aplikační data jsou v paketu typu \texttt{1-RTT} a \texttt{0-RTT}. Jakmile klient dostane tyto informace, mohou si strany posílat šifrovaná data. Toho QUIC využívá a první odpověď ze serveru už může obsahovat paket \texttt{1-RTT} se \texttt{STREAM} rámci s šifrovanými daty, jak vidíme na obrázku \ref{fig:quic_handshake}. Dále si všimněme, že každý typ paketu má vlastní prostor čísel. QUIC používá UDP a proto posílá datagramy. Do jednoho datagramu spojuje více paketů. Tři pakety ze serveru, které přijdou jako odpověď, se tak mohou odeslat jako jeden datagram. -Občas mohou nastat v proudu chyby, kdy zprávu nelze dekódovat, nebo nastane chyba při deserializaci. Proto jsem do kódování implementoval nápravu chyb. Definoval jsem maximální délku bytů, kterou lze přeskočit při hledání magického čísla. To nestačí, pokud jsou data náhodná, protože se může stát, že číslo objeví i tak (i když je pravděpodobnost 1/(256\^4)). Proto si dekodér pro socket počítá chyby. Pokud se objeví 3 po sobě jdoucí chyby, tak spojení ukončí. Příkladem takové chyby je selhání deserializace nebo `recv` vrátí chybu. +Při handshake se dva koncové body mimo jiné domlouvají na svých unikátních číslech. Při Client-Hello se server podívá na Source Connection ID a zapamatuje si ho jako ID připojení druhé strany. Následně vygeneruje své vlastní ID a přiřadí mu instanci relace. Pak se podívá na Destination Connection ID a nastaví si, aby pakety, které mají toto číslo jako Destination Connection ID, se připisovaly nově vytvořené relaci. Toto číslo jako takové nebude používat a v odpovědi jako Source Connection ID bude jeho vlastní vygenerované. + +\begin{figure} + \begin{center} + \includegraphics[width=0.5\textwidth]{graphics/quic_handshake.pdf} + \end{center} + \caption{QUIC handshake} + \label{fig:quic_handshake} +\end{figure} + +Všimněme si speciálního typu paketu \texttt{0-RTT}, který slouží pro poslání aplikačních dat ještě před samotným navázáním spojení, ale pouze se základním šifrováním. Pro tento paket se využívá první Destination Connection ID, které ale vygeneroval iniciátor komunikace. Jedno spojení může mít přiřazeno více ID. Spojení, které si založí druhá strana, si přiřadí jak ID vygenerované touto stranou, tak ID, které zvolil iniciátor. Když přijde později paket \texttt{0-RTT}, bude správně nasměrován na instanci spojení. + +Způsobem, jakým QUIC redukuje nebo dokonce eliminuje head-of-line blocking, je multiplexing. Přes jedno spojení je možné otevřít více paralelních proudů, které se navzájem neovlivňují. -\subsection{Asynchroní IO} -Čtení a zápis na socket je běžně blokující operace. To znamená, že při zavolání `read` pro čtení 10 bytů, bude volání blokovat, dokud na socket nepřijde 10 bytů. V případě serveru pro online hru je to nevhodné, protože pokud nám nic nepřišlo, můžeme mezitím vykonávat ostatní logiku hry. Socket lze nastavit jako neblokující tak, že pokud zavolám `read` a budu chtít číst 10 bytů, a ty tam ještě nebudou, vrátí mi ty co zatím přečetl (pokud přišlo jen 5 bytů, vrátí mi jen 5 bytů). Tuto menší část si můžu u klienta ukládat do bufferu a postupně zkoušet dekódovat jako zprávu. +\subsection{Sokety} -Podobnému přístupu se říká *asynchronní sockety*. Jinými slovy to znamená oddělení volání a samotného vykonání. V tomto případě sice zavoláme `read`, ale toto volání by se uložilo někam do fronty, a jiné samostatné vlákno by ho mohlo vykonat později. Protějšek z reálného světa je hodit dopis do schránky a pokračovat ve svém klasickém programu dne. Doručení se stane v nejbližších dnech a to někým jiným, takže my už se o dopis nemusíme starat. Pro lepší představu si pár existujících implementací představíme: +Populární rozhraní pro použití protokolů v transportní vrstvě jsou tzv. \uv{Berkeley sokety}. Soket je komunikační koncový bod, do kterého aplikace zapisuje data, která chce poslat přes síť druhému procesu, a ze kterého zároveň může číst příchozí data. Jedná se o abstrakci nad konkrétním otevřeným portem. Nelze vytvořit dva sokety se stejným portem. + + + +\subsection{Asynchroní vstupně výstupní operace} + +Čtení a zápis na socket je běžně blokující operace. To znamená, že při systémovém volání pro čtení 10 bytů, bude volání blokovat, dokud na socket nepřijde 10 bytů. V případě serveru pro online hru je to nevhodné, protože pokud nám nic nepřišlo, můžeme mezitím vykonávat jinou logiku hry. Socket lze ale nastavit tak, aby vracel hned a počet bytů neznamenal konkrétní počet, ale pouze maximum. Je ale poté třeba zprávu opět sestavit z postupně přečtených částí v aplikaci. + +Podobnému přístupu se říká \uv{asynchronní sockety}. Jinými slovy to znamená oddělení volání a samotného vykonání. V tomto případě sice zavoláme operaci čtení, ale toto volání se vloží do fronty, a jiné samostatné vlákno ho vykoná asynchroně později. Protějšek z reálného světa je hození dopisu do schránky a pokračování v jiné práci. Doručení se stane v nejbližších dnech a to někým jiným, protějšek jiného vlákna. Pro lepší představu si pár existujících implementací představíme. \subsubsection{ZeroMQ} -Při použití knihovny ZeroMQ vytváříme objekt `ctx = zmq\_context(num\_threads)`. Ten vytvoří námi specifikovaný počet vláken `num\_thread`. Když následně zavoláme `zmq\_send(ctx, x)`, protějšek klasického `send(x)`, tak nedojde k blokování. Místo toho se zpráva `x` umístí do fronty, ze které pak vlákna z `zmq\_context` tzv. "kradou" (work-stealing), a odesílají v pozadí. +Při použití knihovny ZeroMQ vytváříme objekt kontextu pomocí \inlcpp{ctx=zmq\_context(num\_threads)}. Ten obsahuje konkrétní počet vláken specifikovaný parametrem \inlcpp{num\_thread}. Když následně zavoláme \inlcpp{zmq\_send(ctx, x)}, protějšek klasického \inlcpp{send(x)}, tak nedojde k blokování. Místo toho se zpráva $x$ umístí do fronty, ze které pak vlákna z \inlcpp{zmq\_context} tzv. \uv{kradou} a odesílají v pozadí. -To samé platí o `zmq\_receive`, které si v pozadí bufferuje celou zprávu. TCP totiž nemá žádnou strukturu zprávy, a proto když zavoláme `recv`, můžeme dostat jen část. ZeroMQ místo toho v pozadí bufferuje, dokud neobdrží celou zprávu, a až poté vrací `true`. +To samé platí o \inlcpp{zmq\_receive}, které si v pozadí skládá celou zprávu. TCP totiž nemá žádnou strukturu zprávy, a proto když zavoláme operaci pro čtení ze soketu, můžeme dostat jen část. ZeroMQ pracuje v proudu s celými zprávami, které za nás skládá. \subsubsection{Work stealing} -Běžnou strategií pro dynamický multithreading, je tzv. work stealing. Jiné strategie jsou třeba work sharing. Implementuje se thread-safe fronta. Při asynchroním volání úkolu se vloží do této fronty. Následně máme X vláken, které se ve smyčce dotazují na frontu. Pokud v ní něco je, vytáhnou to a začnou na tom pracovat. Těmto vláknům se někdy říká "Worker". Většinou jich je právě tolik, kolik je fyzických jader v procesoru, protože cílem je paralerismus, a ten s vyšším počtem vláken nezlepšíme. Zajímavou vlastností je, že součástí úkolu může být právě vložení dalších úkolu do fronty. +Běžnou strategií pro využití dynamického počtu vláken je \uv{work stealing}. Jiné strategie jsou třeba \uv{work sharing}. Implementace obsahuje synchronizovanou frontu, do které vkládáme popisy úkolů, které se mají vykonat. Vlákno, které se snaží z této fronty krást, je \uv{worker} neboli pracovník. Pokud je fronta správně synchronizovaná, může z ní krást libovolný počet vláken. Jsou různé možnosti, co může být popis úkolu. Například anonymní funkce nebo ID. Zajímavou vlastností tohoto přístupu je, že součást úkolu může být vložení \subsubsection{Async/Await} -Populární implementací, kterou vidíme například v Rust nebo C\#, je async/await. Async už jsme si vysvětlili. Await slouží pro volání asynchroních funkcí. Místo `queue.push(make\_task(...))` tak úkol může být právě volání funkce. Práce je tak daleko intuitivnější. Zde pozor, že pouhým voláním await na asynchroní funkci v C\# nebo Rust paralerismu nedocílíme! Na to je třeba v jeden moment await více úkolů. +Populární implementací, kterou vidíme například v Rust nebo C\#, je \uv{async/await}. V programu označíme funkci jako asynchronní pomocí klíčového slova \inlcpp{async}. Zavoláním takové funkce speciálním \inlcpp{await} voláním způsobí, že se celý aktuální kontext vloží jako úkol do fronty, ze které pracovníci kradou. Tento přístup vyžaduje, aby měly prvky ve frontě definované závislosti mezi sebou, protože úkol s aktuálním kontextem bude závislý na dokončení právě funkce, kterou jsou zavolali pomocí \inlcpp{await}. Toto volání tak do fronty vložíme taky. Pro definice závislostí se používají ukazatele na čítače. Pokud úkol $A$ závisí na úkolu $B$, nastaví si $A$ čítač $C_A$ na hodnotu $1$ a $B$ dostane na čítač $C_A$ ukazatel. Po dokončení tento čítač dekrementuje. Pracovník může krást z fronty jen ty úkoly, které mají hodnotu čítače roven nule. -Příklad z reálného světa je poslat dopis s otázkou. Opět stačí hodit dopis do schránky. Až si ho eventuélně někdo přečte, může nám poslat odpověď. Když dostaneme odpověď, vzpomeneme si, kde jsme skončili, když jsem práci přerušili a odeslali dopis s otázkou, a když už máme odpověď, tak pokračujeme. +Tento přístup je často používán v kontext asynchronních vstupně výstupních operací. Vlákno, které čeká na blokující operaci může v mezičase pracovat na jiném úkolu v aplikaci namísto čekání. V základu metoda neslouží k paralelismu, k tomu je potřeba další operace zvaná \uv{počkej na všechny}, která vloží do fronty vícero úkolů a aktuální kontext, který závisí právě na všech těchto úkolech. Ty tak mají šanci běžet paralelně. + + +Příklad z reálného světa je poslat dopis s otázkou. Opět stačí hodit dopis do schránky. Až si ho někdo přečte, může nám poslat odpověď. Když dostaneme odpověď, vzpomeneme si, kde jsme skončili, když jsem práci přerušili a odeslali dopis s otázkou, a když už máme odpověď, tak pokračujeme. \subsubsection{Boost Asio} -Velmi podobná ZeroMQ je Boost ASIO. Ta ale nechává vytváření vláken na nás. Pouze vytvoříme objekt `asio\_context`, který má metodu `run`. Když z vlákna zavoláme metodu `run`, stane se vlákno workerem, který krade práci z fronty, která je taky `context`. +Velmi podobná ZeroMQ je Boost ASIO. Ta ale nechává vytváření vláken na nás. Pouze vytvoříme objekt kontextu \inlcpp{asio\_context}, který má frontu úkolů a metodu \inlcpp{run}. Když z vlákna zavoláme tuto metodu, stane se vlákno pracovníkem, který krade práci z fronty, která je v objektu kontextu. -Tento přístup je intuitivnější, protože se jedná přesně o to, jak worker thready fungují. Pouze spuštěná funkce, která se opakovaně dotazuje na frontu. Pokud něco najde, vytáhne to, a začne na tom pracovat. Jakmile práci dokončí, opět se dotazuje na frontu. Zde si také všimněme, že se nejedná o klasický rychlý context switching, který dodává iluzi více jader v operačních systémech, ale worker opravdu práci nejprve dokončí, než změní kontext a začne pracovat na něčem jiném. +Tento přístup je intuitivnější, protože se jedná přesně o to, jak pracovníci fungují. Jedná se o funkci, která se opakovaně snaží odebrat z fronty úkolů. Pokud fronta není prázdná a pracovník se dostane z ní úkol, začne na něm pracovat. Jakmile práci dokončí, vrací se ke kroku odebírání z fronty. -Otázka by mohla být, proč nevytvořit thread pro každou zprávu, kterou chceme odeslat. Důvodem je, že vytváření vláken je sice rychlejší, než celých procesů, ale pořád vyžaduje systémové volání, které může způsobit zpomalení. +Důvod, proč nevytvořit thread pro každou odeslanou zprávu je, že vyžaduje systémové volání, které může způsobit zpomalení. Proto se často používají tzv. green thready, fibery, user thready, ... což jsou vlákna kompletně v uživatelském prostoru. Není tak třeba žádné systémové volání. -Proto se často používají tzv. green thready, fibery, user thready, ... což jsou thready, ale spravované kompletně v user-space. Není třeba žádné systémové volání. +% \subsubsection{Stack pointer} + +% Problém může být definovat práci pro thready. Jak vypadá takový objekt `Job`? Intuitivně by nás napadlo, že by obsahoval ukazatel na funkci. Nebo v případě, že máme jen velmi omezený počet různých implementací, může obsahovat jen typ, a worker už si dohledá, co má dělat. + +% Druhým způsobem, který vidíme při použití `await/async` v jazycích jako Rust nebo C\#, je prostě zavolat funkci, která reprezentuje práci, pomocí `await`. Funkce await si uloží aktuální ukazatel na stack, vytvoří nový stack speciálně pro job, a objekt `Job` tak vypadá tak, že obsahuje tento nový stack pointer, ukazatel na funkci, a všechny potřebné registry. + +% Všimněme si, že můžeme job vytvářet i z jiného jobu, a tím v podstatě větvit. Zároveň můžeme kód paralerizovat tak, že najednou budeme awaitovat více jobů. Představme si, že máme fyzický systém s metodou `step`. Ta zavolá `awaitAll(jobs)`, kde `jobs` je list jobů. Automaticky se všechny dostanou do fronty, a různé workery je mohou začít vykonávat paralerně. -Na začátku se spustí několik workerů, což jsou thready, které právě kradou práci z fronty a vykonávají je. Většinou mají dlouhou životnost. -\subsubsection{Stack pointer} -Problém může být definovat práci pro thready. Jak vypadá takový objekt `Job`? Intuitivně by nás napadlo, že by obsahoval ukazatel na funkci. Nebo v případě, že máme jen velmi omezený počet různých implementací, může obsahovat jen typ, a worker už si dohledá, co má dělat. - -Druhým způsobem, který vidíme při použití `await/async` v jazycích jako Rust nebo C\#, je prostě zavolat funkci, která reprezentuje práci, pomocí `await`. Funkce await si uloží aktuální ukazatel na stack, vytvoří nový stack speciálně pro job, a objekt `Job` tak vypadá tak, že obsahuje tento nový stack pointer, ukazatel na funkci, a všechny potřebné registry. - -Všimněme si, že můžeme job vytvářet i z jiného jobu, a tím v podstatě větvit. Zároveň můžeme kód paralerizovat tak, že najednou budeme awaitovat více jobů. Představme si, že máme fyzický systém s metodou `step`. Ta zavolá `awaitAll(jobs)`, kde `jobs` je list jobů. Automaticky se všechny dostanou do fronty, a různé workery je mohou začít vykonávat paralerně. -\subsection{Metriky} - -Abych byl schopný správně optimalizovat tok dat, potřeboval jsem sbírat metriky. Proto jsou třeba dvě komponenty. První je úložiště, kde budu metriky ukládat. Může se jednat o CSV soubor nebo databázi. Druhá je rozhraní, ve kterém budu metriky vizualizovat. Představím dvě služby, které pro to využívám. Následně si představíme samotné metriky, které budu měřit a proč. Všechny metriky budu měřit po vteřinách, některé jako sumu, jako např. množství odchozích dat, a jiné jako průměr, jako např. odezvu. - -\subsubsection{TimescaleDB} - -Jako úložiště jsem zvolil TimescaleDB. Jedná se o rozšíření do PostgreSQL, takže není třeba spouštět a starat se o další službu. Stačí mít spuštěnou PostgreSQL databázi. TimescaleDB umožňuje vytvářet tzv. hypertables, které jsou optimalizované pro rychlý insert. Vytvořil jsem komponentu `NetworkBandwidthReporter`, která má na rozhraní `report\_outbound` a `report\_inbound`. Tyto údaje posílá do komponenty `TimescaleDBReportOutputter`, která už zajišťuje připojení do databáze a umožňuje `report(metric\_name, value)`. V rámci optimalizace přidávám hodnoty do bufferu a posílám je pouze jednou za vteřinu jako sumu. - -\subsubsection{Grafana} - -Grafana je služba, která skrze webovou stránku poskytuje rozhraní pro vizualizaci metrik. Lze nastavit svůj dashboard a v něm různé grafy. V mém případě graf pro množství odchozích a množství příchozích dat, zatížení procesoru a nebo zatížení paměti RAM. -\subsubsection{ImGui} -Chtěl jsem mít i možnost se na metriky podívat přímo ve hře při běhu. Pro uživatelské rozhraní používám knihovnu ImGui a ImPlot. Tyto knihovny využívají pro vykreslování grafickou kartu a snadno jsem je mohl integrovat do svého vykreslovacího enginu. Knihovna funguje procedurálně, nikoliv objektově. Každý snímek, který vykresluju, musím celé rozhraní definovat. To udělám pomocí volání funkcí. Nejprve zavolám funkci `Begin("Název okna")`, které zobrazí okno, do kterého můžu vložit další prvky, jako texty, textové vstupy, nebo tlačítka. Tento přístup je pro herní enginy a podobné kreativní aplikace ideální, protože umožňuje velmi snadno a rychle dělat dynamické uživatelské rozhraní. -\subsubsection{Tracy} -Pro měření výkonu programu serveru používám výborný profiler Tracy. Je zdarma, open-source, napsaný v C++ a využívající ImGui. Poskytuje přesnost na nanosekundy, což se u serverů, na kterém může být miliony různých entity, hodí. Navíc umožňuje se k programu, který měří, připojit vzdáleně, případně sbírat metriky do souboru, ten si ze serveru stáhnout a analyzovat později. -\subsubsection{Konkrétní metriky} -Ukážu různé metriky, které lze měřit, jak a hlavně proč. Je dobré zmínit, že místo, ze kterého budu metriky sbírat, je server. To ale nevadí, protože jak uvidíte, vše potřebné na něm měřit jde, a to co ne, tak nás nemusí zajímat. -\begin{description} - - \item[{Inbound/Outbound bandwidth}] \hfill \\ - Nejpřirozenější metrika je příchozí a odchozí množství dat v bytech. Už zde pro mě bylo nutné si uvědomit důležitost oddělit vrstvu, která kóduje a dekóduje zprávy, od zbytku. Přesně na tomto místě totiž budu metriky dělat. Metriku budu sčítat. - - \item[{Odezva}] \hfill \\ - Budu měřit odezvu mezi odesláním vstupu od klienta pro snímek x a odpovědí od serveru pro snímek x. Tuto metriku budu průměrovat. - - \item[{Počet snímků za vteřinu}] \hfill \\ - Ze začátku se mi stávalo, že uzké hrdlo nebyla síť, ale síťová vrstva v aplikaci, která třeba dlouho skládala zprávy. Proto si udržuju i přehled o počtu snímků, které server stíhá. Podle toho se lze orientovat při výběru hardware pro server. -\end{description} -\subsubsection{Sbírání v reálném čase} -Přímo v hráčově klientské aplikaci jsme chtěli mít možnost vidět metriky v reálném čase. Do síťové vrstvy jsme přidali komponentu pro reportování událostí a jejich metrik zvanou \kiinlinecode{C++}{!}{\\NetworkMetricReporter}, která obsahuje metody jako \kiinlinecode{C++}{!}{\\reportInbound} a \kiinlinecode{C++}{!}{\\reportOutbound}. První metoda hlásí příchozí byty a druhá odchozí. @@ -484,41 +545,108 @@ Přímo v hráčově klientské aplikaci jsme chtěli mít možnost vidět metri \newpage -\section{Hra pro více hráčů} -Pro zkoušku různých technik jsme se rozhodli vytvořit hru pro více hráčů. Nejprve představíme, jak vypadá architektura hry jednoho hráče. Podporu pro více hráčů jsme implementovali jako rozšiřující vrstvu, která příliš neovlivňuje klasickou architekturu her. Ve hře se jednotlivý hráči uvidí, budou se moct pohybovat a interagovat s vybranými objekty. -Ukážu, jaké komponenty jsem přidal a proč, jak jsem je měřil a analyzoval a případné optimalizace, které jsem pro ně použil. Představím svůj protokol QUICr, který je inspirovaný QUIC, ale upouští od spolehlivosti, což je ideální pro hry. -\subsection{Hry} -Program hry většinou obsahuje smyčku, kde jedné iteraci říkáme snímek. Moderní hry iterují od 60 do až 240 snímků za sekundu, někdy více. V našem případě jsme se rozhodli pro jednoduchou 3D hru s vykreslováním 60 snímků za vteřinu. Zajímá nás aplikace různých technik. Hra si také udržuje svůj stav, jako entity ve světě, počasí, terén, herní pravidla apod. -Každý snímek nejprve posbírá vstupy od hráče, převede je na jednotlivé akce, podle toho, co pro hru vstupy znamenají, a aplikuje je na stav hry. Například stisknutí tlačítka W převede na akci: pohyb dopředu. Takto postupně iterujeme z počátečního stavu hry. -Architektura programů her je specifická tím, že tolik nevyužívá dědičnost a především virtuální funkce. V případě milionu entity, pro které voláme funkci 60 krát za sekundu, se i virtualizované volání negativně projeví ve výkonu. Např. chceme li mít obrovský svět s různými postavami, kde každá má různé schopnosti a vlastnosti, špatně by se nám modeloval strom dědičnosti. + + + + + + + + +% Popsat, co je hra. Má stav a akce, které stav mění. +% - V případě her více hráčů různé počítače získávají vstupy a jiné +% - Server posílá snapshoty nebo události +% - Klienti posílají příkazy + +\section{Hra} + +Pro zkoušku různých technik jsme vytvořili hru pro více hráčů. V ní budou hráči používat program klienta, kterým se připojí na společný server. Po připojení hráči uvidí herní svět, ve kterém se mohou pohybovat. Systém hry automaticky synchronizuje stavy hráčů mezi klienty. Server bude celou hru řídit a bude mít autoritu. Program klienta tento stav vykreslí svému uživateli. + +Nejprve představíme, jak vypadá softwarová architektura hry jednoho hráče. Popíšeme jak vypadá herní engine a z jakých komponent se program hry skládá. + +V další části navážeme a rozšíříme hru pro více hráčů. Představíme architekturu. První implementace využívá klient-server. Vytvořili jsme dva programy: server a klient. Podrobně popíšeme komponenty, ze kterých se skládá server a klient. Ve hře se jednotlivý hráči uvidí, budou se moct pohybovat. Budeme porovnávat plynulost pohybu a rychlost odezvy, které jsou pro hratelnost důležité. + +Mezi hlavní prvky patří náš vlastní komunikační protokol transportní vrstvy: \uv{QUICr}. Je to obousměrný protokol pro posílání zpráv, který upravuje QUIC pro využití ve hrách. Náš protokol lépe zachycuje závislosti mezi zprávami a umožňuje posílat zprávy nespolehlivě. Díky tomu se úplně zbavuje ahead-of-line blokování. + +Zjistili jsme, že důležitým vylepšením je vlastní serializace primitivních zpráv. Pokud například obsahuje pouze seznam pozic, může být vlastní serializace rozdíl mezi hratelnou a nehratelnou odezvou. Popíšeme, jak jsme rychlost měřili a jaké metody jsme pro vlastní serializaci použili. + +Nakonec představíme i architekturu peer-to-peer, kdy umožníme, aby v systému bylo více spolupracujících serverů, které si mezi sebou budou rozdělovat práci. Zároveň porovnáme i případ, kdy není žádný autoritativní server a hráči se mezi sebou synchronizují samovolně. + + + +\subsection{Softwarová Architektura} + +% Vstupy od hráče -> derivace +% Derivace + Stav -> integrace +% Chceme říct, že iterujeme. +% +% Hra má definované akce, které hráči mohou dělat a jak +% Vstup od hráče -> akce +% Co je herní stav, jak probíhá kolo? + +Program hry jsme rozdělili na \uv{stav} a \uv{řídící logiku}. Stav obsahuje množinu entit, které jsou ve hře a jejich vlasnosti a atributy. Entity jsou objekty v herním světě, jako postava hráče, truhly s poklady nebo nepřátele. Entita nepřítele může mít vlastnost "množství životů" a truhla vlastnost "poklad", která definuje, co je v truhle obsaženo. Stavu hry se někdy říká pouze \uv{svět}. + +Druhá část je řídící logika, která po iteracích mění stav hry. Tato změna může být pouze na základě stavu světa, například posune objekt, který má nenulový vektor zrychlení. Mimo to může řídící logika reagovat na údalosti. Například stisk tlačítka W je událost, který vyvolá změnu vektoru zrychlení hráče, který tlačítko stiskl. V důsledku toho se postava hráče pohne. + +Každá iterace řídící logiky trvá přibližně stejně dlouho, většinou 1/60 sekundy nebo 1/24 sekundy. Vyšší frekvence znamená nižší odezvu a lepší plynulost. Nižší frekvence znamená menší výpočetní náročnost. Pro pomalejší hry bez rychlých akčních pasáží se využívá frekvence 24Hz a u kompetentních her i 120Hz. + +https://www.riotgames.com/en/news/peeking-valorants-netcode + +\subsubsection{Entity-Component-System} + +V programu využíváme architekturu entity-component-system, která je pro hry běžná. Entity už jsme popsali výše. Ke konkrétním entitám vážeme instance komponent, které entitě dají stav. Většinou je komponenta přiřazena právě jedné entitě. Řídící logika hry se skládá ze \uv{systémů}, je řídící logika, která prochází komponenty a aktualizuje je. Systémů máme více a každý se stará o nějakou část. + +Herní stav se skládá z \uv{entit}, které jsou v herním světě a jejich \uv{vlastností}. Každou iteraci řídící logika všechny entity aktualizuje. Některá logika může být pro dvě entity společná, nebo velmi malá. Obecně ale předpokládáme, že každá entita přidá na výpočetní náročnosti a moderní hry mohou mít miliony entit. Zároveň každá entita může být jiná. + +Architektura her je tomu přizpůsobená. Entity tvoříme skládáním různých komponent a řídící logika mění jejich stav pomocí \uv{systému}. Systém se skládá z iterátoru přes n-tici typů komponent a aplikační funkce na prvky této n-tice. Výhody jsou téměř žádná virtualizovaná volání, která by se ve velkém počtu negativně projevila na výkonu a lepší \uv{datová lokalita}. To znamená, že procesor je schopný lépe předpovědět, kterou část paměti si má připravit dopředu, protože na ni bude provádět výpočet. Horší lokalita znamená, že bude často načítat zbytečné části, které nepotřebuje a výpočet bude delší. https://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ -Namísto toho se logika vlastností a schopností, které různé entity mohou mít, rozdělí do tzv. komponent. Např. komponenta pro obchodníka, stráž, kouzelníka, truhlu, dialog apod. Ve světě pak máme entity, kde každá má svůj individuální list komponent, které má. Tento styl je podobný kompozici objektů, ale s tím rozdílem, že komponenty skládáme do entity až za běhu programu. Nedefinujeme třídu pro každý typ entity, který může ve hře být. +Této architektuře se říká entity-component-system, zkráceně ECS. Existují různé knihovny, které poskytují registry a nástroje pro tvorbu systémů, jako například Entt, kterou využíváme my. -Samotná logika je pak v tzv. systémech. Každý iteruje přes konkrétní komponentu, která v sobě musí mít stav a zároveň derivaci, kterou systém aplikuje, resp. provede integraci. Tomuto návrhu se říká Entity, Component, System, neboli zkráceně ECS. + + +\subsection{Engine} + +Pro hru jsme vyvinuly vlastní herní engine tak, abychom mohli celý systém do hloubky upravovat. Implementace je v jazyce C++, protože je v tomto jazyce napsáno spousty nástrojů a knihoven právě pro vývoj her. Díky tomu se vývoj značně akceleroval. Zároveň je to vhodný jazyk pro práci na nižší úrovni, a to je důležité některé metody optimalizace. Engine je implementovaný jako modulární monolit. Jednotlivé moduly představíme. + +\subsubsection{Fyzický engine} + +Hra je 3D a chtěli jsme simulovat otevřený svět, ve kterém platí zákony fyziky. Pro simulaci jsme využili existující fyzický engine \uv{Jolt} a zabalili ho do modulu. Jolt je populární projekt, který je využíván například v Horizon: Forbidden West nebo Death Stranding 2. + +Pro použití jsme vytvořili instanci fyzického světa, do kterého naskládáme objekty a jejich vlastnosti, jako hmotnost a tvar. Zavoláním metody pro aktualizaci engine posune stav entit (zrychlení a pozice). Vše jsme obalili do \inlcpp{JoltPhysicsWorld}. + +Jolt umí využít více vláken procesoru a podporuje \uv{rollback}, který umožňuje vracet stav v historii simulace dozadu. Je to důležitá věc pro hry více hráčů v případě, že se stav dvou vrcholů v systému neshoduje i když by měl. + +\subsubsection{Vykreslování} + +K vykreslování jsme použili náš vlastní engine. Pro vykreslení 3D objektu je potřeba popsat jeho povrch jako množinu polygonů. Této množině se říká \uv{mesh}. Vykreslení jednoho snímku lze v enginu popsat jako graf operací. Běžně bude obsahovat operaci, která seznam mesh vykreslí do obrázku. Tento celý proces lze shrnout jednou operací, protože o celý algoritmus a logiku se stará grafická karta. Vývojář jen popisuje mesh a například jakou má mít barvu apod. + +Mezi operacemi v grafu definujeme závislosti. Díky tomu můžeme definovat operaci, která vykreslí 3D mesh a druhou operaci, která je na ni závislá, a která přes obrázek vykreslí uživatelské rozhraní. + +V našem případě máme právě operaci pro vykreslení statických objektů, jako povrchu, po kterém se hráči pohybují apod. Druhá operace vykreslí samotné hráče a jiné dynamické objekty. Poslední operaci vykreslí uživatelské rozhraní obsahující různé nástroje pro různé ladění programu. \subsubsection{Entt} -V našem případě využíváme knihovnu entt, která obsahuje různé nástroje pro ECS a vývoj tak zjednodušuje. Příkladem her, které ji využívají taky je třeba Minecraft pro Windows. Nejprve vytvoříme registr, což je objekt typu `entt::registry`, který spravuje své entity a jejich komponenty. Entita je v tomto případě pouze unikátně identifikační číslo, komponenta je libovolný typ a systém je lambda. Pro vytvoření systému musíme definovat pohled, tedy n-tici komponent. Tento pohled pak bude iterátor přes všechny entity, které mají každou z těchto komponent. Můžeme pak podle stavu jedné aktualizovat jinou a dělat různé interakce mezi nimi. +Pro ECS využíváme knihovnu \uv{Entt}, která umožňuje vytvářet registry entit a jejich komponent a aplikovat na ně funkce. Entita je v tomto případě pouze unikátně identifikační číslo a komponenta je libovolný typ. V registru pak můžeme vytvářet \uv{pohledy} na n-tici typů komponent, které jsou seznam právě všech entit v registru, které všechny tyto komponenty mají. Ten můžeme procházet a libovolně měnit atributy komponent. -\begin{kicode}{C++}{}{C++} +\begin{kicode}{cpp}{}{Příklad použití knihovny Entt} entt::registry registry; - + entt::entity entity = registry.create(); - + registry.emplace(entity, Transform::from_position(position)); - + registry.view() .each([&](Transform& ts, CharacterBody& rb) { auto character = rb.m_character; - + auto transform = character->GetWorldTransform(); memcpy(&ts.transform, &transform, sizeof(glm::mat4)); }); @@ -527,430 +655,516 @@ V našem případě využíváme knihovnu entt, která obsahuje různé nástroj Představíme komponenty, které jsme pro hru definovali a proč: \begin{description} - + \item[{Transform}] \hfill \\ Obsahuje transformační matici. Entity, které chceme zobrazit ve světě, tuto komponentu potřebují. Příkladem entity, která ji mít nebude, je zpráva v chatu. - + \item[{Mesh}] \hfill \\ - Obsahuje mesh, který má hra využít pro vykreslení entity. Mesh je n-tici bodů, které dohromady dávají 3D povrch objektu. Systém, který entity vykresluje si vytvoří pohled na Mesh a Transform, protože je potřeba vědět kam entitu vykreslit. - + Obsahuje mesh, který má hra využít pro vykreslení entity. Mesh je n-tici bodů, které dohromady dávají 3D povrch objektu. Komponenta neobsahuje body, ale pouze odkaz na buffer, ve kterém je najdeme a kde. Systém, který entity vykresluje si vytvoří pohled na Mesh a Transform, protože je potřeba vědět kam entitu vykreslit. + \item[{Rigidbody}] \hfill \\ - Slouží pro fyzikální informace o entitě, jako hmotnost a sílu, kterou na entitu budeme aplikovat. Systém pro tuto komponentu bude fyzický engine. - + Slouží pro fyzikální informace o entitě, jako hmotnost a zrychlení, které na entitu budeme aplikovat. Systém pro tuto komponentu bude ve fyzickém enginu. + \end{description} +\newcommand{\inlcpp}[1]{\kiinlinecode{cpp}{!}{#1}} -\subsection{Svět} -Stav hry reprezentujeme kompletně ve třídě Svět, neboli `World`. Ta bude obsahovat právě entt registr pro entity ve světě. Další komponenta, zvaná ovladač, pak bude sbírat vstupy a stav světa postupně aktualizovat. V případě hry pro jednoho hráče získá ovladač vstupy z klávesnice a myši a vhodně aktualizuju svět. Například při zmáčknutí klávesy W pro posun dopředu, nastavím rychlost RigidBody entity pro hráče tak, aby při zavolání integrace posunula Transform hráče. Oddělím tak logiku která drží stav a tu která stav mění. -\subsubsection{Ovladač pro hru jednoho hráče} -Definujeme, jak bude vypadat ovladač světa, tedy vrstva, která transformuje vstupy od hráče na akce ve hře, a podle nich postupně mění stav světa. Pro tento přístup jsme vytvořili `LocalWorldController`. +\subsubsection{Stav hry} -\subsubsection{Ovladač pro hru více hráčů} +% Detaily k implementaci, ale stále dost abstrahované. +% Zmínit svět, ve kterém držíme stav hry. Zmínit derivaci (proces sbírání vstupů, prozatím jen od hráče). Zmínit integraci jako aplikaci derivace na stav. -V případě hry pro více hráčů jsme vytvořil \kiinlinecode{C++}{!}{\\ClientWorldController}. Ve jméně je zmíněný *Client*, protože pro peer-to-peer architekturu by ovladač vypadal jinak. Nejedná se tedy o univerzální řešení pro hru více hráčů. Další součástí systému je `WorldServer`. Ten má v případě klient-server architektury zodpovědnost přijímat vstupy od klientů a odesílat zpátky stav světa. Architektura je podobná té pro hru jednoho hráče, pouze se změnilo kdo integruje. +Stav hry reprezentujeme kompletně ve třídě \inlcpp{World}. Ta obsahuje registr z knihovny Entt. Řídící logika je ve třídě \inlcpp{WorldController}. Obsahuje smyčku, která v každé iteraci posbírá vstupy od hráče, převede je na akce a aplikuje je společně s další definovanout logikou. Například v naší hře má vstup: stisknutí klávesy W, definovaný příkaz: \uv{posuň dopředu}, která změní vektor zrychlení hráče. Dalšími prvky, které mění změnu stavu je například fyzický engine, který upravuje zrychlení podle nárazů a nebo vlivů sil, například gravitace. -% #image("ClientServerArchitecture.png") +% Budou existovat dvě verze: pro hru jednoho hráče a pro hru více hráčů. Verze pro jednoho hráče bude vstupy číst přímo z periferií od hráče. Druhá verze bude tyto vstupy transformovat na příkazy, a posílat je na server. Aktualizovat stav světa bude až v moment, co od serveru dostane snapshot nebo událost. -Protějškem je hra šachů, kterou ovládáme hlasem a někdo jiný za nás táhne. Zvoláme "pěšec XY na ZW", tahač táhne a my vidíme, jak se našim vstupem změnil stav hry. Stejně tak to vidí i druhý hráč. Všimněme si, že druhý hráč vůbec nemusí vědět, co byl náš vstup (ten může dostat derivací), ale stačí mu pouze stav. +\subsection{Hra více hráčů} + +Nejprve her více hráčů je často klient-server model, protože poskytuje nižší celkovou odezvu. Stav hry řídí autoritativní server, který ho replikuje klientům a ti ho zobrazí hráči. Autorita serveru zjednodušuje konzistenci a detekci podvádění. Klienti na server neposílají jak vypadá jejich stav, ale pouze akce, které chtějí provést. Příkladem může být akce pohybu dopředu, kterou vyvolal hráč. Server rozesílá klientům snapshoty pro průběžně měnící se stav (např. pozice entit) a události pro jednorázové akce (např. událost o konci hry). + +Druhá varianta je model peer-to-peer. Model je složitější z hlediska synchronizace. Účastníci si mezi sebou posílají akce a každý si udržuje svůj stav, který nikomu nereplikuje. Je potřeba, aby každý měl kompletní historii akcí všech účastníků systému ve správném pořadí. Tomuto se říká \uv{event-sourcing}. Nevýhoda je, že každý hráč + +Navíc musí výsledek každé aplikace akce být všude stejný. Komplikací může být fyzický engine, který postupně integruje pozice entit podle derivace, která je reprezentována vektorem zrychlení. Každá integrace musí definovat, o jak velký časový krok se jedná (tzv. delta-time) a všichni účastníci se na něm musejí shodnout. Různé délky by rychle způsobily desynchronizaci. Zároveň všechny pseudonáhodné generátory musejí mít stejný seed a musíme si dát pozor, protože na různých platformách může aritmetrika s plovoucí desetinou čárkou dopadnout trochu jinak. I malé rozdíly by se mohli rychle projevit. \subsection{Klient-Server architektura} -Hry budeme programovat s architekturou klient-server. To znamená, že hráči budou mít klienta a někde v síti musí být dostupný server, na který se klienti budou připojovat. Server bude mít absolutní autoritu. Klienti budou na server posílat pouze vstupy, server se k nim bude chovat stejně, jako by se jednalo o hru jednoho hráče a on je přečetl z klávesnice a myši. Server bude na klienty posílat co nejčastěji stav světa. Tento stav se bude postupně měnit. Zodpovědnost programu klienta je tento stav správně zobrazit. Například vykreslit všechny entity na správných pozicích apod. - -Alternativou je peer-to-peer architektura, kdy každý uzel je zároveň server i klient, neboli peers. Na rozdíl od klient-server ale nemá nikdo autoritu. Uzly si mezi sebou posílají opět jen vstupy. Hra se simuluje na každém peerovi zvlášť. Zde nastává problém synchronizace, protože simulace se nám mohou snadno rozejít. Musíme tedy definovat, jak zjistit, že se desynchronizace stala a co s ní dělat. Musíme si dát pozor na pseudo-náhodné generátory, aby náhodné prvky hry se vyhodnotili všude stejně. Další problém může nastav v přesnosti čísel s plovoucí desetinou čárkou. Některé procesory mohou udělat operaci jinak a způsobit desynchronizaci. - -Detekovat desynchronizaci můžeme tak, že si jednou za čas peers pošlou snapshot svého stavu. - - +Pro systém jsem zvolili model klient-server, který je pro hry vhodnější, protože usnadňuje synchronizaci. V té jsou dva programy: server a klienta. Řídící logika probíhá na serveru, a ten svůj stav synchronizuje na klienty. Každý hráč, který chce hrát, musí mít svůj proces pro klienta a připojit se na server. Aplikace klienta na server posílá akce od hráče a zobrazuje aktuální stav hráči, který ze serveru přišel. +Každá akce, která přijde na server, musí být autorizována. Například ověřit, že se hráč nestaží interagovat s objektem, od kterého je moc daleko. Pokud vše proběhne v pořádku, bude přidána do fronty pro aktuální iteraci, kterou pak celou aplikuje na stav podle definované logiky. V případě, že autorizace selže, může server, s určitou tolerancí, klienta odpojit. Svůj stav průběžně replikuje klientům. Frekvence závisí na typu hry a pohybuje se od 20Hz pro pomalejší nekompetentní hry, až po 120Hz pro e-sport hry, jako například hra Valorant TODO ODKAZ. +\begin{figure} + \begin{center} + \includegraphics[width=1\textwidth]{graphics/client-server-architecture.pdf} + \end{center} + \caption{Softwarová architektura hry} + \label{fig:client_server_architecture} +\end{figure} \subsection{Server} -Rozebereme si jak vypadá program pro server. Ukážeme komponenty, které jsme pro podporu více hráčů museli přidat. Architektura se skládá z replikátoru a manažera zájmu. Stav světa, který server odesílá na klienty, se skládá z entity a komponent, které chceme synchronizovat. Replikátor pro každého hráče zakóduje entity a jejich komponenty a udržuje je synchronizované. Pomocná komponenta je manažer zájmu. Ta říká, které entity se mají synchronizovat kterým. Základní implementace by pro hráče $A$ mohla omezit entity, které mu server bude synchronizovat, na ty v maximální vzdálenosti $d$ metrů. +Představíme, jak vypadá architektura pro server a komponenty, ze kterých se skládá. Stejně jako hra jednoho hráče si ukládá stav hry, tedy instanci \inlcpp{World}. Navíc pro hru více hráčů jsou komponenty \uv{replikátor} a \uv{manažer zájmu}. Replikátor posílá snapshoty a replikuje tak stav na serveru. Může posílat i jednorázové události. + +Replikátor pracuje pouze s entitami a komponentami. Proto můžeme snapshot zjednoduššit na seznam entit s komponentami. Dále bude obsahovat seznam entit, které jsou nové a které naopak už mají zmizet. Stará se jen o to, jak tento stav synchronizovat pomocí posílání zpráv. + +Různé entity na serveru jsou pro některé hráče jinak důležité. Například ty, které jsou daleko, nemusíme synchronizovat, protože po vykreslení by nebyly vidět. Komponenta, která se o to stará je \uv{manažer zájmu}. + +Obě tyto komponenty, společně se stavem a řídící logikou, jsou ve třídě \texttt{WorldServerController}. Architektura tak využívá komponenty z hry pro jednoho hráče a skrývá distribuovanost pomocí vrstvené architektury. + +\subsubsection{Registr klientů} + +Komponenta, která spravuje spojení s hráči, se nazývá \uv{registr spojení}. Slouží jako sifon pro všechny zprávy, které klienti odesílají. Zároveň z ní lze zjistit kdo se právě připojil a kdo odpojil. K tomu slouží metody: \inlcpp{\\popDisconnectedPlayers} a \inlcpp{\\popConnectedPlayers}. Udržuje seznam nových připojení od posledního zavolání \inlcpp{\\popConnectedPlayers}. + +Třída si u každého klienta hlídá počet po sobě jdoucích selhání. Jakmile počet překročí určitou hranici, např. 5 chyb, relaci s klientem ukončí. Díky tomu, že zbytek aplikace přímo nepoužívá n-tici klientů, nemusí odpojení řešit. Pro získání seznamu existuje metoda \inlcpp{\\getClients}. + +\subsubsection{Server Replikátoru} + +Komponenta, která se snaží synchronizovat stav klientů s lokálním stavem na serveru, se nazývá \uv{replikátor}. Pro každého klienta si drží seznam entit, které musí danému klientovi synchronizovat, aby svůj úkol splnil. V případě klient-server architektury odesílá server svůj stav klientům. Základní implementace by posílala každý snímek kompletní stav entity se všemi komponentami. Lepší varianta je posílat pouze změny. Pokud se například pozice nezmění, není třeba posílat stejnou pozici jako minule. Na druhé straně u klienta máme klienta replikátoru. Ten se stará o dekódování zpráv a správné aktualizaci stavu. + +\subsubsection{Správa zájmů} + +Komponenta, která řeší důležitost entit pro jednotlivé hráče, je \uv{manažer zájmu}. Důležitost definujeme pro každou dvojici klienta a entity. Manažer zájmu podle definované logiky, například na základě vzdálenosti, určí důležitost entity pro klienta. V základní verzi jsme měli pouze dvě hodnoty: důležitá, takže je nutné ji synchronizovat, a nedůležitá, která není. Replikátor se dotazuje manažera zájmu v moment, kdy klientovi chce stav synchronizovat. + +Dotazu na všechny body, které jsou dostatečně blízko od konkrétního bodu, se říká `range-query`. Datové struktury které tuto operaci akcelerují jsou například fixní mřížka, dynamická mřížka nebo quad-tree. -\subsubsection{Registr spojení} - -Vytvořili jsme registr, ve kterém jsou všichni připojení hráči. Tato komponenta slouží jako sifon pro všechny zprávy, které klienti odesílají. Zároveň z ní lze zjistit kdo se právě připojil a kdo odpojil. Třída na to má dvě metody: \kiinlinecode{C++}{!}{\\popDisconnectedPlayers} a \kiinlinecode{C++}{!}{\\popConnectedPlayers}. Třída si udržuje seznam nových připojení od posledního zavolání \kiinlinecode{C++}{!}{\\popConnectedPlayers}. - -Také zde udržujeme počet selhání, které u klienta nastali a jakmile počet překročí určitou hranici, např. 5 chyb, relaci s klientem ukončíme. - -% Pro odstínění zbytku logiky od síťové vrstvy slouží registr spojení. O to se stará pouze třída `ClientSessionManager`. Ta hlídá, jestli se nesnaží připojit někdo další. Pokud ano, udělá s ním patřičný handshake, ve kterém si vymění důležité informace o spojení jako session ID a tajný klíč. Na rozhraní bude mít funkci `update`, která při zavolání zkontroluje nová připojení a stavy handshake. V případě, že se klient nebude dlouho ozývat, vyřadí ho z registru. Tuto skutečnost o vyřazení, a samozřejmě o připojení, by měla dát vědět. Vytvořil jsem dvě fronty, jednu pro nově připojené a jednu pro odpojené klienty. Ovladač pro svět si každý snímek tyto fronty vyprázdní. - -\subsubsection{Replikátor} - -Systém hry pro více hráčů se snaží mít na všech zařízeních stejný stav. V případě klient-server architektury odesílá server svůj stav klientům. O to se stará replikátor. Pro každého klienta si drží seznam entit, které mu musí synchronizovat. Jeho zodpovědnost je odesílat zprávy klientům tak, aby vždy měli aktuální stav. Základní implementace by posílala každý snímek kompletní stav entity se všemi komponentami. Lepší varianta je posílat pouze změny. Pokud se například pozice nezmění, není třeba posílat stejnou pozici jako minule. Na druhé straně u klienta máme replicator receiver. Ten se stará o dekódování zpráv a správné aktualizaci komponent entit. - -% Druhým důležitým systémem je replikátor. Ten pro každého klienta získá z Interest manageru seznam entit, které odebírá. Ty mu pak replikuje. Replikátor je už vrstva, která má zájem o to minimalizovat bandwidth. Všechny entity, které klient odebírá, mu musí udržovat synchronizované, ale může dělat například delta-compression. Tedy pokud se něco nezmění, tak to nebude synchronizovat. Je ale třeba, aby u každé komponenty věděl, jestli a jak ji má synchronizovat. - -\subsubsection{Interest manager} - -Zájem, neboli seznam entit, které se musí klientovi $A$ synchronizovat, vybírá komponenta manažer zájmů. - -Systém, který se bude starat o to, které entity se musejí klientům synchronizovat, se nazývá *Interest manager*. Nejprve klientovi, podle jeho ID, přiřadíme tzv. delegáta ve světě. Bude to entita s transformací. Pro každého delegáta bude v pravidelných intervalech kontrolovat a přiřazovat do zájmu ty entity, které jsou v dostatečné blízkosti. Nejprve jsem udělal základní ground-truth implementaci, která funguje na principu brute-force a nevyužívá akceleračních struktur. Jednoduše pro každou jinou entitu pomocí Pythagorovy věty zjistí, jestli je dostatečně blízko. - -Dotazu na všechny body, které jsou v určité vzdálenosti, se říká `range-query`. Datové struktury, které mi pomohli tento proces zrychlit jsou spatial grid, quad stromy a nebo kd-stromy. Techniky představím a porovnám: \subsection{Klient} -V klientské aplikaci mám komponenty svět a ovladač. ClientWorldController, která obstarává vše kolem síťování. Třída World funguje stejně jako na serveru a stará se o klasický běh hry. +Program klienta se skládá z třídy \texttt{World}, která reprezentuje stav a \texttt{ClientWorldController}, která obsahuje jednodušší řídící logiku. Řídící logika posbírá každou iteraci vstupy, převede je na akce a ty odešle na server. -\subsubsection{Replicator controller} +\subsubsection{Klient Replikátoru} -Abychom oddělili to, jak replikátor funguje, vytvořili jsme pro něj na straně klienta ovladač. To nám později umožnilo měnit protokol mezi klientem a server podle potřeby. +Abychom oddělili to, jak replikátor funguje, vytvořili jsme pro něj na straně klienta ovladač. To nám později umožnilo měnit protokol mezi klientem a server podle potřeby. Komponenta pouze přijme snapshot od serveru, provede autentizaci a pak podle něj změní stav na klientovi. \subsubsection{Interpolace} -Když jsme začali systém měřit, zjistili jsme, že áž příliš zatěžuje síť. Graf s průměry pro počet hráčů vidíme na grafu. Prvně jsme snížili počet snímků za sekundu, které server na klienty posílá, na 20 za sekundu. To snížilo zátěž na třetinu. Problém ale byl neplynulost hry. Klient sice vykresloval 60 krát za vteřinu, ale méně časté aktualizace způsobili neplynulý pohyb. Řešení je na klientovi interpolovat spojité proměnné, jako pozice nebo rotace. Do ovladače pro replikátor jsme přidali komponentu interpolátor. Do něj registrujeme jednotlivé komponenty, které chceme interpolovat. Interpolátor si je ukládá i s časovou známkou do bufferu. Na rozhraní jsem vytvořili funkci s argumentem čas a typ komponenty. +Když jsme začali systém měřit, zjistili jsme, že vysoká frekvence replikace až příliš zatěžuje síť. Graf s průměry pro počet hráčů vidíme na grafu. Snížili jsme proto frekvenci na 20Hz. To snížilo zátěž na třetinu. Problém ale najednou byl neplynulost hry. Klient sice vykresloval s frekvencí 60Hz, ale méně časté aktualizace způsobili neplynulý pohyb. Řešení je na klientovi interpolovat spojité proměnné, jako pozice nebo rotace. Do klienta replikátoru jsme přidali komponentu \uv{interpolátor}. Ta si ukládá historii konkrétních hodnot a jejich časovou známkou do bufferu. Hodnota, kterou nastaví, je pak interpolovaná z bufferu fixní čas zpět. -Technika měla nepříjemný důsledek zvýšení odezvy. To vadí především pro entity, které hráč ovládá, jako např. hráčova postava. Problém je, že když na interpolátor přijde snapshot $n$, může teprve začít interpolovat z pozice $n-1$. Proto -% Když jsem ale architekturu vyměnil za hru pro více hráčů, narazil jsem na obrovské zatížení sítě, protože posílat 60x za vteřinu $n$ vstupů a pak $n$ set snapshotů zpátky má objem. Především řeším velikost snapshotů, protože vstupy hráče lze reprezentovat velmi úsporně, a to bitem pro každou akci, kterou mohl vyvolat. +\subsubsection{Rollback} -% Pro snížení náročnosti jsem umožnil nastavit počet snímků za vteřinu a nastavil 20. To pomohlo, ale za cenu velmi neplynulého hraní. Naštěstí pro plynulost hraní nám stačí pozice a rotace, a ty můžeme interpolovat. Přidal jsem tedy klientovi možnost si pozice uložit do bufferu a postupně, s fixním zpožděním, je interpolovat. +Interpolovat zlepšilo plynulost, ale nepříjemně zvýšilo odezvu mezi vstupem od hráče a vyvolanou změnou stavu. Možným řešením je simulovat řídící logiku i na klientovi, ale pouze pro konkrétní entitu, kterou hráč ovládá. Odezva bude v podstatě nulová, ale navíc bude nižší než před interpolací. -\subsubsection{Rollback a simulace vlastního hráče} - -Interpolovat sice pomohlo pro plynulost, ale zvýšilo odezvu, což je nepříjemné. Způsob, jakým jsem se rozhodl tento problém řešit, je integrovat hráče pro daného klienta přímo na klientovi. Nejen že odezva bude v podstatě nulová, ale navíc bude ještě nižší než před interpolací. Musel jsem ale vytvořit mechanismus, který v případě, že se simulace neshodnou, tak na klientovi stav hráče opraví. - -Do bufferu jsem si ukládal pro konkrétní snímky vstup od hráče, který pošlu na server, a aktuální stav, ve kterém hráč je. Následně když ve snímku $x$ přijde snapshot pro snímek $x - t$, který má až moc velkou odchylku, tak vrátíme stav světa na $x - t$ a podle vstupů z bufferu znova integrujeme. Tím dostaneme novou a opravenou pozici. +Vytvořili jsme buffer, do kterého ukládáme konkrétní moment stavu, číslo iterace stavu a seznam akcí, která se v danou iteraci mají aplikovat. Pokud dostaneme snapshot pro snímek $x$ a z bufferu přečteme, jaký byl v iteraci stav. Pokud se neshodují, celý původní stav načteme a opravíme podle snapshotu. Následně znova aplikujeme všechny akce a přepíšeme tak náš buffer, až se dostaneme do aktuální iterace. Poté normálně pokračujeme s opraveným stavem. -\subsection{Komunikační protokol} -Představíme komunikační protokol, který replikátor využívá. +\subsection{Posílání zpráv} + +% Popis našeho middleware pro posílání zpráv. +% Sedí na dvojicí TCP a později QUICr. +% Měl by poskytovat možnost, jak posílat zprávy nespolehlivě. +% Zpráva přijde vždy buď celá, nebo vůbec. + +Popíšeme náš middleware pro posílání zpráv a jeho protokol založený na TCP. Poskytuje službu oboustranného peer-to-peer posílání zpráv na různé koncové body, které jsou identifikované čtyř bytovým číslem. Strana může pro libovolný identifikátor definovat handler, který se po získání takové zprávy spustí. Protokol zajišťuje spolehlivost na úrovni zpráv. To znamená, že zpráva dorazí buď celá, nebo vůbec. Později v kapitole \ref{sec:quicr} představíme náš protokol v transportní vrstvě, který umožňuje posílat zprávy spolehlivě i nespolehlivě. + +\subsubsection{Kódování zpráv} + +Middleware využívá TCP, které na rozhraní při čtení a zápisu pracuje s proudem bytů, který není logicky rozdělený. Jediné pevné body jsou začátek a konec proudu. UDP na druhou stranu zaručuje, že celý buffer dat odeslaný přes \texttt{write} operaci bude přečtený vždy právě jedním voláním \texttt{read} operace. Náš protokol definuje oddělení zpráv tak, aby šli v proudu najít. + +První čtyři byty každé zprávy jsou tzv. MAGIC číslo. Konstanta, která nemá jiný význam než záchytný bod při čtení. Dekodér v počátečním stavu hledá v proudu tuto hodnotu. Pokud ji do určitého počtu bytů nenajde, ukončí spojení z důvodu narušení protokolu. Když konstantu najde, přečte další čtyři byty, které reprezentují délku těla a další čtyři byty reprezentující ID koncového bodu. + +Vlastnost, kterou jsme v průběhu testování potřebovali, byla možnost request-reply modelu. Zároveň jsme ale chtěli mít možnost posílat zprávy stylem fire-and-forget. Nemohli jsme tedy použít způsob, jaký používá HTTP/2. Místo toho lze při odeslání zprávy definovat, že čeká na odpověď a její identifikační číslo. Druhá strana naopak může poslat odpověď, když zprávu definuje jako odpověď pomocí příznaku a identifikačního čísla zprávy, na kterou odpovídá. + +\subsubsection{Implementace} + +Vytvořili jsme třídu \inlcpp{MessagingSession}, která má na rozhraní metody \inlcpp{set\_handler(endpoint\_id)}, \inlcpp{send} a \inlcpp{request}. První metoda nastaví pro koncový bod \inlcpp{endpoint\_id} handler lambdu. Druhá pošle zprávu stylem fire-and-forget. To znamená, že se nestaráme o odpověď a synchronizace je v moment, kdy si zprávu převezme middleware. Poslední metoda umožňuje poslat požadavek a nastavit handler pro odpověď. + +\subsubsection{Detekce a náprava chyb} + +Občas mohou nastat v proudu chyby, kdy zprávu nelze dekódovat, nebo nastane chyba při deserializaci. Proto jsme do kódování implementovali nápravu chyb. Už jsme definovali maximální délku pro hledání magické konstanty. Dále si dekodér pro spojení počítá chyby. Ten se po každé úspěšně dekódované zprávě resetuje na 0. Pokud počet překročí definovanou toleranci 3 chyb, spojení bude ukončeno. Příkladem takové chyby je selhání deserializace nebo že TCP spojení bylo přerušeno. + + + + +\subsection{Serializace} + +Zpráva je v programu reprezentovaná objektem. Proces, který ji převede na n-tici bytů se říká \uv{serializace}. Existují různé knihovny, které umí objekty serializovat. Některé umí serializovat přímo třídy definované v konkrétním programovacím jazyce. Jazyk C++ ale nemá runtime reflexi jako C\# nebo silná makra jako Rust, a tento způsob není možný. Druhá varianta je definovat tyto třídy ve speciálním jazyce pro definici schémat. Před sestavením programu z této definice vygenerujeme třídy v jazyce, který potřebujeme. Do tříd se vygenerují i metody pro serializaci. Tento přístup umožňuje například ProtoBuf, Cap'n'Proto a další. Jeho výhoda je možnost vygenerovat třídy v různých programovacích jazycích. Pokud máme architekturu orientovanou na služby, kde každá je implementována v jiném jazyce, nemusíme definice lokalizovat. + +Hned na začátku jsme se rozhodli nepoužít JSON nebo XML, protože jsou to textové formáty a jejich forma je často větší než binárních formátů. Například číslo 1 000 000 se v JSON zakóduje do 7 bytů, i když binární reprezentace stejného čísla se vleze do 4 bytů. Rozdíl je téměř dvojnásobný. Každý atribut objektu se v JSONu reprezentuje řetězcem, namísto identifikačním číslem o 2 bytech, které by bylo menší. Výhody formátu jsou především liberalní zpracování, kdy se schémata dvou koncových bodů mohou i trochu lišit, ale pokud má zpráva všechny potřebné atributy, tak se strany domluví. Pokud v binárním formátu je atribut navíc, nemusí se druhé straně podařit zprávu deserializovat. Proto se někdy JSON používá jako záložní formát, kdy dvě strany provedou handshake a domluví se na formátu. Pokud zjistí, že jedna strana používá starší definici schématu, mohou použít záložní JSON. + +Rozhodli jsme se začít velmi rozšířeným ProtoBuf formátem. Začneme definicí zpráv mezi serverem a klientem. Vytvořili jsme WorldServerMessages.proto soubor, do kterého budeme zprávy definovat. Trochu formát \inlcpp{.proto} představíme. V kódu \ref{code:entity_spawn_message} vidíme definici zprávy, která říká, že si příjemce má do svého stavu přidat novou entitu. Obsahuje tři atributy: ID pro navázání budoucích zpráv o entitě, příznak, jestli se jedná o hráče a jméno. + +\begin{kicode}{cpp}{}{cpp} + message EntitySpawnMessage { + uint32 entity_id = 1; + bool is_player = 2; + string name = 3; + } + \label{code:entity_spawn_message} +\end{kicode} + +Jazyk vypadá podobně jako C. Nejprve použijeme klíčové slovo \inlcpp{message} a název typu. Do těla píšeme atributy oddělené středníkem. Všimněme si, že pro každý atribut musíme definovat jeho unikátní číslo. To slouží při identifikaci a pomáhá při úpravách definice, abychom měli kontrolu nad tím, pod jakým klíčem se hodnota serializuje. + +FlatBuffers je opět protokol od Googlu, který se vyvýjel pro použití v herních enginech pro hry více hráčů. Jeho výhoda je, že není třeba zprávu "deserializovat". Instanci třídy čte atributy přímo z n-tice bytů. V případě 60 zpráv za vteřinu zprávy od stovek hráčů, je rozdíl mezi deserializací a FlatBuffers znát. + +Posledním příkladem je Cap'n'Proto, čteno Captain Proto. Je to volně dostupný protokol, který nemá deserializaci, a je tak velmi rychlý. Jeho tvůrce navíc pracoval právě na ProtoBuf. + + + + + + +\subsection{Metriky} + +Představíme metody měřění a metriky v systému, které jsme využili pro hledání potenciálních míst pro optimalizaci. Pro sbírání metrik je třeba mít úložistě, kam budeme metriky ukládat a rozhraní, přes které je budeme vizualizovat. Úložiště může být například CSV soubor nebo relační databáze. Existují optimalizované databáze pro vkládání dat s časovou známkou, kterým se říká \uv{timescale}. Jsou ideální právě pro metriky nebo logy, protože narozdíl od klasických databází jsou optimalizované pro rychlé vkládání. Rozhodli jsme se použít relační databázi \uv{PostgreSQL} s rozšířením \uv{TimescaleDB}. Pro vizualizaci jsme použili službu \uv{Grafana}, která umí z TimescaleDB číst. Všechny tyto služby popíšeme v následujících částech. + +\subsubsection{PostgreSQL} + +Populární relační databáze je PostgreSQL. Rozhodli jsme se právě pro tu, protože je to otevřený a svobodný software zdarma. Lze si ho snadno nasadit lokálně, ať už daemoném nebo jako Docker kontejner. Skrze rozšíření jako TimescaleDB lze přidat podporu a optimalizace pro různé použití. V našem případě se chceme ukládat informace o hráčích a stav světa pro perzistenci a metriky. Informace o hráčích a stav světa zvládne bez problémů v základní verzi. Pro metriky použijeme zmíněné rozšíření. + +\subsubsection{TimescaleDB} + +Pro optimalizaci PostgreSQL pro časová data jsme zvolili TimescaleDB. Díky tomu, že se jedná o rozšíření, nemusíme spravovat jinou službu, než PostgreSQL. TimescaleDB umožňuje vytvářet tzv. hypertables, které jsou optimalizované pro rychlé vkládání. Vytvořili jsme komponentu \inlcpp{NetworkMetricsReporter}, která má na rozhraní různé metody pro získávání metrik. Např. \inlcpp{report\_outbound} a \inlcpp{report\_inbound}. Tyto údaje posílá do komponenty \inlcpp{TimescaleDbWriter}. To je konkrétní implementace pro TimescaleDB, které má na rozhraní metodu \inlcpp{report(metric\_name, value)}. V rámci optimalizace si \inlcpp{NetworkMetricsReporter} metriky ukládá do bufferu, který až pomocí metody \inlcpp{flush} odešle do databáze. To se neděje nutně po každé metrice, ale v našem případě si reportér ukládá hodnoty do bufferu a po intervalech je vkládá do databáze. + +\subsubsection{Grafana} + +Grafana je služba, která skrze webovou stránku poskytuje rozhraní pro vizualizaci metrik. Lze nastavit svůj dashboard a v něm různé grafy. Pro naše účely jsme vytvořili grafy pro odchozí a příchozí množství bytů. Služba slouží spíše pro sledování stavu a neumožňuje pokročilejší analýzu. + +\begin{figure} + \begin{center} + \includegraphics[width=1\textwidth]{graphics/grafana.png} + \end{center} + \caption{Příklad Grafana dashboardu} + \label{fig:grafana} +\end{figure} + +\subsubsection{Orchestrace} + +Popíšeme, jak jsme všechny služby zprovoznili a nastavili. Podrobněji se na orchestraci podíváme později. + + + +\subsubsection{ImGui} + +Pro uživatelské rozhraní jsme použili knihovnu ImGui a ImPlot. Tyto knihovny využívají pro vykreslování grafickou kartu a snadno se dali integrovat do našeho vykreslovacího enginu. Knihovna funguje procedurálně, nikoliv objektově. Každý snímek, který vykreslujeme, musíme celé rozhraní definovat znova. To uděláme pomocí volání funkcí. Nejprve zavoláme funkci \inlcpp{Begin("Název okna")}, která zobrazí okno, do kterého můžeme vložit další prvky, jako texty, textové vstupy, nebo tlačítka. Tento přístup je pro herní enginy a podobné kreativní aplikace ideální, protože umožňuje velmi snadno a rychle dělat dynamické uživatelské rozhraní. + +Knihovnu jsme využili pro vykreslení metrik přímo uživateli klienta. + +\subsubsection{Tracy} + +Pro měření a pokročilejší analýzu výkonu programu klienta nebo serveru používám profiler Tracy. Je zdarma, open-source, napsaný v C++ a pro vykreslování UI využívá ImGui. Poskytuje přesnost na nanosekundy, což je užitečné u serverů, na kterém může být miliony různých entity. Navíc umožňuje připojit se k programu, který měří, vzdáleně. Případně sbírat metriky do souboru, ten si ze serveru stáhnout a analyzovat později. + +V kódu umožňuje definovat jednotlivé iterace řídící logiky zvané snímky. Následně umožňuje definovat tzv. \uv{zóny}, které následně měří. Zóna může být průběh funkce nebo její konkrétní část. Na obrázku \ref{fig:frame_in_tracy} vidíme, jak taková analýza vypadá. Vidíme právě jeden snímek. V něm máme označené části replikátoru a manažera zájmu. Také vidíme dole zóny. + +\begin{figure} + \begin{center} + \includegraphics[width=1\textwidth]{graphics/300playerstrace.png} + \end{center} + \caption{Jeden snímek v Tracy} + \label{fig:frame_in_tracy} +\end{figure} + +\subsubsection{Konkrétní metriky} + +Vyjmenujeme metriky, které budeme měřit. Je dobré zmínit, že místo, ze kterého budeme metriky sbírat, je server. + +\begin{description} + + \item[{Inbound/Outbound bandwidth}] \hfill \\ + Nejpřirozenější metrika je příchozí a odchozí množství dat v bytech. Už zde pro mě bylo nutné si uvědomit důležitost oddělit vrstvu, která kóduje a dekóduje zprávy, od zbytku. Přesně na tomto místě totiž budu metriky dělat. Metriku budu sčítat. + + \item[{Odezva}] \hfill \\ + Budu měřit odezvu mezi odesláním vstupu od klienta pro snímek x a odpovědí od serveru pro snímek x. Tuto metriku budu průměrovat. + + \item[{Počet snímků za vteřinu}] \hfill \\ + Ze začátku se mi stávalo, že uzké hrdlo nebyla síť, ale síťová vrstva v aplikaci, která třeba dlouho skládala zprávy. Proto si udržuju i přehled o počtu snímků, které server stíhá. Podle toho se lze orientovat při výběru hardware pro server. +\end{description} + +\subsubsection{Sbírání v reálném čase} + +Přímo v hráčově klientské aplikaci jsme chtěli mít možnost vidět metriky v reálném čase. Do síťové vrstvy jsme přidali komponentu pro reportování událostí a jejich metrik zvanou \inlcpp{NetworkMetricReporter}, která obsahuje metody jako \inlcpp{report\_inbound} a \inlcpp{report\_outbound}. První metoda hlásí příchozí byty a druhá odchozí. + -% Pro použití UDP jsem musel přepracovat jak komponenta Messenger funguje. Shrnu co všechno bylo potřeba při návrhu vzít v potaz. Spolehlivost tak, aby nemusela být potřeba vždycky. TCP se čte jako proud bytů bez jasného rozdělení na jednotlivé packety, zatímco když na UDP socket zavolám `recv`, dostanu právě jeden datagram. Potřeboval jsem kódování zpráv, které bude pasovat na oba typy. -% Rozdělil jsem program architektonicky do tří vrstev. První je síťová, která ze socketu čte data a dekóduje z nich rámce. Komponenta, která toto řeší, jsem pojmenoval `QuicrEndpoint`. Ten po vytvoření instance otevře socket. Obsahuje rozhraní pro `bind`, který socketu přiřadí konkrétní port. k -% Problém je, kam umístit fronty. V případě serveru totiž chceme jednu velkou příchozí frontu rámců, ale frontu zvlášť pro každé připojení. Důvod univerzální fronty je, že můžeme mít více workerů, které zprávy budou obstarávat. Důvodem individuální fronty pro každé připojení je, aby se nestalo, že jeden hladový socket zablokuje všechny ostatní. Je proto třeba být v posílání packetů fér. \subsection{Protokol QUICr} -Naše hra používala ke komunikaci mezi vrcholy protokol TCP. Zmínili jsme ale, že ten pro hry nemusí být vhodný. Vytvořil jsme proto protokol inspirovaný QUIC, který využívá UDP, ale upustil jsem podmínky pro spolehlivost, konkrétně jistotu doručení a uspořádání. V protokolu je možné na každém rámci definovat spolehlivost zvlášť. Ty, které budou obsahovat pozice hráčů, tak budu moct odesílat nespolehlivě, zatímco změny stavu, jako výměna animace nebo modelu, budu posílat spolehlivě. Pro vytvoření spojení budu používat dva objekty: koncový bod a spojení. +Naše hra používala ke komunikaci mezi vrcholy protokol TCP. Zmínili jsme ale, že ten pro hry nemusí být vhodný. Vytvořil jsme vlastní protokol inspirovaný QUIC, který využívá UDP, ale upustili jsme podmínky pro spolehlivost, konkrétně jistotu doručení a uspořádání zpráv. Nakonec jsme TPC a QUICr porovnali, abychom se o optimalizaci přesvědčili. -Koncový bod se stará o socket, tedy čtení a zápis na něj, a udržuje si objekty spojení, které ho využívají. Když přijde na socket datagram, správně ho přiřadí spojení. Jeho chování je definované jako ťik. V něm posbírá zprávy, které se spojení snaží poslat a pošle je, následně přečte socket a roztřídí datagramy. +Protokol je obousměrný proud paketů se spolehlivými a nespolehlivými rámci využívající UDP. Jeden poslaný UDP datagram může mít více paketů. Rámce můžeme rozdělit na dva typy: datové a ovládací. Ovládací slouží pro handshake, ukončení spojení nebo nastavení jiných parametrů spojení a budou vždy spolehlivě doručené. Datové obsahují aplikační data a mohou definovat svou spolehlivost. Ty, které budou obsahovat pozice hráčů, tak budeme moct odesílat nespolehlivě, zatímco změny stavu, jako výměna mesh, posíláme spolehlivě. Architektura se skládá ze dvou komponent: \uv{koncový bod} a \uv{spojení}. -\begin{center} - \begin{longtable}{>{\bfseries}l >{\ttfamily}c L{cm}} - \caption{Rozhraní třídy QuicrEndpoint}\label{tab:prepinace}\\ - {\normalfont Název metody} & {\normalfont Popis} \\ - \hline - bind(port) & Přiřadí socketu konkrétní port. \\ - - write(adress, payload) & Odešle `payload` přes socket na adresu `address`. Tato funkce bude volána objektem typu QuicrConnection, která tak bude odesílat celé datagramy. \\ - - poll & Přečte ze socketu všechny datagramy, které najde a podle hlavičky dekóduje ID spojení. Po zjištění ID zprávu přiřadí právě tomu spojení.. \\ - \end{longtable} -\end{center} +Koncový bod se stará o soket pro UDP: čtení a zápis na něj, a udržuje si registr navázaných spojení. Při přečtení datagramu, který splňuje formát, ho správně nasměruje podle registru. Nechtěli jsme, aby si implementace QUICr spravovala vlastní asynchronní kontext. Namísto toho jsme definovali metodu pro ťik, která posbírá zprávy od jednotlivých navázaných spojení a pošle je. Následně přečte všechna data ze soketu a roztřídí je do navázaných spojení. -Druhý objekt, spojení, je navenek stavový stroj a fronta zpráv, podobně jako TCP spojení. Stavový stroj mění stavy v reakci na příchozí rámce. Když na koncový bod přijde datagram, odešle ho do správného objektu připojení. Tento objekt si datagram přečte a postupně prochází rámce v něm. Stavový stroj bude důležitý hlavně v procesu zvaném "handshake", který definuju níže. +Objekt navázaného spojení je stavový stroj a fronta příchozích a fronta odchozích zpráv, podobně jako TCP spojení. Stavy se mění v reakci na příchozí kontrolní rámce. Jeden objekt navázaného spojení může mít přiřazených více ID. Tento objekt si datagram přečte a přeloží na pakety a rámce. Ty postupně prochází. Stavový stroj bude důležitý hlavně v procesu handshake, který definujeme níže. + +\subsubsection{Rámec} + +Hlavním prvkem protokolu jsou právě rámce. Jak už bylo nastíněno, dělíme je na kontrolní a datové. Pro využití nespolehlivosti jsme u každého datového rámce umožňili definovat, jestli je spolehlivý nebo nespolehlivý. O spolehlivost obecně se stará komponenta \inlcpp{ReliabilityUnit}, kterou podpobněji představíme v kapitole \ref{sec:quicr_reliability}. + + +% U UDP je další problém, a to ten, že když implementuju připojení pro UDP, tak všechny datagramy budou chodit na socket, na kterém poslouchám. Když budu ze socketu číst, dostanu libovolný datagram, který zrovna přišel, společně s adresou, ze které přišel. Tuto adresu přečtu z IP hlavičky, která není zašifrovaná, a tudíž ji kdokoliv může zfalšovat. Tomu se říká tzv. IP spoofing. Tento útok je poměrně slabý, protože v případě odpovědi budu stále odesílat data zpět na správnou adresu. Útok může sloužit například pro poslání požadavku na odpojení, nebo posílat jiné vstupy. Jedná se tedy spíše o neškodný ale otravný charakter útoku. -Zároveň jsem se rozhodl, že na spojení nebude zdánlivě nekonečný proud bytů, jako je tomu například v TCP, ale fronta zpráv. Výhoda je, že když začnu číst datagram, tak mám jistotu, že nenarazím na konec bufferu a budu si muset načíst další část. V mém případě jedno čtení znamená čitelná zpráva, tak jak jsme byla odeslána. -\subsubsection{Frame} -Inspiroval jsem se u protokolu QUIC, který datagram rozděluje na tzv. framy neboli \uv{rámce}. Tyto rámce můžu kódovat jak v TCP, tak v UDP. V případě UDP jsem se rozhodl u každého rámce definovat jeho spolehlivost, tedy jestli musí frame dojít vždy. Připojení pak bude mít jednotku pro spolehlivost, která bude spolehlivost zaručovat. -U UDP je další problém, a to ten, že když implementuju připojení pro UDP, tak všechny datagramy budou chodit na socket, na kterém poslouchám. Když budu ze socketu číst, dostanu libovolný datagram, který zrovna přišel, společně s adresou, ze které přišel. Tuto adresu přečtu z IP hlavičky, která není zašifrovaná, a tudíž ji kdokoliv může zfalšovat. Tomu se říká tzv. IP spoofing. Tento útok je poměrně slabý, protože v případě odpovědi budu stále odesílat data zpět na správnou adresu. Útok může sloužit například pro poslání požadavku na odpojení, nebo posílat jiné vstupy. Jedná se tedy spíše o neškodný ale otravný charakter útoku. \subsubsection{Handshake} -Po vytvoření instance připojení z koncového bodu je připojení ve stavu `Closed`, neboli uzavřené. Pro navázání spojení jsem potřeboval, aby se dva objekty domluvili, například na svých ID, tajném klíči a verzi. Proto jsem definoval **handshake**. Mějme dva koncové body $A$ a $B$, které se mezi sebou budou snažit navázat spojení. Začne koncový bod $A$, a to tím, že odešle na koncový bod $B$ paket typu Initial, který obsahuje rámec typu `Hello`. Jakmile na koncový bod dorazí QUICr paket, který má v hlavičce jako Destination ID číslo, které nemá v registru, tak si ho přidá a přiřadí novou instanci připojení. Nová instance se chová stejně jako na straně $A$ a vygeneruje si unikátní identifikátor. Po vytvoření instance nechá koncový bod toto připojení tento paket zpracovat celý. +Objekt navázaného spojení obsahuje stavový stroj a postupně mezi stavy přechází. Počáteční stav je \inlcpp{Closed}. Jedna strana musí začít a odeslat paket s \inlcpp{Hello} rámcem. Po obdržení se stavový stroj druhé strany přesune do \inlcpp{ReceivedHello} a spolehlivě odešle \inlcpp{Hello}. Když strana dostane rámec \inlcpp{Hello} tak ví, že v hlavičce paketu je cílové i lokální ID. Proto už touto výměnou se strany shodli na ID navázaného spojení, které budou používat. Poté už si vymění rámec \inlcpp{HandshakeDone} a spojení je navázané a připravené k posílání.Celý stavový diagram vidíme na obrázku \ref{fig:quicr_handshake}. -Nové připojení projde všechny rámce v paketu. Měl by narazit na rámec Hello, který když najde, a je ve stavu `Initial`, tak z hlavičky zjistí unikátní ID druhé strany a uloží si ho. Reaguje na rámec tak, že druhé straně odešle přes koncový bod paket, který obsahuje: rámec ACK o tom, že paket s číslem přijal, a rámec Hello. ACK si pro začátek představme zakódovaný jako: první 4 byty reprezentují kladné celé číslo pro počet rámců, řekněme $n$, které chceme označit jako přijaté. Následně přečteme $4n$ bytů. Každé 4 byty představují číslo paketu, který označíme jako ACKed. Jednotce, která udržuje stav o tom, jaké pakety jsou potřeba oznámit jako ACK a které je třeba poslat znovu, budu říkat `RealiabilityUnit` a podrobněji ji rozeberu později. +% Nové připojení projde všechny rámce v paketu. Měl by narazit na rámec Hello, který když najde, a je ve stavu `Initial`, tak z hlavičky zjistí unikátní ID druhé strany a uloží si ho. Reaguje na rámec tak, že druhé straně odešle přes koncový bod paket, který obsahuje: rámec ACK o tom, že paket s číslem přijal, a rámec Hello. ACK si pro začátek představme zakódovaný jako: první 4 byty reprezentují kladné celé číslo pro počet rámců, řekněme $n$, které chceme označit jako přijaté. Následně přečteme $4n$ bytů. Každé 4 byty představují číslo paketu, který označíme jako ACKed. Jednotce, která udržuje stav o tom, jaké pakety jsou potřeba oznámit jako ACK a které je třeba poslat znovu, budu říkat `RealiabilityUnit` a podrobněji ji rozeberu později. -Přeskočme zpět na klienta, který dostává paket typu Initial, ve kterém je rámec Hello a ACK. Pro rámec Hello se chová stejně jako druhá strana, a pokud je ve stavu `SendHello`, nastaví si Destination ID. Všechna čísla paketů z ACK rámce předá do jednotky pro spolehlivost. Jelikož víme, že tam je číslo paketu, který obsahuje právě prvotní Hello, tak si jednotka tento rámec odebere z fronty pro opakované odeslání. +% Přeskočme zpět na klienta, který dostává paket typu Initial, ve kterém je rámec Hello a ACK. Pro rámec Hello se chová stejně jako druhá strana, a pokud je ve stavu `SendHello`, nastaví si Destination ID. Všechna čísla paketů z ACK rámce předá do jednotky pro spolehlivost. Jelikož víme, že tam je číslo paketu, který obsahuje právě prvotní Hello, tak si jednotka tento rámec odebere z fronty pro opakované odeslání. \begin{description} - + \item[{Closed}] \hfill \\ Počátečním stavem je `Closed`. Zároveň se jedná o stav, do kterého se spojení dostane, pokud dlouho s druhou stranou nekomunikuje. - + \item[{SentHello}] \hfill \\ - Po odeslání Hello packetu se spojení dostane do stavu `SentHello`. V tomto stavu čeká na `HelloAck` zprávu. - + Po odeslání \texttt{Hello} rámce se spojení dostane do stavu \texttt{SentHello}. V tomto stavu čeká na \texttt{Hello} rámec od druhé strany. + \item[{ReceivedHello}] \hfill \\ - Jakmile server dostane zprávu Hello, dostane se do stavu `ReceivedHello`. - + Jakmile strana dostane rámec \texttt{Hello}, přejde do stavu \texttt{ReceivedHello}. V ten moment čeká na potvrzení, že spojení bylo navázáno, tedy rámec \texttt{HandshakeDone}. + \item[{Established}] \hfill \\ Po odeslání HandshakeDone zprávy se klient dostane do stavy Established. Jakmile server přijme zprávu HandshakeDone, taky se dostává do stavu Established. - + \end{description} -Klient následně odpovídá Handshake done, protože už má všechny informace, které potřebuje o spojení. Upustil jsem od packetů a nechal pouze rámce. -\subsubsection{Spolehlivost} +\begin{figure} + \begin{center} + \includegraphics[width=1\textwidth]{graphics/quicr_handshake.pdf} + \end{center} + \caption{Stavový stroj QUICr handshake} + \label{fig:quicr_handshake} +\end{figure} -Pro spolehlivost se protokol stará podobně jako QUIC, s tím rozdílem, že ji rozlišuje nad jednotlivými rámci. Všimněme si, že něco podobného má i samotný QUIC. Pokud odešleme paket, ve kterém je pouze ACK rámec, tak nedostaneme nikdy zpátky ACK. Rámec ACK se tedy chová stejně, jako by byl nespolehlivý. Rámce tak můžeme dělit na dvě kategorie: spolehlivé a nespolehlivé. Nespolehlivé rámce spojení odešle a hned je zapomene, tzv. fire and forget. O spolehlivé rámce se stará třída zvaná `QuicrReliabilityUnit`. Každá instance připojení na koncovém bodě má svou instanci, kterou ke spolehlivosti využívá. Její rozhraní tvoří 4 hlavními metodami: +\subsubsection{Spolehlivost} \label{sec:quicr_reliability} + +O spolehlivost doručení se protokol stará posíláním \inlcpp{Ack} rámců s číslem paketu, který získal. Navíc ale rozlišujeme spolehlivost na základě jednotlivých rámců. Pokud paket neobsahuje žádný spolehlivý rámec, nemusí pro něj příjemce posílat \inlcpp{Ack} rámec. Protokol v tento moment neřeší spolehlivost pořadí paketů. V našem případě posíláme například akce z klienta na server a u každé definujeme číslo snímku. Server si udržuje nejvyšší číslo snímku, které dostal, a všechny zprávy z nižších snímků zahazuje. Stejně to dělá klient se snapshoty. Proto neřešíme pořadí na transportní vrstvě. + +Spolehlivost řeší komponenta \inlcpp{ReliabilityUnit}, která si udržuje frontu rámců, které je potřeba odeslat, čas, kdy je potřeba rámec odeslat a jejich spolehlivost. Čas slouží pouze pro prioritu a málokdy se stane, že se rámec odešle právě v tento čas. Objekt \inlcpp{QuicrEndpoint} se při ťiku dotazuje \inlcpp{QuicrConnection} na další datagram, který chce odeslat. Ten pomocí \inlcpp{ReliabilityUnit} začne datagram skládat z paketů. Když přijde rámec na řadu a je spolehlivý, hned se umístí na konec fronty a nastaví se mu čas odeslání. Většinou aktuální čas s přičteným konstantním intervalem. Pokud je nespolehlivý, do fronty se nevrátí. Krátce představíme rozhraní \inlcpp{ReliabilityUnit} objektu. \begin{description} - - \item[\texttt{push\_reliable\_frame(deadline, frame)}] \hfill \\ - Uloží si zakódovaný rámec a nastaví si u něj čas deadline. Jakmile bude po deadline, jednotka se bude snažit odeslat rámec znovu. - + + \item[\texttt{push\_reliable\_frame\_to\_send(deadline, frame)}] \hfill \\ + Uloží si zakódovaný rámec a nastaví si u něj čas odeslání. Jakmile bude po deadline, jednotka se bude snažit dostat rámec do dalšího datagramu. Rámec se ukládá v zakódované podobě tak, aby byla předpovídatelná jeho velikost a snadno se odhadovalo, jestli se do dalšího datagramu vleze. + \item[\texttt{peek/pop\_reliable\_frames\_to\_send(packet\_number)}] \hfill \\ - Vrátí rámce, které je potřeba v tomto okamžiku odeslat. Číslo paketu je důležité proto, aby jednotka věděla, které všechny rámce může ACK pro určitý paket označit jako hotové. - + Vrátí rámce, které je potřeba v tomto okamžiku odeslat. Číslo paketu \texttt{packet\_number} si jednotka přiřadí jako verifikátor doručení rámce, který metoda vrátí. To znamená, že když toto číslo přijde v \texttt{Ack} rámci, bude jednotka vědět, který rámec může odebrat. Zároveň může mít vícero vazeb čísla paketu na jeden rámec. Libovolné číslo paketu smaže provázaný rámec. Důvod je, aby mohlo být v oběhu více paketů se stejným rámcem. + \item[\texttt{push\_ack(packet\_number)}] \hfill \\ - Uloží si do seznamu číslo paketu a v další iteraci ho odešle jako ACK. - + Vloží do seznamu čísel paketů. Celý tento seznam se odešle v \texttt{Ack} rámci v dalším datagramu. + \item[\texttt{peek/pop\_acks\_to\_send()}] \hfill \\ - Vrátí seznam paketů, které je třeba odeslat jako ACK. Zároveň si je ze seznamu odebere. - + Vrátí seznam čísel paketů, které musí druhé straně oznámit jako doručené. + \end{description} -Jednotka pro spolehlivost si každý vložený rámec uloží, společně s časem, do kdy je potřeba ho odeslat znova, tzv. `deadline`. Tento přístup mimo jiné umožňuje vložit spolehlivý rámec rovnou do jednotky s deadline aktuálního času. Rámec se odešle co nejdříve a zajistí se jeho spolehlivost. - -Dále si jednotka ukládá čísla paketů, které jsou v oběhu. Každý takový paket v oběhu ukazuje na seznam odkazů na spolehlivé rámce, které obsahuje. Když přijde číslo paketu jako ACKed, jednotka odstraní všechny rámce, na které paket ukazuje, a nakonec zapomene celý paket. Mohlo by se stát, že pro jisté pakety se nedoručí ACK nikdy, ale tyto pakety můžeme jednoduše vyčistit kontrolou, jestli obsahují alespoň jeden rámec, který nebyl takto označen. - -Do jednotky si ukládám už zakódované rámce, protože tak můžu snadno odhadnout jejich velikost. Když bude - -Možná jste si všimli, že nezaručujeme spolehlivost pořadí. Tuto záruku jsme do protokolu zatím nepřidávali, protože si stejně do paketu ukládáme číslo snímku, které je potřebné pro správnou aktualizaci světa. Toto číslo bychom z čísla paketu nebyly schopni vyčíst. Zároveň nás v našem případě nezajímá, ve kterém pořadí pakety pro jeden snímek přijdou. Kdybychom měli úplné uspořádání, a odeslali bychom z replikátoru datagramy $A$ a $B$, které by přišli na klienta v pořadí $B$, $A$, musel by klient čekat na datagram $A$, i když by mohl zpracovávat datagram $B$. - \subsubsection{Enkodér} -Pro kódování jsme vytvořili komponentu \kiinlinecode{C++}{!}{\\QuicrEncoder}, která přes konstruktor získá cílový buffer, do kterého má kódovat a na rozhraní má různé pomocné metody pro kódování hlaviček a rámců. Specifická vlastnost, kterou jsme potřebovali, je kódovat, dokud je v bufferu místo. Pokud zbývá $r$ bytů místa a replikátor by chtěl zakódovat rámec, který má $> r$ bytů, musí metoda vrátit informaci o neúspěchu, ale nevyhazovat vyjímku, ani neposunovat kurzor. Důvodem je, že UDP je nad protokolem IP, který může začít fragmentovat datagramy. Proto se většina protokolů snaží držet velikost datagramů kolem 1200 bytů. Podobný přístup jsme adaptovali my. -Dále musel umožňovat zakódovat hodnotu zpětně, jako například délku, kterou kvůli omezení bufferu víme až později. +Pro kódování jsme vytvořili komponentu \inlcpp{QuicrEncoder}, která přes rozhraní umožňuje kódovat pakety a rámce do libovolné alokované paměti. Specifická vlastnost, kterou jsme potřebovali, je kódovat, dokud je v bufferu místo. Pokud zbývá $r$ bytů místa a replikátor by chtěl zakódovat rámec, který má $> r$ bytů, musí metoda vrátit informaci o neúspěchu, ale nevyhazovat vyjímku, ani neposunovat kurzor. Důvodem je, že UDP je nad protokolem IP, který může začít fragmentovat datagramy. Proto se většina protokolů snaží držet velikost datagramů kolem 1200 bytů. Podobný přístup jsme adaptovali my. + +Dále musel umožňovat zakódovat hodnotu zpětně, jako například délku, kterou kvůli omezení bufferu víme až později. Potom, co přes rozhraní zapíšeme vše, co je potřeba, zavoláme metodu \inlcpp{finish}, která hodnoty pro délku přenastaví na správnou hodnotu. \subsubsection{Testování} -Při implementaci jsme zjistili, že je dobré začít testy, které definují jednotlivé vlastnosti, jako například: "Spojení začne komunikaci rámcem Hello", "Po rámci Hello odpoví spojení rámcem Hello a ACK", "Na pakety obsahující spolehlivé rámce odpoví spojení ACK rámcem" apod. V testu jsem pak tyto vlastnosti ověřil. Tomuto přístupu se říká test driven development. +Při implementaci jsme zjistili, že je dobré začít testy, které definují jednotlivé vlastnosti protokolu, jako například: "Spojení začne komunikaci rámcem Hello", "Po rámci Hello odpoví spojení rámcem Hello a ACK", "Na pakety obsahující spolehlivé rámce odpoví spojení ACK rámcem" apod. Tomuto přístupu se říká test driven development. Původně jsme začali implementací, ale bylo těžké domyslet, jak by se měl protokol implementovat. % Pro vývoj protokolu jsem si nejprve zkoušel zapsat specifikaci, následně udělat vývoj a nakonec otestovat. Tento přístup ale způsoboval časté chyby v návrhu protokolu. Daleko více se mi osvědčil tzv. Test Driven Development, kdy začneme tvorbou testů, které slouží v podstatě jako specifikace chování. Příkladem jsou testy: "Client begins with Hello datagram", "Connection reacts to Hello with ACK \& Hello" nebo "Both connections have correct IDs after Initial exchange". Tímto způsobem jsem definoval jak chci, aby se protokol a komponenty v něm chovali. % Popsal jsem problémy, které jsem potřeboval vyřešit. Představím protokol, který je pro mě řeší. Vytvořil jsem třídu `QuicrConnection`, která bude reprezentovat stavový stroj připojení a zároveň umožní číst a zapisovat. Rozhodl jsem se, že zapisovat bude zprávy, nikoliv pouze proud bytů. Proto jsem použil tzv. message frame. Pokud něco popnu z QuicrConnection, je to vždy celá zpráva, která přišla. Stejný princip používá i ZeroMQ. Vytvořil jsem dvě třídy: QuicrConnection a QuicrConnectionListener. QuicrConnection obsahuje stavový stroj připojení a rozhraní pro příjímání a odesílání zpráv. QuicrConnectionListener obsahuje rozhraní pro poslouchání nově příchozích spojení. Nasluchač bude spravovat UDP socket. Když přijde nový datagram z adresy, kterou ještě nezná, a přišla zpráva Hello, tak si do seznamu přidá připojení ve stavu HelloReceived. Při datagramu z adresy, kterou zná, pošle tento datagram přímo do spojení na spracování. Každé spojení si bude udržovat svoji frontu příchozích zpráv. -Protokol měl za cíl snížit odezvu na nespolehlivé síti. Proto jsme vytvořili test, ve kterém máme klienta, který na server posílá datagram a měří, za jak dlouho dostane odpověď pro konkrétní snímek. Tato metrika se někdy nazývá RTT, neboli round-trip-time. Jak vidíme na obrázku, náš protokol je v případě ztráty paketů stabilnější. - -Pro nasimulování nespolehlivosti sítě jsme využili Linuxový nástroj \uv{tc}. Ten obsahuje network emulator, který umožňuje například nastavit, kolik procent paketů má zahodit, jaká má být odezva nebo jak moc se budou prohazovat pakety. Nástroj a jeho vlastnosti, které budeme využívat, si představíme. +\subsubsection{Měření} + +Protokol měl za cíl snížit odezvu na nespolehlivé síti a neblokovat zprávy. Vytvořili jsme test, který simuluje program hry. V testu jsou dvě vlákna, jedno pro klienta a druhé pro server. Oba mají svou vlastní smyčku, ve kterém iterují. Klient odesílá hodnotu derivace typu double. Server si udržuje stav hodnoty, nazvěme ji \uv{pozice}. Při obdržení derivace ji přičte k aktuálnímu stavu. Každý snímek server odesílá na klienta stav pozice, kterou si klient aplikuje. + +Pro nasimulování nespolehlivosti sítě jsme využili Linuxový nástroj \uv{tc}. Ten obsahuje \uv{network emulator}, který obsahuje různá nastavení spolehlivosti sítě. Například kolik procent paketů má ztratit, jaká má být odezva nebo jak moc náhodné bude pořadí paketů. Budeme simulovat odezvu 200 milisekund s rozptylem 20ms, ztrátu 3\% paketů a 1\% paketů bude duplikovaných. Celý příkaz pro nastavení můžeme vidět v příkladu . Vidíme, že používáme pouze rozhraní \inlcpp{lo}, tedy loopback, které se týká posílání mezi programy na lokální adrese. + +\begin{kicode}{cpp}{}{Příklad volání TC} + # tc qdisc add dev lo root netem \ + delay 200ms 20ms 25% \ + loss 3% \ + duplicate 1% \ + reorder 25% 50% +\end{kicode} + + +V prvním testu jsme pouze měřili odezvu mezi odesláním vstupu od klienta pro snímek $n$ a získáním jeho integrovaného stavu ze serveru. Na obrázku \ref{fig:latencycomparison} vidíme, že TCP obsahuje skoky a QUICr je stabilnější. \begin{figure} \begin{center} \includegraphics[width=0.8\textwidth]{graphics/latencycomparison.pdf} \end{center} + \caption{Porovnání odezvy TCP a QUICr} + \label{fig:latencycomparison} \end{figure} \begin{figure} \begin{center} - \includegraphics[width=1\textwidth]{graphics/integrationcomparison.pdf} + \includegraphics[width=0.8\textwidth]{graphics/integrationcomparison.pdf} \end{center} - \label{integrationcomparison} - \caption{Integrace} + \label{fig:integrationcomparison} + \caption{Porovnání integrace TCP a QUICr} \end{figure} -Následně jsme zkusili, jak se nespolehlivost sítě projeví pro integraci proměnné. Přidali na server hodnotu, kterou pomocí hodnot od klienta inkrementujeme. Pro derivaci jsme použili sinusoidu, abychom ji mohli zreplikovat snadno v TCP i QUICr. Na obrázku \ref{integrationcomparison} vidíme, že TCP při ztrátě paketů způsobuje skoky, které nemusí být pro hráče příjemné. Naopak náš protokol má daleko méně znatelné skoky. +Následně jsme zkusili, jak se nespolehlivost sítě a skoky odezvy z prvního měření projeví v integraci proměnné. Pro derivaci jsme použili sinusoidu, abychom ji mohli zreplikovat snadno v TCP i QUICr. Na obrázku \ref{fig:integrationcomparison} vidíme, že TCP při ztrátě paketů způsobuje skoky, které nemusí být pro hráče příjemné. Naopak náš protokol má integraci plynulejší. -Nakonec jsme integrovali protokol přímo do replikátoru. Na obrázku \ref{playerbenchmark} vidíme 301 hráčů, kde 300 je simulovaných, avšak individuálních připojení a jeden je náš hráč. Server se občas zasekl, ale zátěž zvládl. +Nakonec jsme integrovali protokol přímo do replikátoru. Vytvořili jsme simulovaného klienta, který na server posílá náhodné vstupy a způsobuje na serveru svůj pohyb. Těchto simulovaných klientů můžeme spouštět libovolný počet. Každý naváže se serverem spojení a komunikuje s ním klasicky přes replikátor a ovladač. Můžeme tak snadno měřit, jak se zatížení projeví v síti, a zároveň můžeme využít nástroje jako tc pro různé podmínky. Na obrázku \ref{fig:playerbenchmark} vidíme 301 hráčů, kde 300 je simulovaných individuálních připojení a jeden je náš hráč. Server počítal každý snímek dlouho, asi 250ms, ale zátěž zvládl. Dalším krokem bylo zvýšit počet snímku za sekundu pro stovky hráčů. \begin{figure} - \begin{center} + \centering \includegraphics[width=0.5\textwidth]{graphics/playerbenchmark.png} - \end{center} - \label{playerbenchmark} + \label{fig:playerbenchmark} \caption{301 připojených hráčů} \end{figure} -\subsubsection{Odesílání} -Nejprve představím, jak jsem navrhnul odesílání zpráv. Na obrázku vidíme, celou architekturu. Vidíme dvě velké komponenty, a to Network Sender a Player Session Registry. První komponenta je celá logika, která práci posílání zpráv organizuje. Vytahuje z fronty zprávy, které pomocí Message Serializeru převede na rámce. Reliability System je jednotka, která určuje, které rámce budou v dalším datagramu. Důvod je ten, aby se kontrolovali rámce, pro které nemáme ACK a prioritizovalo se jejich odeslání. Výstupem Reliability System je tedy přímo sestavený datagram. To kdo a jak sestavuje datagram z rámců je detail. + + + + +\subsection{Optimalizace replikátoru} + +Test s 301 hráči odhalil nedostatečný výkon serveru. Pomocí Tracy jsme začali program analyzovat. Na obrázku \ref{fig:tracyreplicator} vidíme, že pouze aktualizace replikátoru trvá každý snímek kolem 100ms. Pro představu, pokud bychom chtěli, aby server integroval 20 krát za sekundu, museli bychom všechno, nejen aktualizaci replikátoru, stihnout do 50 milisekund. Proto je aktuální stav nepřijatelně dlouhá doba. Úzké hrdlo najednou nebyla síť, ale příprava smysluplných dat, kterými síť zatížíme. Soustředili jsme další optimalizace právě na replikátor. + \begin{figure} - \begin{center} - \includegraphics[width=1\textwidth]{graphics/OutboundArchitecture} - \end{center} + \centering + \includegraphics[width=1\textwidth]{graphics/300playerstrace.png} + \label{fig:tracyreplicator} + \caption{Analýza replikátoru} \end{figure} -\subsubsection{Čtení} +Z analýzy vyšlo najevo, že problém je při skládání zpráv. Tedy kódování pozic entit, o které se klient zajímá, do objektu. Je to právě tento objekt, který se serializuje přes ProtoBuf a odesílá přes soket klientům. -Představím architekturu přijímání zpráv. Opět vidíme registr spojení. Když nám ze sítě přijde nový datagram, přepošleme ho do reliability systému. Ten z něj vytvoří rámce a pošle do Frame Routeru. Zodpovědnost Frame Routeru je třídit rámce podle toho, jestli se má serializovat na zprávu, nebo jestli je to tzv. ovládací rámec. Příklad ovládacích rámců je třeba HELLO, HELLO\_ACK, nebo CRYPTO. Handshake handler si poté drží stav handshaků a v případě, že některý dokončil, registruje v Player Session Registry novou session. +Replikátor pro každého klienta zjistil jeho zájem a pro každou entitu v něm vyhledával jeho komponenty. Vyhledávání je v případě Entt implementováno hashovací tabulkou a časová složitost je v $O(1)$. Začali jsme měřit i jiná řešení. Primárně nás zajímali metody, které jsou vhodné pro ECS architekturu. První řešení, které jsme zkusili, bylo vytvořit buffer instancí zpráv pro každého klienta najednou. Přes komponentu, kterou jsme chtěli replikovat, např. Transform, jsme vytvořili Entt pohled a iterovali. Pro každý prvek jsem komponentu zapsali do zprávy pro každého klienta, kterého zajímala. Výslednou analýzu vidíme na obrázku \ref{fig:ecs_optimization_tracy_01}. Tato optimalizace, která jen změnila pořadí, v jakém nahlížíme na data, snížila dobu, kterou trvá aktualizace replikátoru, na polovinu. -% #image("InboundArchitecture.png") +\begin{figure} + \centering + \includegraphics[width=1\textwidth]{graphics/ecs_optimization_tracy_01.png} + \label{fig:ecs_optimization_tracy_01} + \caption{Analýza optimalizace replikátoru pro ECS} +\end{figure} -\subsubsection{Šifrování} +\begin{figure} + \centering + \includegraphics[width=1\textwidth]{graphics/ecs_optimization_tracy_02.png} + \label{fig:ecs_optimization_tracy_02} + \caption{Analýza optimalizace replikátoru pro ECS} +\end{figure} -Jednotlivé datagramy a zprávy je třeba šifrovat a pro to je třeba, aby si dvě strany vyměnili tajný klíč. Představím metodu, kterou pro výměnu budu využívat. +Replikátor jsme začali analyzovat do větších detailů. Na obrázku \ref{fig:ecs_optimization_tracy_02} vidíme, které jeho části zabrali jakou dobu. Zjistili jsme, že problém byl samotný ProtoBuf. Formát je podobně jako JSON dělaný pro složité struktury objektů. V našem případě je ale zpráva pro snapshot světa primitivní. Rozhodli jsme udělat porovnání s FlatBuffers. V testu jsme simulovali 100 snímků, tak, abychom si mohli dopředu alokovat všechnu potřebnou paměť, kterou můžeme mezi snímky využívat. Dopředu si vytvoříme vektor pozic, které v testu budeme serializovat. Stejně jako v replikátoru používáme architekturu orientovanou na ECS a procházíme všechny pozice, ty pak umisťujeme do alokovaných bloků paměti pro každého klienta a simulujeme tak skládání rámců, které můžeme odesílat. Všimli jsme si, že v případě primitivní zprávy, jako je snapshot stavu světa, by nám stačila klasická funkce ze standartní C knihovny zvaná \inlcpp{memcpy} a do testu jsme ji zařadili. Výsledky vidíme v tabulce \ref{table:serialization_comparison}. -\subsubsection{SPR-6} +\begin{figure} +\begin{center} +\begin{tabular}{ | m{5em} | m{3cm}| m{3cm} | m{3cm} | } + \hline + & ProtoBuf & FlatBuffers & Memcpy \\ + \hline + Čas (s) & 9.455691762 & 10.345692894 & 0.754350866 \\ + \hline +\end{tabular} +\label{table:serialization_comparison} +\caption{Porovnání serializátorů} +\end{center} +\end{figure} -Metodu, kterou jsem viděl například u síťového protokolu pro hru World Of Warcraft je SRP-6. Jedná se o protokol, který nevyžaduje, aby server znal heslo klienta, ale měl u sebe pouze validátor, a klient mu díky němu dokáže, že heslo zná. Pro tento přístup je třeba udělat handshake. +Zjistili jsme, že problémem byl ProtoBuf a FlatBuffers by nám nepomohl. Nepřekvapilo nás, že memcpy byl nejrychlejší. Rozhodli jsme se, že pro serializaci a deserializaci snapshotů světa budeme používat vlastní serializaci. + +Pro kódování jsme využili už existující \inlcpp{ByteBuffer}, který umožňuje snadné kódování po bytech do vektoru. Třída \inlcpp{WorldStateWriter} obsahuje konkrétní kódování pro tyto zprávy a přes konstruktor je nutné předat instanci \inlcpp{ByteBuffer}. + +Zpráva obsahuje hlavičku, ve které je počet aktualizovaných entit a počet nových entit. Počet odebraných entit můžeme vynechat, ten jsme schopni zjistit z délky zprávy a zbylých počtů. Pro čtení slouží \inlcpp{WorldStateReader}. -\subsubsection{Lockstep} -Aby tato technika fungovala správně, musí být intergrace ve fyzickém enginu stejné na klientovi a serveru. +\subsection{Optimalizace manažera zájmů} + +Všimli jsme si, že replikátor trval každou iteraci kolem 60 milisekund. Nejprve jsme se rozhodli přidat datové struktury. Druhým cílem bylo zlepšit API, kterým se replikátor dotazuje, jestli je entita pro klienta zajímavá. + +Jedna s datových struktur, která má nízkou složitost pro dotaz na seznam entit ve vzdálenosti maximálně, je klasická mřížka. Charakteristika hráčů ve hrách je, že se hodně pohybují. Mřížka nepotřebuje žádný přepočet, ale pouze vložit do předem alokovaného bufferu, nebo z něj naopak odebrat. + +Testovali jsme 4 implementace, z toho 3 různé datové struktury a naivní přístup. Simulovali jsme pohyb 100 000 různých entit po dobu 100 snímků. Všechny možnosti představíme. Naivní přístup využívá pouze Pythagorovu větu, aby získal vzdálenost dvou bodů. Jediná optimalizace je vynechat odmocninu a umocnit místo toho vzdálenost. Druhá a třetí implementace využívá mřížku a entity rozděluje do svých polí. První je fixní mřížka, která je vhodná pro světy, které nemění svou velikost, jako např. World of Warcraft. Naopak hashovací mřížka přiřazuje entity do polí pomocí hashe jejich pozice. Jsou tak ideální pro dynamické a potenciálně nekonečné světy, jako např. Minecraft. Poslední je quad tree. Jedná se o obdobu binárního stromu rozšířenou o rozměr. V tabulce \ref{table:range_query_comparison} vidíme výsledky testu. Celkový čas je milisekundách. Ve třetím a čvrtém sloupci je změřená část vkládání a dotazování. Díky tomu vidíme, že Quad tree má rychlejší dotazování, ale delší vkládání. Nejrychlejší je fixní mřížka. Má ale vysokou paměťovou náročnost a při použití je tak nutné zvážit, jestli není hashovací mřížka vhodnější. Quad tree implementace se ukázala jako nevhodná. S přibývající hloubkou je navíc pomalejší. Ideální se ukázali varianty s fixní a hashovací mřížkou. + +\begin{figure} +\begin{center} +\begin{tabular}{ | m{5em} | m{3cm} | m{3cm} | m{3cm} | } + \hline + Název testu & Celkový čas & Čas vkládání & Čas dotazování \\ + \hline + Naivní & 38770 & 0 & 38650 (99.96\%) \\ + \hline + Fixní mřížka & 467 & 301 (64.56\%) & 17 (3.74\%) \\ + \hline + Hashovací mřížka & 1070 & 736.63 (68.76\%) & 42 (3.93\%) \\ + \hline + Quad tree & 1830 & 1560 (85.45\%) & 30.29 (1.66\%) \\ + \hline +\end{tabular} +\label{table:range_query_comparison} +\caption{Porovnání algoritmů} +\end{center} +\end{figure} + + + +% \subsection{Optimalizace QUICr} + + + +% \subsubsection{Šifrování} + +% Jednotlivé datagramy a zprávy je třeba šifrovat a pro to je třeba, aby si dvě strany vyměnili tajný klíč. Představím metodu, kterou pro výměnu budu využívat. + +% \subsubsection{SPR-6} + +% Metodu, kterou jsem viděl například u síťového protokolu pro hru World Of Warcraft je SRP-6. Jedná se o protokol, který nevyžaduje, aby server znal heslo klienta, ale měl u sebe pouze validátor, a klient mu díky němu dokáže, že heslo zná. Pro tento přístup je třeba udělat handshake. + \subsubsection{Congestion control} \subsubsection{Bandwidth control} -Entity, které jsou od hráče daleko, není třeba aktualizovat tak často jako ty, které jsou k němu blízko. Proto jsem do zájmu ke každé entitě přidal důležitost. Replikátor se při odesílání snaží nejprve nacpat do packetu entity s vyšší prioritou. Aby nedošlo k vyhladovění, tak odeslané entitě trochu klesne důležitost. Tuto informaci už si řeší replikátor. +Entity, které jsou od hráče daleko, není třeba aktualizovat tak často jako ty, které jsou k němu blízko. Již jsme nastínili, že můžeme můžeme spočítat důležitost jednotlivých entit pro klienta a omezit tak počet entit, které musí replikátor synchronizovat. Například můžeme vzdálenější entity synchronizovat méně často. Důležité je, aby se i ty dostali někdy na řadu. \subsection{Sharding} -Proces, při kterém hráče rozdělíme do skupin, které se navzájem nevidí, i když jsou na stejném serveru blízko sebe, se říká sharding. Podobný princip funguje i v databázích. Tato technika složitá udělat správně. Vývojář musí dobře definovat logiku toho, že dva hráči mohou skončit na jiném shardu. +Proces, při kterém hráče rozdělíme do skupin, které se navzájem nevidí, i když jsou na stejném serveru blízko sebe, se říká sharding. Podobný princip funguje i v databázích. + +\subsection{Horizontální škálování} + +Další z metod podobná shardování, je \uv{horizontální škálování}, kdy do systému přidáváme servery, které si tak rovnoměrně rozdělí práci. V případě naší hry jsme rozdělili herní svět na zóny a o každou se stará jiný server. Takový server je \uv{zone server} a dohromady tvoří \uv{zone cluster}. Do systému jsme dále přidali \uv{cluster koordinátora}, který říká, který zone server má jakou zónu. Model mezi koordinátorem a zone serverem je klient-server. Na druhou stranu zone servery mezi sebou komunikují přímo a využívají model peer-to-peer. + +Představíme, jak spolu zone servery komunikují. Využijeme k tomu už existující komponenty: replikátor a manažera zájmu. Nejprve jsme stav hry, manažera zájmu a fyzický svět do třídy \inlcpp{ZoneManager}. Tuto třídu obalíme \inlcpp{ZoneServer} třídou. Ta bude obsahovat replikátor a \inlcpp{ZoneCoordinatorClient}. Manažer zón si bude udržovat registr sousedních zón a bude se k ním chovat jako klasickým klientům. Rozdíl bude ten, že klient má jako zájem definovaný pouze bod a manažer zájmu klientovi přiřadí do zájmu entity, které jsou od bodu v dostatečné vzdálenosti. Sousedi budou mít jako zájem definovanou celou jejich plochu. Manažer zájmu má nyní na rozhraní dvě metody: \inlcpp{register\_client\_interest(interest\_id, entity)} a \inlcpp{register\_zone\_interest(interest\_id, area)}. Každý zájem je definovaný unikátním ID. O to, jaké entity pak konkrétní zájem zajímají získáme voláním \inlcpp{get_interest(interest_id)}. + +Replikátor poté replikuje sousedům ty entity, které jsou od plochy souseda v dostatečné blízkosti. Pokud klient překročí do jiné zóny, měl by manažer zóny předat klienta druhé zóně. Toto modelujeme přes \inlcpp{ZoneProxy}, která reprezentuje souseda pro manažera konkrétní zóny. Implementace obsahuje \inlcpp{ZoneClusterLink}, která obsahuje QUICr endpoint, na který ostatní zóny mohou posílat cluster data. + +Systémovou architekturu vidíme na obrázku \ref{fig:zone_cluster_architecture}. Vidíme, že \inlcpp{ZoneClusterLink} slouží pro komunikaci mezi servery v clusteru a zároveň pro replikaci entit, které jsou blízko hranic se sousední zónou. Když se nový server spustí, nejprve se registruje koordinátorovi. Ten mu přiřadí ID, plochu a seznam jeho sousedů včetně \inlcpp{ZoneClusterLink} adres. S každým sousedem přes QUICr naváže spojení a představí se pomocí zprávy \inlcpp{ZoneHello}. Tím si ho druhý server přidá do registru a může na něj začít přenášet klienty. + +\begin{figure} + \centering + \includegraphics[width=1\textwidth]{graphics/zone_server_architecture.pdf} + \label{fig:zone_cluster_architecture} + \caption{Architektura systému s zone clusterem} +\end{figure} + \subsection{Komprese} -Poslední optimalizací, kterou jsem pro přenos informací použili, byla komprese. Nejprve jsme nahradili byte buffer, který pracuje pouze s byty, bit bufferem, který nám umožnil pracovat s jednotlivými bity. +Poslední optimalizací, kterou jsem pro přenos informací použili, byla komprese. Nejprve jsme nahradili byte buffer, který pracuje pouze s byty, bit bufferem, který nám umožnil pracovat s jednotlivými bity. \subsubsection{Bit Buffer} -Snadným zmenšením packetů je zaměřit se na bity namísto bytů. Původně jsem nově příchozí datagramy obalil pomocí ByteBuffer, který umožnil dekódovat postupně příchozí byty. Často ale potřebujeme mít možnost zakódovat informaci pomocí jednotlivých bitů. - -\subsubsection{Komprese QUICr} - -Protokol QUICr kóduje pakety a rámce. Toto kódování jsme se rozhodli zkompresovat. - -\subsubsection{Komprese protokolu replikátoru} - -Komprese, která lze provést na úrovni QUICr protokolu, je značně omezená. Komprese lze ale provést i na samotných aplikačních zprávách. Pro +Snadným zmenšením paketů je zaměřit se na bity namísto bytů. Původně jsem nově příchozí datagramy obalil pomocí ByteBuffer, který umožnil dekódovat postupně příchozí byty. Často ale potřebujeme mít možnost zakódovat informaci pomocí jednotlivých bitů. - -% \noindent\textcolor{red}{\LARGE Upozornění: Následující text -% dokumentace stylu, vyjma přílohy~\ref{sec:ObsahData}, je rozpracovaná -% a (značně) neúplná verze!!!} - -\section{Styly pro psaní bakalářských a diplomových prací} -Toto jsou styly pro psaní bakalářských a diplomových prací přes typografický systém \LaTeX{}, tedy \textbf{kistyles}. - -\subsection{Požadavky a podprovaná prostředí} -Sada balíku \textbf{kistyles} podporuje následující distribuce systému \LaTeX{}: -\begin{itemize} -\item \TeX{} Live. -\end{itemize} - -Jsou podporovány všechny výstupní ovladače, tedy jak \textbf{dvi}, tak \textbf{pdf} i \textbf{ps}. Funkčnost zmiňovaných distribucí byla ověřena na několika operačních systémech, mezi které patří: -\begin{enumerate} -\item Windows $8.1$, -\item Archlinux, -\item Debian GNU/Linux. -\end{enumerate} - -Důrazně se doporučuje používat aktuální verzi dané distribuce systému \LaTeX{}. - -%%% Po přeložení programem CSLaTeX (třikrát) je potřeba použít -%%% program DVIPS a takto získaný PostScriptový soubor vytisknout -%%% na PostScriptové tiskárně nebo pomocí programu GhostScript. -%%% -%%% Rovněž je možné použít program DVIPDFM a vytvořit z dokumentu -%%% soubor ve formátu PDF včetně hypertextových odkazů. - -\subsection{Přepínače} -Styl kidiplom je z hlediska uživatele zastoupen ekvivalentně nazvanou třídou, kterou je třeba volat na záčátku dokumentu: -\begin{kicode}{TeX}{}{Volání třídy \textbf{kidiplom}} -\documentclass[ - master, - program=ainfvs, - printversion, - biblatex, - language=english, - font=sans, - figures=false, - tables=false, - theorems, - sourcecodes, - joinlists, - glossaries, - index, - encoding=utf8, - bibencoding=utf8 -]{kidiplom} -\end{kicode} - -Následuje přehled přepínačů, je vždy uvedeno jméno přepínač, včetně výchozí hodnoty. Přepínače uvádí tabulka \ref{tab:prepinace}. - -%\begin{table} -\begin{center} -\begin{longtable}{>{\bfseries}l >{\ttfamily}c L{8cm}} -\caption{Seznam přepínačů}\label{tab:prepinace}\\ - {\normalfont Přepínač} & {\normalfont Výchozí hodnota} & {\normalfont Popis} \\ -\hline -master & false & Povolí nebo zakáže režim diplomové práce. Výchozí režim je tedy bakalářská práce. \\ - -printversion & false & Je-li zapnuto, pak budou odkazy vysázeny optimalizovaně pro knižní sazbu. Tuto volbu je nutno použít pro tisk práce. \\ - -biblatex & false & Zapne sazbu bibliografie přes balík \BibLaTeX{}. \\ - -language & czech & Jazyk textu práce. Možné hodnoty jsou \textbf{czech}, -\textbf{english} a \textbf{slovak}. \\ - -font & serif & Zapne či vypne podporu pěkného bezpatkového fontu. Možné hodnoty jsou:\newline -\begin{description}\setlength{\itemsep}{-1ex} -\item[serif] Patkové písmo (Computer Modern). -\item[sans] Bezpatkové písmo (Iwona). -\end{description} \\[-3ex] - -figures & true & Je-li zapnuto, pak v seznamech položek bude zahrnut seznam obrázků. \\ - -tables & true & Je-li zapnuto, pak v seznamech položek bude zahrnut seznam tabulek. \\ - -theorems & false & Je-li zapnuto, pak v seznamech bude zahrnut seznam teorémů. \\ - -sourcecodes & false & Je-li zapnuto, pak v seznamech bude zahrnut seznam zdrojových kódů. \\ - -%%% Argument `joinlists' způsobí zřetězení seznamů obrázků, tabulek, -%%% vět a zdrojových kódů. Není-li použít, všechny seznamy jsou -%%% uvedeny na samostatných stránkách. - -joinlists & true & Je-li zapnuto, pak seznamy obrázků, tabulek, vět a -zdrojových kódů sázené za obsahem nebudou rozděleny na samostatné stránky. \\ - -glossaries & false & Je-li zapnuto, pak na konci dokumentu bude vysázen seznam zkratek. \\ - -index & false & Zapíná podporu sazby rejstříku. \\ - -%% 'encoding=kódování' pro kódování tohoto a vložených zdrojových -%% textů v kódování jiném než výchozím utf8 -encoding & utf8 & Kódování souboru dokumentu, doporučuje se ponechat výchozí hodnotu. \\ - -bibencoding & utf8 & Kódování souboru bibliografie. Tato volba má -smysl pouze, pokud je použita bibliografie skrze balíček \BibLaTeX{}. \\ - -program & \vtop{\hbox{\strut infpvs}\hbox{\strut ainfvs}} & Specifikuje studijní program/obor (specializaci):\newline -\begin{description} -\item[infoi] Informatika (Obecná informatika)\,--\,bakalářský i navazující magisterský, -\item[infpvs] Informatika (Programování a vývoj software)\,--\,bakalářský, -\item[itp] Informační technologie\,--\,bakalářský, prezenční forma, -\item[itk] Informační technologie\,--\,bakalářský, kombinovaná forma, -\item[infui] Informatika (Umělá inteligence)\,--\,navazující magisterský, -\item[ainfvs] Aplikovaná informatika (Vývoj software)\,--\,navazující magisterský, -\item[ainfpst] Aplikovaná informatika (Počítačové systémy a technologie)\,--\,navazující magisterský, -\item[infv] Informatika pro vzdělávání\,--\,bakalářský, -\item[uinf] Učitelství informatiky pro střední školy\,--\,navazující magisterský, -\item[binf] Bioinformatika\,--\,bakalářský i navazující magisterský, -\item[inf] Informatika (bez specializací)\,--\,bakalářský i navazující magisterský, -\item[ainfp] Aplikovaná informatika (bez specializací)\,--\,bakalářský, prezenční forma, -\item[ainfk] Aplikovaná informatika (bez specializací)\,--\,bakalářský, kombinovaná forma, -\item[ainf] Aplikovaná informatika (bez specializací)\,--\,navazující magisterský. -\end{description} -\end{longtable} -\end{center} -%\end{table} - -\subsection{Geometrie stránky} -Tento styl používá list velikosti $A4$. Pro sazbu prací je třeba použít jednostrannou sazbu. Levý okraj je rozšířen s ohledem na vazbu výsledné knižní podoby práce. - -\section{Sazba částí dokumentu} -\subsection{Sazba úvodní strany či obsahu} -Vysázení všech podstatných částí úvodu práce obstará makro \kiinlinecode{TeX}{!}{\\maketitle}. Pro správné vysázení všech částí a meta-informací je potřeba použí makra \kiinlinecode{TeX}{!}{\\title}, \mbox{\kiinlinecode{TeX}{!}{\\author}} a další. Jejich přehled lze najít ve zdrojovém souboru tohoto dokumentu. V případě použítí \textbf{pdf} výstupu se generuje i dodatečná hlavička souboru s meta-informacemi jako je autor dokumentu, název práce či dalšími. - \subsection{Závěry} Závěr práce by se měl poskytnout jak v původním jazyce práce, tak v jazyce anglickém. Pro sazbu závěru jsou k dispozici příslušná makra. Berte na vědomí, že v anglickém závěru se aktivuje plně anglická sazba se všemi konvencemi. Tedy je třeba používat anglické uvozovky a další správné typografické prvky. @@ -966,151 +1180,6 @@ Thesis conclusions written in \uv{English}. \end{kiconclusions} \end{kicode} -\subsection{Matematika} -Pro sazbu matematiky je k dispozici sada standardních maker. -$$\langle f \rangle, \lfloor g \rfloor, -\lceil h \rceil, \ulcorner i \urcorner$$ - -$$\left\{\frac{x^2}{y^3}\right\}$$ - -$$ -A_{m,n} = - \begin{pmatrix} - a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ - a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ - \vdots & \vdots & \ddots & \vdots \\ - a_{m,1} & a_{m,2} & \cdots & a_{m,n} - \end{pmatrix} -$$ - -$$ -M = \begin{bmatrix} - \frac{5}{6} & \frac{1}{6} & 0 \\[0.3em] - \frac{5}{6} & 0 & \frac{1}{6} \\[0.3em] - 0 & \frac{5}{6} & \frac{1}{6} - \end{bmatrix} -$$ - -\subsection{Sazba literatury} -Pro sazbu literatury má uživatel dvě možnosti. Může použít služeb balíků \BibLaTeX{}, který je pro \textbf{kistyles} zapnutý, či lze použít manuální sazbu bibliografie. -\subsubsection{Sazba bibliografie přes \BibLaTeX{}} -Při použití tohoto balíku se data o použité literatuře ukládají do dedikovaného textového souboru, ukázku najdete i v tomto stylu pod jménem \kiinlinecode{text}{!}{bibliografie.bib}. - -Formát daného souboru je nad rámec této dokumentace a je na každém uživateli, aby si jej nastudoval. Bibliografie se tiskne makrem \kiinlinecode{TeX}{!}{\\printbibliography}. Taktéž v preambuli dokumentu je třeba definovat, který soubor data bibliografie obsahuje, tedy například \kiinlinecode{TeX}{!}{\\bibliography\{bibliografie.bib\}}. - -Dokument, který využívá \BibLaTeX{} je následně nutné přeložit jak pomocí překladače zvoleného ovladače, tak pomocí aplikace \kiinlinecode{text}{!}{biber}. Více informací poskytne soubor \kiinlinecode{text}{!}{Makefile} z distribuce tohoto stylu. - -Výhodou tohoto přístupu je, že bibliografie se vysází automaticky a (obvykle) není třeba manuální úprava formátování. - -\subsubsection{Manuální sazba bibliografie} -Manuální sazba obnáší vysázení prostředí \kiinlinecode{text}{!}{thebibliography} ručně. To je nad rámec tohoto dokumentu. Ukázku tohoto přístupu lze samozřejmě nalézt ve zdrojovém souboru tohoto dokumentu nebo také \href{http://www.math.uiuc.edu/~hildebr/tex/bibliographies.html}{zde}. - -Pro aktivaci manuální sazby bibliografie je třeba volat třídu \kiinlinecode{text}{!}{kidiplom} s parametrem \kiinlinecode{text}{!}{biblatex=false}. Mějte, prosím, na paměti, že v tomto módu jsou makra \kiinlinecode{text}{!}{\\bibliography} a \kiinlinecode{text}{!}{\\printbibliography} nedostupná. - -\subsection{Drobná makra} -Základní styl definuje hned několik maker pro usnadnění práce. Například makro \kiinlinecode{TeX}{!}{\\buno} vysází řetezec \uv{bez újmy na obecnosti}. Je k dispozici i verze s prvním velkým písmenem, \kiinlinecode{TeX}{!}{\\Buno}. - -Je rovněž možno přidávat položky do seznamu zkratek. K tomu slouží makro \mbox{\kiinlinecode{TeX}{!}{\\newacronym}}, které lze použít například jednoduše jako \kiinlinecode{TeX}{!}{\\newacronym\{UPOL\}\{UPOL\}\{\\kitextunivcz\}}. Na danou zkratku se pak lze odkazovat jednoduše, \mbox{\kiinlinecode{TeX}{!}{\\gls\{UPOL\}}}. - -Sazba uvozovek respektuje nastavení částí dokumentu, a proto se doporučuje používat makro \kiinlinecode{TeX}{!}{\\uv}. V anglické závěru práce toto platí taky, viz tato PDF ukázka. - -Styl podporuje sazbu odstavců v tabulkách, více obsahuje tabulka \ref{tab:odstavce}. - -\begin{table} -\begin{center} -\caption{Odstavce v tabulkách}\label{tab:odstavce} -\begin{tabular}{L{4cm}|R{4cm}|L{4cm}} -\lipsum[23] & \lipsum[22] & \lipsum[21] -\end{tabular} -\end{center} -\end{table} - -K dispozici jsou také makra pro sazbu \csharp{} (\kiinlinecode{TeX}{!}{\\csharp}) či \cpp{} (\kiinlinecode{TeX}{!}{\\cpp}). - -%% v případě tvorby rejstříku přeložit vygenerovaný soubor .idx -%% programem Makeindex a v případě tvorby seznamu zkratek spustit -%% program Makeglossaries s parametrem jméno souboru zdrojového textu -%% bez přípony a následně opět (dvakrát) přeložit zdrojový text -%% programem pdfLaTeX. - -\subsection{Sazba rejstříku} -Sazba rejstříku sestává z několika kroků: - -\begin{enumerate} -\item Je třeba přes volbu \kiinlinecode{TeX}{!}{index=true} rejstříkování povolit. -\item Použítím makra \kiinlinecode{TeX}{!}{\\index} rejstříkovat vybrané pojmy. -\item Kompilovat s použitím utility \kiinlinecode{TeX}{!}{makeindex}. Pro specifika tohoto kroku si stačí prohlédnout soubor \kiinlinecode{text}{!}{Makefile}. -\end{enumerate} - -Makro \kiinlinecode{TeX}{!}{\\index} je redefinováno tak, že sází klikací odkaz na výraz v rejstříku. Je doporučeno jej použít ihned za výrazem\index{výraz}. - -\textbf{Omezení redefinovaného makra \kiinlinecode{TeX}{!}{\\index}}: klikací odkaz nefunguje, pokud použijete konstrukci \kiinlinecode{TeX}{!}{\\index\{výraz|makro\}} (resp. \kiinlinecode{TeX}{!}{\\index\{výraz|(makro\}}), např. \kiinlinecode{TeX}{!}{\\index\{výraz|textit\}}. - -Rejstřík lze vysázet pomocí makra \kiinlinecode{TeX}{!}{\\printindex}. - -\subsection{Sazba zdrojových kódů} -Styl nabízí dva způsoby sazby zdrojových kódů: - -\begin{enumerate} -\item Sazbu řádkových kódů, například \kiinlinecode{CSS}{!}{background-color: white;}. K tomu slouží makro formátu \kiinlinecode{TeX}{!}{\\kiinlinecode\{jazyk\}\{separátor\}\{kód\}}. Za separátor je vhodné volit jakýkoliv znak, který se nevyskytuje v samotném sázeném zdrojovém kódu. Za jazyk je nutno dosadit jeden z těchto: C, TeX, PHP, HTML, Lisp, SQL, TeX, Python, Java, TutorialD, text, csharp, cpp, JavaScript, CSS. - -\item Sazbu zdrojových kódu do separátních prostředí. Takto vytištěný kód se objeví v seznamu zdrojových kódů. Ukázka například zdrojový kód \ref{kod:cpp}. Ukázku sazby naleznete ve zdrojovém kódu tohoto dokumentu. -\end{enumerate} - -\newacronym{UPOL}{UPOL}{\kitextunivcz} - -\begin{definition}[Název definice] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. \gls{UPOL} -\end{definition} - -\begin{proof}[Název důkazu] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{proof} - -\begin{remark}[Pumpovací věta] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{remark} - -\begin{example}[Pumpovací věta] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{example} - -\begin{lemma}[Název definice] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{lemma} - -\begin{consequence}[Název důkazu] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{consequence} - -\begin{theorem}[Pumpovací věta] -Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. Abcd. -\end{theorem} - - -\begin{kicode}{cpp}{kod:cpp}{\cpp} -int main("cs acsa") // komentar -int main("cs acsa") // komentar -int main("cs acsa") // komentar -int main("cs acsa") // komentar -int main("cs acsa") // komentar -\end{kicode} - -\begin{kicode}{JavaScript}{}{JS} -new object() // komentar -\end{kicode} - -\begin{kicode}{csharp}{}{\csharp} -public static int main("cs acsa") // komentar -\end{kicode} - -\begin{kicode}{SQL}{}{SQL} -SELECT * FROM table_1; /* komentar */ -\end{kicode} - -\begin{kicode}{TutorialD}{}{TutorialD} -table_1 AND table_2; -\end{kicode} %% Závěry práce. V jazyce práce a anglicky. Text pro jiný než %% nastavený jazyk práce (nepovinným parametrem language makra @@ -1220,7 +1289,7 @@ nebo souboru \texttt{README.*}. % %\bibitem{jeske13} \uppercase{Jeske}, David; \uppercase{Novák}, Josef. Simple HTTP Server in \csharp: Threaded synchronous HTTP Server abstract class, to respond to HTTP requests. CodeProject: For those who code [online]. 2014-05-24. [cit. 2014-12-06]. Dostupné z: \url{http://www.codeproject.com/Articles/137979/Simple-HTTP-Server-in-C} % -%\bibitem{uzis2012} \uppercase{ÚSTAV ZDRAVOTNICKÝCH INFORMACÍ A STATISTIKY ČR}. Lékaři, zubní lékaři a farmaceuti 2012 [online]. Praha 2, Palackého náměstí 4: Ústav zdravotnických informací a statistiky ČR, 2012 [cit. 2014-12-06]. ISBN 978-80-7472-089-5. Dostupné z: \url{http://www.uzis.cz/publikace/lekari-zubni-lekari-farmaceuti-2012} +%\bibitem{uzis2012} \uppercase{ÚSTAV ZDRAVOTNICKÝCH INFORMACÍ A STATISTIKY ČR}. Lékaři, zubní lékaři a farmaceuti 2012 [online]. Praha 2, Palackého náměstí 4: Ústav zdravotnických informací a statistiky ČR, 2012 [cit. 2014-12-06]. ISBN 978-80-7472-089-5. Dostupné z: \url{http://www.uzis.crypublikace/lekari-zubni-lekari-farmaceuti-2012} % \end{thebibliography} %% Sazba volitelného rejstříku, za bibliografií. diff --git a/kidiplom.toc b/kidiplom.toc index ab131f1..3a9836a 100644 --- a/kidiplom.toc +++ b/kidiplom.toc @@ -1,96 +1,82 @@ \babel@toc {czech}{}\relax -\contentsline {section}{\numberline {1}Úvod}{9}{section.1}% -\contentsline {section}{\numberline {2}Distribuované systémy}{10}{section.2}% -\contentsline {subsection}{\numberline {2.1}Komunikace v síti}{10}{subsection.2.1}% -\contentsline {subsection}{\numberline {2.2}TCP/IP}{11}{subsection.2.2}% -\contentsline {subsection}{\numberline {2.3}Architektury}{12}{subsection.2.3}% -\contentsline {subsubsection}{\numberline {2.3.1}Klient-Server}{12}{subsubsection.2.3.1}% -\contentsline {subsubsection}{\numberline {2.3.2}Peer-to-Peer}{12}{subsubsection.2.3.2}% -\contentsline {subsection}{\numberline {2.4}Rodina protokolů TCP/IP}{12}{subsection.2.4}% -\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{13}{subsection.2.5}% -\contentsline {subsubsection}{\numberline {2.5.1}Sockety}{13}{subsubsection.2.5.1}% -\contentsline {subsubsection}{\numberline {2.5.2}TCP}{13}{subsubsection.2.5.2}% -\contentsline {subsubsection}{\numberline {2.5.3}Spolehlivost}{14}{subsubsection.2.5.3}% -\contentsline {subsubsection}{\numberline {2.5.4}UDP}{14}{subsubsection.2.5.4}% -\contentsline {subsubsection}{\numberline {2.5.5}QUIC}{15}{subsubsection.2.5.5}% -\contentsline {subsection}{\numberline {2.6}Protokoly v aplikační vrstvě}{16}{subsection.2.6}% -\contentsline {subsubsection}{\numberline {2.6.1}HTTP}{16}{subsubsection.2.6.1}% -\contentsline {subsubsection}{\numberline {2.6.2}HTTP/3}{16}{subsubsection.2.6.2}% -\contentsline {subsubsection}{\numberline {2.6.3}gRPC}{16}{subsubsection.2.6.3}% -\contentsline {subsubsection}{\numberline {2.6.4}Middleware}{17}{subsubsection.2.6.4}% -\contentsline {subsection}{\numberline {2.7}Posílání zpráv}{17}{subsection.2.7}% -\contentsline {subsubsection}{\numberline {2.7.1}Serializace}{17}{subsubsection.2.7.1}% -\contentsline {subsubsection}{\numberline {2.7.2}Kódování zpráv}{18}{subsubsection.2.7.2}% -\contentsline {subsubsection}{\numberline {2.7.3}Implementace}{19}{subsubsection.2.7.3}% -\contentsline {subsubsection}{\numberline {2.7.4}Detekce a náprava chyb}{19}{subsubsection.2.7.4}% -\contentsline {subsection}{\numberline {2.8}Asynchroní IO}{20}{subsection.2.8}% -\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{20}{subsubsection.2.8.1}% -\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{20}{subsubsection.2.8.2}% -\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{20}{subsubsection.2.8.3}% -\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{21}{subsubsection.2.8.4}% -\contentsline {subsubsection}{\numberline {2.8.5}Stack pointer}{21}{subsubsection.2.8.5}% -\contentsline {subsection}{\numberline {2.9}Metriky}{22}{subsection.2.9}% -\contentsline {subsubsection}{\numberline {2.9.1}TimescaleDB}{22}{subsubsection.2.9.1}% -\contentsline {subsubsection}{\numberline {2.9.2}Grafana}{22}{subsubsection.2.9.2}% -\contentsline {subsubsection}{\numberline {2.9.3}ImGui}{22}{subsubsection.2.9.3}% -\contentsline {subsubsection}{\numberline {2.9.4}Tracy}{22}{subsubsection.2.9.4}% -\contentsline {subsubsection}{\numberline {2.9.5}Konkrétní metriky}{23}{subsubsection.2.9.5}% -\contentsline {subsubsection}{\numberline {2.9.6}Sbírání v reálném čase}{23}{subsubsection.2.9.6}% -\contentsline {section}{\numberline {3}Hra pro více hráčů}{24}{section.3}% -\contentsline {subsection}{\numberline {3.1}Hry}{24}{subsection.3.1}% -\contentsline {subsubsection}{\numberline {3.1.1}Entt}{24}{subsubsection.3.1.1}% -\contentsline {subsection}{\numberline {3.2}Svět}{25}{subsection.3.2}% -\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{26}{subsubsection.3.2.1}% -\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{26}{subsubsection.3.2.2}% -\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{26}{subsection.3.3}% -\contentsline {subsection}{\numberline {3.4}Server}{27}{subsection.3.4}% -\contentsline {subsubsection}{\numberline {3.4.1}Registr spojení}{27}{subsubsection.3.4.1}% -\contentsline {subsubsection}{\numberline {3.4.2}Replikátor}{27}{subsubsection.3.4.2}% -\contentsline {subsubsection}{\numberline {3.4.3}Interest manager}{27}{subsubsection.3.4.3}% -\contentsline {subsection}{\numberline {3.5}Klient}{28}{subsection.3.5}% -\contentsline {subsubsection}{\numberline {3.5.1}Replicator controller}{28}{subsubsection.3.5.1}% -\contentsline {subsubsection}{\numberline {3.5.2}Interpolace}{28}{subsubsection.3.5.2}% -\contentsline {subsubsection}{\numberline {3.5.3}Rollback a simulace vlastního hráče}{28}{subsubsection.3.5.3}% -\contentsline {subsection}{\numberline {3.6}Komunikační protokol}{29}{subsection.3.6}% -\contentsline {subsection}{\numberline {3.7}Protokol QUICr}{29}{subsection.3.7}% -\contentsline {subsubsection}{\numberline {3.7.1}Frame}{30}{subsubsection.3.7.1}% -\contentsline {subsubsection}{\numberline {3.7.2}Handshake}{30}{subsubsection.3.7.2}% -\contentsline {subsubsection}{\numberline {3.7.3}Spolehlivost}{31}{subsubsection.3.7.3}% -\contentsline {subsubsection}{\numberline {3.7.4}Enkodér}{32}{subsubsection.3.7.4}% -\contentsline {subsubsection}{\numberline {3.7.5}Testování}{32}{subsubsection.3.7.5}% -\contentsline {subsubsection}{\numberline {3.7.6}Odesílání}{33}{subsubsection.3.7.6}% -\contentsline {subsubsection}{\numberline {3.7.7}Čtení}{35}{subsubsection.3.7.7}% -\contentsline {subsubsection}{\numberline {3.7.8}Šifrování}{35}{subsubsection.3.7.8}% -\contentsline {subsubsection}{\numberline {3.7.9}SPR-6}{35}{subsubsection.3.7.9}% -\contentsline {subsubsection}{\numberline {3.7.10}Lockstep}{35}{subsubsection.3.7.10}% -\contentsline {subsubsection}{\numberline {3.7.11}Congestion control}{35}{subsubsection.3.7.11}% -\contentsline {subsubsection}{\numberline {3.7.12}Bandwidth control}{35}{subsubsection.3.7.12}% -\contentsline {subsection}{\numberline {3.8}Sharding}{36}{subsection.3.8}% -\contentsline {subsection}{\numberline {3.9}Komprese}{36}{subsection.3.9}% -\contentsline {subsubsection}{\numberline {3.9.1}Bit Buffer}{36}{subsubsection.3.9.1}% -\contentsline {subsubsection}{\numberline {3.9.2}Komprese QUICr}{36}{subsubsection.3.9.2}% -\contentsline {subsubsection}{\numberline {3.9.3}Komprese protokolu replikátoru}{36}{subsubsection.3.9.3}% -\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{36}{section.4}% -\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{36}{subsection.4.1}% -\contentsline {subsection}{\numberline {4.2}Přepínače}{37}{subsection.4.2}% -\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{40}{subsection.4.3}% -\contentsline {section}{\numberline {5}Sazba částí dokumentu}{40}{section.5}% -\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{40}{subsection.5.1}% -\contentsline {subsection}{\numberline {5.2}Závěry}{40}{subsection.5.2}% -\contentsline {subsection}{\numberline {5.3}Matematika}{40}{subsection.5.3}% -\contentsline {subsection}{\numberline {5.4}Sazba literatury}{41}{subsection.5.4}% -\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{41}{subsubsection.5.4.1}% -\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{41}{subsubsection.5.4.2}% -\contentsline {subsection}{\numberline {5.5}Drobná makra}{41}{subsection.5.5}% -\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{42}{subsection.5.6}% -\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{42}{subsection.5.7}% -\contentsline {section}{Z\'av\v er}{46}{section*.3}% +\contentsline {section}{\numberline {1}Úvod}{8}{section.1}% +\contentsline {section}{\numberline {2}Distribuované systémy}{9}{section.2}% +\contentsline {subsection}{\numberline {2.1}Architektury}{9}{subsection.2.1}% +\contentsline {subsubsection}{\numberline {2.1.1}Softwarová architektura}{9}{subsubsection.2.1.1}% +\contentsline {subsubsection}{\numberline {2.1.2}Systémové architektury}{10}{subsubsection.2.1.2}% +\contentsline {subsection}{\numberline {2.2}Komunikace}{11}{subsection.2.2}% +\contentsline {subsubsection}{\numberline {2.2.1}Modely pro komunikaci}{11}{subsubsection.2.2.1}% +\contentsline {subsection}{\numberline {2.3}Počítačová Síť}{12}{subsection.2.3}% +\contentsline {subsection}{\numberline {2.4}Komunikace v síti}{13}{subsection.2.4}% +\contentsline {subsubsection}{\numberline {2.4.1}Rodina protokolů TCP/IP}{13}{subsubsection.2.4.1}% +\contentsline {subsection}{\numberline {2.5}Protokoly v aplikační vrstvě}{15}{subsection.2.5}% +\contentsline {subsubsection}{\numberline {2.5.1}HTTP}{15}{subsubsection.2.5.1}% +\contentsline {subsubsection}{\numberline {2.5.2}HTTP/3}{16}{subsubsection.2.5.2}% +\contentsline {subsection}{\numberline {2.6}Protokoly v transportní vrstvě}{16}{subsection.2.6}% +\contentsline {subsubsection}{\numberline {2.6.1}TCP}{17}{subsubsection.2.6.1}% +\contentsline {subsubsection}{\numberline {2.6.2}UDP}{18}{subsubsection.2.6.2}% +\contentsline {subsubsection}{\numberline {2.6.3}QUIC}{18}{subsubsection.2.6.3}% +\contentsline {subsection}{\numberline {2.7}Sokety}{20}{subsection.2.7}% +\contentsline {subsection}{\numberline {2.8}Asynchroní vstupně výstupní operace}{21}{subsection.2.8}% +\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{21}{subsubsection.2.8.1}% +\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{21}{subsubsection.2.8.2}% +\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{21}{subsubsection.2.8.3}% +\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{22}{subsubsection.2.8.4}% +\contentsline {section}{\numberline {3}Hra}{23}{section.3}% +\contentsline {subsection}{\numberline {3.1}Softwarová Architektura}{23}{subsection.3.1}% +\contentsline {subsubsection}{\numberline {3.1.1}Entity-Component-System}{24}{subsubsection.3.1.1}% +\contentsline {subsection}{\numberline {3.2}Engine}{24}{subsection.3.2}% +\contentsline {subsubsection}{\numberline {3.2.1}Fyzický engine}{24}{subsubsection.3.2.1}% +\contentsline {subsubsection}{\numberline {3.2.2}Vykreslování}{25}{subsubsection.3.2.2}% +\contentsline {subsubsection}{\numberline {3.2.3}Entt}{25}{subsubsection.3.2.3}% +\contentsline {subsubsection}{\numberline {3.2.4}Stav hry}{26}{subsubsection.3.2.4}% +\contentsline {subsection}{\numberline {3.3}Hra více hráčů}{26}{subsection.3.3}% +\contentsline {subsection}{\numberline {3.4}Klient-Server architektura}{27}{subsection.3.4}% +\contentsline {subsection}{\numberline {3.5}Server}{27}{subsection.3.5}% +\contentsline {subsubsection}{\numberline {3.5.1}Registr klientů}{27}{subsubsection.3.5.1}% +\contentsline {subsubsection}{\numberline {3.5.2}Server Replikátoru}{28}{subsubsection.3.5.2}% +\contentsline {subsubsection}{\numberline {3.5.3}Správa zájmů}{29}{subsubsection.3.5.3}% +\contentsline {subsection}{\numberline {3.6}Klient}{29}{subsection.3.6}% +\contentsline {subsubsection}{\numberline {3.6.1}Klient Replikátoru}{29}{subsubsection.3.6.1}% +\contentsline {subsubsection}{\numberline {3.6.2}Interpolace}{29}{subsubsection.3.6.2}% +\contentsline {subsubsection}{\numberline {3.6.3}Rollback}{29}{subsubsection.3.6.3}% +\contentsline {subsection}{\numberline {3.7}Posílání zpráv}{30}{subsection.3.7}% +\contentsline {subsubsection}{\numberline {3.7.1}Kódování zpráv}{30}{subsubsection.3.7.1}% +\contentsline {subsubsection}{\numberline {3.7.2}Implementace}{30}{subsubsection.3.7.2}% +\contentsline {subsubsection}{\numberline {3.7.3}Detekce a náprava chyb}{30}{subsubsection.3.7.3}% +\contentsline {subsection}{\numberline {3.8}Serializace}{31}{subsection.3.8}% +\contentsline {subsection}{\numberline {3.9}Metriky}{32}{subsection.3.9}% +\contentsline {subsubsection}{\numberline {3.9.1}PostgreSQL}{32}{subsubsection.3.9.1}% +\contentsline {subsubsection}{\numberline {3.9.2}TimescaleDB}{32}{subsubsection.3.9.2}% +\contentsline {subsubsection}{\numberline {3.9.3}Grafana}{33}{subsubsection.3.9.3}% +\contentsline {subsubsection}{\numberline {3.9.4}Orchestrace}{33}{subsubsection.3.9.4}% +\contentsline {subsubsection}{\numberline {3.9.5}ImGui}{33}{subsubsection.3.9.5}% +\contentsline {subsubsection}{\numberline {3.9.6}Tracy}{34}{subsubsection.3.9.6}% +\contentsline {subsubsection}{\numberline {3.9.7}Konkrétní metriky}{34}{subsubsection.3.9.7}% +\contentsline {subsubsection}{\numberline {3.9.8}Sbírání v reálném čase}{35}{subsubsection.3.9.8}% +\contentsline {subsection}{\numberline {3.10}Protokol QUICr}{35}{subsection.3.10}% +\contentsline {subsubsection}{\numberline {3.10.1}Rámec}{35}{subsubsection.3.10.1}% +\contentsline {subsubsection}{\numberline {3.10.2}Handshake}{36}{subsubsection.3.10.2}% +\contentsline {subsubsection}{\numberline {3.10.3}Spolehlivost}{36}{subsubsection.3.10.3}% +\contentsline {subsubsection}{\numberline {3.10.4}Enkodér}{38}{subsubsection.3.10.4}% +\contentsline {subsubsection}{\numberline {3.10.5}Testování}{38}{subsubsection.3.10.5}% +\contentsline {subsubsection}{\numberline {3.10.6}Měření}{39}{subsubsection.3.10.6}% +\contentsline {subsection}{\numberline {3.11}Optimalizace replikátoru}{41}{subsection.3.11}% +\contentsline {subsection}{\numberline {3.12}Optimalizace manažera zájmů}{43}{subsection.3.12}% +\contentsline {subsubsection}{\numberline {3.12.1}Congestion control}{44}{subsubsection.3.12.1}% +\contentsline {subsubsection}{\numberline {3.12.2}Bandwidth control}{44}{subsubsection.3.12.2}% +\contentsline {subsection}{\numberline {3.13}Sharding}{44}{subsection.3.13}% +\contentsline {subsection}{\numberline {3.14}Horizontální škálování}{44}{subsection.3.14}% +\contentsline {subsection}{\numberline {3.15}Komprese}{45}{subsection.3.15}% +\contentsline {subsubsection}{\numberline {3.15.1}Bit Buffer}{46}{subsubsection.3.15.1}% +\contentsline {subsection}{\numberline {3.16}Závěry}{46}{subsection.3.16}% +\contentsline {section}{Z\'av\v er}{47}{section*.3}% \babel@toc {czech}{}\relax \babel@toc {czech}{}\relax -\contentsline {section}{Conclusions}{47}{section*.5}% +\contentsline {section}{Conclusions}{48}{section*.5}% \babel@toc {english}{}\relax \babel@toc {czech}{}\relax -\contentsline {section}{\numberline {A}První příloha}{48}{appendix.A}% -\contentsline {section}{\numberline {B}Druhá příloha}{48}{appendix.B}% -\contentsline {section}{\numberline {C}Obsah elektronických dat}{48}{appendix.C}% -\contentsline {section}{Seznam zkratek}{50}{section*.7}% +\contentsline {section}{\numberline {A}První příloha}{49}{appendix.A}% +\contentsline {section}{\numberline {B}Druhá příloha}{49}{appendix.B}% +\contentsline {section}{\numberline {C}Obsah elektronických dat}{49}{appendix.C}% +\contentsline {section}{Seznam zkratek}{51}{section*.7}%