iccsa-16-factory

git clone https://git.igankevich.com/iccsa-16-factory.git
Log | Files | Refs

commit dad499d35183055650fb6dde858060368fd304ed
Author: Ivan Gankevich <igankevich@ya.ru>
Date:   Sun,  7 Aug 2016 16:08:50 +0300

Initial

Diffstat:
graphics/factory-3000.eps | 734+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
graphics/factory-6000.eps | 742+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
graphics/spec.eps | 735+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
llncs.cls | 1208++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main.tex | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
splncs03.bst | 1519+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/abstract.tex | 6++++++
src/intro.tex | 25+++++++++++++++++++++++++
src/outro.tex | 5+++++
src/refs.bib | 269+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/sections.tex | 154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
11 files changed, 5454 insertions(+), 0 deletions(-)

diff --git a/graphics/factory-3000.eps b/graphics/factory-3000.eps @@ -0,0 +1,734 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.2 (http://cairographics.org) +%%CreationDate: Fri Apr 8 12:08:14 2016 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 6 5 257 172 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font NimbusRomNo9L-Regu +%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.06 +%%Title: NimbusRomNo9L-Regu +%Version: 1.06 +%%CreationDate: Thu Aug 2 13:14:49 2007 +%%Creator: frob +%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design & +%Copyright: Development; Cyrillic glyphs added by Valek Filippov (C) +%Copyright: 2001-2005 +% Generated by FontForge 20070723 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/NimbusRomNo9L-Regu known{/NimbusRomNo9L-Regu findfont dup/UniqueID known pop false {dup +/UniqueID get 5020931 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /f-0-0 def +/FontBBox {-168 -281 1031 924 }readonly def + +/PaintType 0 def +/FontInfo 9 dict dup begin + /version (1.06) readonly def + /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001-2005) readonly def + /FullName (Nimbus Roman No9 L Regular) readonly def + /FamilyName (Nimbus Roman No9 L) readonly def + /Weight (Regular) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 32 /space put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 73 /I put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +readonly def +currentdict end +currentfile eexec +f983ef0097ece61cf3a79690d73bfb4b0027b850f3158905fdac1bc024d7276e0a12b7ddcede59 +e3601ab4509dfe0977ed5bf624ebc1f818c45f1350d41b052a72743accb053eb06ed043568d319 +6a30bed220227e2a15bacef508449221cf338a8666e92410a9aa91d5a31900a93c01ec21742cd1 +4dc46bffa111ce10b78ae01abaeba7f36cdf79a4733245c63f6d36234d6b0961f1ac295d617793 +1b9ed554bb5fc6741a63c493daabf03d753c7d2b8e8c01e3e280898f810da5985212c8c0bbdee4 +e8ab9b22bea83671c0460443ede9be044168f8ab53c69bc49ad71a0547df6f3447fc6ffd34e2d3 +9ed48de6bc2089b6b5552aa4085f6c1987df2caca5508fa11423e466bf458fecda5995f25f0324 +14e6f58c6c59ce2ffc8c211b06d42d5a7b8a72fa665c59275415182aa8381c14ac61c786471323 +36963a5eeed481f9b51f45d790f579fef6f6027eae46127239042d2b16b6d1361b86fa7dfd08bc +82c364a6d545c39c36dead5411eb689b2f50c96fd178f942869a35f0f6891ba5b60ea8635b461f +2046c2a875cd629a9ebd077d8e8fb197aa8af4470528a6f71daca21dec753c632d273cf515faa4 +de0ddf08d221ad58c716869dd0bebafbac5ac5ecd59d904d0e5945dffe802f30d4c3d18e64f593 +28924caf91832420f387cd6e5761c589c4280665c32eca518a60a0690bfda35df9911050e6cebc +d48090f6237ee6070fe0a47be80820fb3c0200e22ddd432fa006c0a4687afa406cf2aa0d45e77c +b2d5a436342baf07e35e65b72f2683cd2e1065b4b16cb42c4bd06c6d814975fc77063df25dab93 +459ceb04bfb4f66fd36d907428db57278b68a763f405b1156fcad7e27686b6c3908df3b3d83c76 +03ca5ebfaa2b9eabe8e6fb747b8ca1268d646f46dd5e6dc67435654dca97e30c71c4f463717063 +c5f1c6a85482f677271ee47383bb9cd3a11c7fbf5cf708c24fd1c879a2ffb67640865bc36d08e0 +898faf149794e9e4205bebcaaef0646103349eacaee5ceb5db05c87be2a4d6eb6a752b3bf41e00 +125f0f55bdd01e769c06bb93c67b95d3c02e25d76c78ed8c63a2f05cb7a85f1f7593e4bfe852ce +6a7c07faf7171616a5a8bec8c453c2c3c22743132bc02c2f4a11de7e58e31f3734f94733b13d2c +7278e41d6db7deb9214d00c66e3eda6680b9965718cb56615b3613bf2a19e37dabf09d1216dda5 +71e79c07a3accf8673702928cfdeecc81b2a0359b2f927c2815deb2a1a51ad21520c2d969f8c7f +3c67631418badea64103c9777237f7418fa1e4c9034e3af0fc85fa63f6615f5ab8c473404fde7c +b801cb443e03c4f3d52c1daf37bb0952873fe67392ee576dc91c291f148e2df4310325fdddf02e +5499a2017bda7960ceeafb8a581caad7d1e87e63d85dc99eff45fd6b8c9e83296b0307a987daa9 +398547381beacf5338d38d8e008bb8327c990095f805ffef64490d4f1e9f89eddaf8d60e81af47 +79a7c386552c2ec1f2397b36992f8eb492c23bd50e967d9126aca191048973bbf708a9e6e0d742 +736dacf5b09159fecd6e5b679c0cc507f2f479c150e079fb13f7da493e8588d6834d7e4df9efce +f21988e67b79f5eab2c00ec0335fbf5ab821c88024725ff83ee1708143489c69009fe16657e68d +533037e0e7cee1d3b132e4ad03b876d12a04e52946be29a027e2dec925faf22db3c819a4978811 +75a07edcec18c28f2ab11c07aa2749e3e885f7dbadb8021fb24656c1c3acdb6232c3db1d353c1b +0ab8e2f252ec70527aec582bf99d5ef1d4c43253012b070333d465a4039769428617614bdbc829 +0a7af5421dd3071e112d6b64f78d956923a530e3c0c1c4120d65ff13ac7cd54385577cdcf77d63 +ac2dcdb8e467609de84d142abf564b93a80e2abddeba49743424dfb6bb1ab386b87a7657aac296 +08f6156642c9b46f9efde1c4963cf919780124a63d6f86bcbbbe42db2800ae2a7a358774efedd4 +5c96c9816b046fe44ba12d853067c01deaba7d23500443a3530075e9d41d0cdc73a2f7d31ddab2 +ce734fcb918f9e27eb37352d5d4b42112b7748eca670880181d830ed35141bb7e7134a353726fc +a3dbfb50e6027d821224dbeadb2d8909fabd711753f0712c71d7c4193257f33db3388db8cbceca +89a0524843b46815d1baa04c3308c33ad99d4f4d490b34849cb91dfed06962dd67e62f0e2639af +b9a9f3a33c59e317a9600a0cb01c2e6662d82e2b257f1f6c07fc7e2b0b973b74948aef6444f688 +3c1db3f518fef3274eb38a260eadc9a22bef425ca6360e099b6175575a4db1d3ce6bd22c56e81b +a0a9b57448d847eae41816a59e0b7c6a93be20e3caaef6667920303aaa9be83cfb57f2d7dbd928 +9f94b9584a0596b2a49c06a582965019446870e6a7d6b1fc20d9b6dd0d9a6fcc3bae71f926dd71 +c9ba32dda0a065379d10d4ea820c649b306b09912ba9bfbcd90a5b33f753deaf16a6ae74d5d97c +e3c2912587c6ca0022078ea689c3fb5363c993b7c7c255fa5de668e1094a881da5dd7384e8079b +725b1fd175eff99d567c8680e565a17ced65952792a75c2d4b9d5d69b8f6d987a7be6da9e404c4 +21b41a7813223bf8246dfcbbd6fa0ba8b7ef1aa08b494642dd3941137e649d17f31b1f88214b99 +e6b34dca411dffbc3ea9299f675f3ae7129196dee244fc629001b03391a861e4d457be024a2838 +84a7463f97e378a96f3623f195a854913666475563f813a774ff0b2bc3436cf69d4bfb55282ae9 +3165088e1e2bd1ede8ae9f0ce65bcb4ec48bf06c5d17b78fc9f05489d648286bd61d7ebfd949d1 +94798119e95f438aa8a48f43c0f43d24c906b737c98f7a1527f949992fa07910d5c1ac8a0f7091 +8eaf52d45fe82b10cf5b560cd06df291a1793f9a355a2266e22a68dcf5d64d93d3699f0c2da9cc +2b3777817ca130c41d9ccfd3e7f44dc831062b6c17388aaa6bbd48a22b13487f02908ccd6c5ac2 +6424fe97dd950b5e6e7168bf46ff87062cd352af50a81a7890f822d302a268be250971e6ee73bb +4dd5effb630d0d50caa3260fa8fd2a2d0769dd483fd2e0d4cfdf3bec4a20af1b55979ac2178ffc +4a2e162d98f61082b5bae7a5a60d8c042d97bb87abecef118ee66879710229d6aeaca50bef4ec8 +cf06e58fd3a63c5725c28b5ed9abdabde509d1c0c1a575fef23b9dcf8e403a4a3cc541e618d1fe +1b119628a299eb83dbbfdaefae37d3638a4a74769fd219766efa01ebcc81a780106266b80f15c0 +1a51af1ce978184ecf65c60cb5b3f5d28cf6e62630198ad9ad1c32a244b1968ee962f61a3b49b7 +d13a0d9cb5694c291e72696c40f4dea8a00fde7c01f8b6a20d42ad93d71cd8d8aa207d123e5cc0 +bf86d8dcaea33672b45a2f9c0549c70a6681780a9a8c555b5a2913a27638e851d9a26c738051c5 +d51e643d5bc972c4d254bb9064b1a9a0c1fc0b903c3f823cda898450360ff79f9aa39b9f63f58b +310fa0b487ad57bd5ac10185458b77a75ffe10103004fdb4b55b09b9c336b8e227ab44db4681a5 +15dc7bfb6c0a417d266732815b299412d0855664922d76d25211545e99b50c31b4757e63825dac +ed9c08504af7e46fdbb1ee3c731c355712999949d55ce4a8c7e1e5e1b5d94659d2b93a6792188e +9abf7f082a352f95115fde60b7e4098e064935272618e3ce37efa02620233ef48f1c12eabbafce +286cc06a8d8f46462f5d6fbbf167bd30cb5ac44901030d03bdc02840f8839bdcff2d378c4fdc93 +0a30b765b5670cf81d762b465bd4737c9b00955758d32b7b2f80b942c018c6169cb98d9fb2424b +23a3638cc270b82ba760a18534f8b27e18519f6f3aa73afa9e14d07e457e24c30485bacf933ac3 +a15f15c2347d04eeb30b5b441401d941bd01c148a6dc8420c6c38a7c97f02320f7771c180940ba +28a7dbb6db8d49a3a03b863b08c2d383bb3ec558adff2953567537c0a185261f358631583344a1 +1e3b4423f60ee3f770476348674ac64df8f848d4d000eb6fd06a44d0320975a8eee85173e4d7e3 +9ec9db03a8ed20daed86d273ce5762a5d35d300f438e9070df37bc2c3f45d2848e638edf15fdb5 +fb9a0015993012c5b8277e4f92584d393531cfa0059a6531f8c9cbccb00ba73413eb4555bd30cc +0fa8e414502447dd977bf5943db2f0a740efcec3fbaa039960f39302b719195650c5ffb637594b +34f2f9681477258d010390c241fa41249fd5d57c310cb6dfdc9dfb0039d3a95486dbd4f45daec8 +997aa6661bf11eed2aba5cafd6ceb7f90a8ce42c7b215eab422bf1522bc47fb7d001ebfb76223f +2471326d68d6fd5279ff5fd6ef5276bdcb4b1264381d165d31f039b19079561a2a2dc9b35562bc +d336a90c26a055a92b70be2a20494b535bcc643e7f6c45c0b441cfa4300c7c4c30ba2ef8d6215b +8da8945e544dd54a416412f4517280ef73dfb1a9a2390fbc863f64ef977ab4a4813bcb17ab2b74 +b95eb97028ce0c714f52ee9f28b403bb57ebc7fec24061e5cf24442126242a4b5a68a0fa55089b +45d722a99e0a45ef6dd44e35adf911ced9ee958e8d313844ab95690451f710352d4c8ba639a65c +05b74c6f4804149d60500c911878999f654a0fd0d7f50bb09e450960bc58fef8e386171d627d27 +955467f4687a461eb761837e03967a42fbf184ce21de728741313680519767f305c820e2fa0372 +4a1433c7a5262a45df14c33d8d5f88b3d7d6edf43fde8bdbd9462081a187a4514ce22c899d9a0f +7a85b16457f0ce8dc4dd1e9073db73cc9852479ad04aae56d96648fd728e38de754fcbdb79dab5 +4945564ae229faa128a214335aa91e552e34bd83d8cf2d7f993ba85f3785957ce6d510ce754122 +d8ab98c5edb24361b663dfcd536c0e8fa6f8f1b592c3485025d9ca93950f6668d45adbd13c6080 +652a5abf36da54779f09dfdbc3d676045d6593a3b5fdfd247afb5f8598bfbacc85109dc162f584 +5bb10cc35962c69416a3e08cf90d80bbcc3e7327d090fb6093644e4664346cc132d26081c1d90a +00cdf6ad438ff32acb23ba5615f432d266723e02f58e506c6c712c22965e01b17413cc9772df09 +86d37ceb16ab8c74815e5a2e9abf6a2174c7595ef44ddfbee56fd6d2ef863b4242f0b18ce448a3 +fb7fa0c196c6a2ba6946a98f2e5990c59efac14b8f1afc93cf67445bef35ad0d02999956b690e3 +2cce52671b118df8a4ade5ef0faf91c725c0d3d9a507cb96c1bdf2ed7ba88b286e10dce55717a7 +c7aefb7cb8f6ed79ee02a10fa81b0f166a5cc099337aea3ca0e3ae8c913786b7281f502d1671d3 +62f08ef104e22c14cb5b76633331786dc234becbf5065fdbbe4885078d43e18be29bad865b0ad8 +610decc2000b7094dd66e60ed379f4ec09fe62d6527bc0259b52c64c3350a0602a27ea6edbe5b3 +7e64677301f26e5424c4ec2227ebda1c2ec113b6f17fc736a945ad1ec770161fa135637e09971f +7a86e8175a82a82e1627fa27cd1852e0544739665b43564495a9f6fa7e460a881698b7fcee0e8d +8d31dff340f8847e11d53e276423f3cd3ca6cbd46feccce37891b7d01fa50f472924e42fba1a4c +59e34c674bb5aef3af1b574b318525678ecf72020ec8db2a75da1b89e990fa6a0450b5ae0a4d87 +a0d5edc8c4b83b7c45af21cffd544b9e71b68999cf86ec685bd3de4acf886ff0ccdf9ccb662c92 +ef968b219843708bd979c308dfe8958ffa0d81b4ec770ac6c024fc80f4c1e3b526745195754a42 +eaac4b118aa0e5f9a3582a47bd21bf8ff0dce46bc2cea77f74a0701ee0792d50a03951821a2769 +e904e2ba8eb38b58a34380e6842a31a5432041585d6e5345df42b9f61688bb32506b8585e457ea +527354244b9d1dfe6414c54379794bb53f75a594147e70a8a4fa5541e3de1c060d7f464d3e5f28 +86b9d1dc713086f50ee7239dc30edbc09c66dc474a4095d8523fc6ed58a4383d3c91239b818ad2 +e0bd1fc2949f874dcf2f8d32ccc1f19a6b6708f527681f87c252cd0e1f35c786d62a8b4560cf99 +ecd7d3302355237e9b236e91aa76c17a82513316afc2fe509ea03a0f79463ec4432e4bfeb70f60 +3adcb299a8d9998fc80c656366a15be322418c8de6f4b5953e170609fe61ea36c3b80dab055443 +e77e8232bceb0fe40fc3774c465e7ba2e867204895a939addda4c7f8baa794a682922580ecb60e +1f019d6abd81e43e7901a45bbc8ad4c9bbe51cff7dac8ef9a584cb1a4bcceb089d9e255a50f086 +89cfb53ec006f39a8b54177e938e5cf853ca526df863c25093fe0f2f5404f71dcf9201c54ee93b +edef0a6338d0854ec381d3570e481b00ed9b8b2cc643c0c78b4afe0d41d222e79e006660ec133d +4a28d4a1117400842e0ffc4336104e1a28c1558a9d1d021ef26a883babe54cbf2f0d6646e4a270 +bc0aa7e0d3af3475c8a3f753ccd99326d74d5c7da9921b040427312c74c46eb4b68d97d798a6c3 +fd359e67c11207d8b10c2da5756507f2b0d4393f0d6f0a6bcb59fd36b31ed4f6befc12cce1bedd +4143fa6bbf62b02feb004a630bf5322573ec2ad3dae6b969abdcc72d7322c72d54f1acbd5009d4 +0577eeae4e41ae0c9337d4bc98f11555aa1bdf48e7efbbf4841f29181555df6f2e45c014f954cd +7a33a9d6ef8a5937eb9e2e0735e531e1271eb071e9203b643cc7b0e87903020ae27032cdd83338 +248fa24c7b9921e53d5fcd7b80540fcd5228cb26ccc01201f2130106faff96dfa9ff08de5e2e12 +d0110bf01f2e14562e1114cd3059322d16ac31b25deb911b4e1c3eedcfc792688981483021de41 +0ada3b3853ef43b6f1102bf6f10c1e4344d3ef4e36004b6acdc95d9c41bdbec1958501560080dc +85bbce4bb5080bd1bde1be32cd52ea9a7c868ca3d01f7a838156da7035bcb781855f939539ea62 +eabae3d3d1e25c27e54aaa10bc74a5af5db40eddb60ef60b33d73acfdfcc31579a65b9f0fbb799 +e584a35fa33134a7122207d40dbd2ad29d613a646aefe020077b80d330d170f674950e877db760 +b4e252bcb1fe7f7dafb5f6eaea4e09a99a628621014013d52089cb721097dbd897d27d6717d53a +92c1e11c903da5a5b1abeb1ecab75a03fd67f8a815157461f2933d39762f1f4598475ef113a0b5 +49574d320d4106cf45aac7d1bdfa6d88db48abdbf5d2d0df10f56001cbc5af1b3ded7cd411233a +1d4ee7a727c4096df37376e220b32f06c16533df3e80be8bc8264a869676966418a183b4805e5f +eb6bf898dd5169aaf084222fc6bad9e652d0927a18933ed9e577a0714ea7a05ae4aafa4a318488 +30d7ba321429e950ddbac048e8822caf7a036aa3f9e9b15b5e099cc05a9126e194f41b9c1dd893 +754fb5a1c276c583c00fc740279a658eb3612d62ddb153609f2208cb761d963da2a040ebe2b8e6 +235589709b65d32eb73775a77721248f6ac3999b3766c98aa313f98943ed567aec3f0ef2cca4ea +c94e2b507fdce890b42ddee560d64e411e20943e16105f6438b749292eef7d79edeae660a6411f +4845a851b09232031d8e3435a5ac79dd6b227a8722063c6dfeeb6ef0d3ec6ff1370eb04856c7e3 +ef3b2e29c54e7fbf7c5f73736b71029145375acd7e1bca48959e42de232b0b8acada48a82597f4 +668917c7f95984938037974ab763b132c9f71692da966de63f50191603be855c1062c4dbccd685 +579d76adfbaa7abfe3ea6bb0693a8e4ebe98e222b9dddc7b5c00caaa52ad4d2d275906e992f9e0 +5b608246414b3e944b2835d1a7a79cb5fa2f9b04edbf7fc84073fef6de04f4158fe121df4ce9f9 +a828cfe8e09a5c80141404cc220b2492565c5d3f24fdf03570ed0da8d729d7e8dba4dd98111d62 +0de366f47d61c1a538d89e0bc0a6dbceb6105a45e9e2ad4e64924abdf7c765b72921dc524e7b68 +7d2dd93db6c721db754360384a227ad94136b61fd0c9fc317a75f71b204ae0a1d12bfca52b12a6 +9c77a40028b1db87c7c276a37ec21a4093f304bd8e3b7f0aad86ce3b32ce1fe568beb0e813ffcc +947f0a668fbefaaee7ff65cdc29d672cbfcb74712c3938b6418bf4855b615a7795153883a56058 +fbdbebcd65cada5d34a61d70cd617bb515057020d51d1371fbb261e63e6c23540cc9e698c72444 +e85512a3a8fbf302559e325df1768d6728be219a29034ca77d63df6f6c33d01b7f6aa1e57b215a +e09a4afcfa3de019d248d658dc0cadba830983343b1f6a0fe0aa632cc9d8e63f708ce4913c5ee5 +54c63640e25ddf5f3b367e903158c2a8417cdb13fc06549f626022dc215e337a6c2340475fe7cb +315f8731d69fe05517fcd1c2a38c8420b80c36a46f6325c15e51a9bc975ce2587501c1cb0e2aae +d78b597281c3c3e7310cfff0e3c85765e40c1296c519bc5af94fcba2ce9921da3cfbb167e89208 +8b08a5ce362317abb13a9b56c345ca242f0d9c56aaec4f3697ced94b2756a36d46e24eaeadf171 +b5c074491b14455c19f20e6ba055f05c542bb6b7c3975718bd9f657861e5740e20c97a3d25edbc +d40ce7ca5591627dbb311e3ac19501865de39059d570f1b0af793af5abb10837fb24143d1d1a08 +ace4655de917253766d45df81384535d264d4daa41fc32301996048b7eb638ae471fb2362518fe +c11b39fbd13739c5617bac3a589b56eaa5bdbdba70e6c30931e978b15b5319dc1c62294cefef9b +54467d179c3feb9f02df8608b100cf4a5425202493fed90e9ae277fbd14038848d3ffd8165a747 +dfbc54173f49c6814b41088b980c1bfe78fa848e075c6e3a2d62f25cea02f48604531d65b7a1f9 +8f34e19093a6a8d732ae2bcef21ba428097c7877c71a382f8303b38672bc99ff02c8bfeb06d903 +91c8eefc1c9167994d589c2be4af8ca721e9764345e24e2ae1582b38b458eaebff13089b12b850 +28d07872f48fed6d108e9e523b1ba1ccb2f853161b1f32ea11092eb751b9807cbafa481b040870 +b95bae5fa2dae352ee14b739db6d6e5d6fc12703ba6860921df2dface3d47f1c2a29418764e4e1 +69719f4ebcb96ce64e113f071f3cb594758ca871491d394f8ec24f96cb696c6338dec2969b1167 +542c174f34e1ee517380605a8a511e7af70bce113a6a70ca855e5a1cfb9429063541f579121fcf +a7eb18b30b39df61f89947f4a629a63c347d512dad1e9d80d582bead23df0ae3e92d38e3783c97 +70109a2921835144408e6f284923d28cf3c20a8e023ae9afe169f579a44cb432c0b91bb48384a1 +6ee743795014d1d37e81d3efacc0a59b76c102ee53509e0d2562452fe1177854f96f26f9e94644 +183055b8906c9a0ac65b3335b762d74606b04bb418c17c38b7b41c5bd73ebd2ab30c8f4252a8d2 +78fa9b7aaab007cd23c016c415594f973a9a83790f5ef5911197d4a20b638688302ad8c179e8da +15a08862a50b2b2165a2db724ffb9107ef6eeb2648a0c7c2693e5778ded2e72bb995e19933cffb +d7de74627218386899c302dcb969dc37d5b454892d7032880ac41c3c5f84a1358602e4d9872345 +97a9d11499b1f56e8139a214626026a2b5ed9f240435350a8061a3d6471a1f70f9dd154b11b98b +6301190f77b3dabb9730c4539a8f39e56c9ff29635a0f5d6abbd3a1cdece80bae849b76a5d8d4b +46e62e8c7e5a10b6e3f942de4570ba16eff5f6de2bae4dc4f3183f061ee50f7f25df683a742cde +2ccd2a72104cfe3f9bc757cc05714f33d507264f7835db680f4a2eee60f153829103f9ca4a8e8d +7f1445c991bc646c2a59a6afad1f5976f5d95251d2770333efd9a24326c1c2983315f8958916ca +c08618bd470750e5cf501740b09b6f270fc47a4700af5aceb1f60f9e83821013261be7d20ca221 +758b262fe2cf0d55fbca06548ad9b4a002b34381fd80e4f7934a7f00ca913e81b5fd91dcef124f +d73991b3d28f9de813a540dcf089679f19d3c42e0aade5463ed47a84c9335056150d56b276ff99 +ff904a25fac4a434045f61e01e05760325a1c0ea62aa8f8bb0022ffb83ece29e29f8ad9e767ec2 +75b440f45f1f9505d8f4f35ae06aa89e04f1e6b38b64339001286cb9d4b3d2702e27457f8e9eff +efafb11dc8b20ba86ad21b7026a5479c1015bd2159ea3513c4f3fa55a71d42c573b96960d398e8 +fbe9132005725cac8cf485a580ae949d0b79ede5a0d25ad89577d345ff4890dc66b255a5567e0f +92c909ff90a78e16179f66762e3dcc9273bcb23af678385fca0ca7557c1c345f1f5df3fff48f96 +e59df0d56923497ff7a791c6ea35c827730e3b09e0bca80ffd9ed44f9bdfaf6b277cc96f5014d2 +f54790e7f0f43dfd197678e5538e3e4ec7740de286d079db6b48925211033e1db7af4fc2b0e08e +25306d5277bcc5ea326d6460455b9c17ba739aa226e5184ac4962180df22e480cd063f3481d618 +9835801cb1a465b627a15a53dfdc1ad2450b3128498918b26666dbdd913df039b9f393754014da +7c7dbf4f4cd160e6290e57d24415c602892843dda447b11c2d76549f70847b80616e6046016cc2 +fbc6fc2fef354ca4cb76bd174d77ce23be60942d7e677998edbd014fe4e40f662c9de90b5bc22a +24dc8e4890f2d0d27c6ac5714f77d1c51d85f6de7dd73ff7a5f12ac69b5b4a91195f96674e639a +281796838e22dd65afea42123acdfbe01f6e368f9f199007375d6f466beff2d14df5a040bbc107 +0caa73f8713574037d2d4e10bd551e8f235f0ffe57a74619f936a5f6c79da62d6d9d56a1f36ab4 +a0d2389f1c2e3b262cfcea1c17b67d1432495a08c8ebab99c951595f4c17fc249976a66a5e6362 +e05456bb64e4d84da9146e816d24148dd68ccbd3f0a6d550f239566361467eb1033d0a6d84d73e +9988fa01d3623e0724f8ea61aeae7abf0bd6e1de5f6573f0c435d13d4789096edac3b49ee70987 +f23570e10ba8b67d8d5f22134854872c13010fc621ee3cf34670e562a049da9d644d232b416b09 +6fb726db767301402af153bd5c4d746f423f0708e58639bffb1c958cd594aff8c5983ed16df7fd +db777189002380f8777d850770381eebbc2ad21de7db045ce0beffa404fe69a26a57c8d2277876 +5a73047498d5597360a6b0d1a9af94b2b15292c36440a8198e41ee7950a169d8b12b4b17e433bc +8af9437c9b17098506e0c54a4d95cbc1550507cb7a5d7883a5edb2696559744c130a81cb5f1e14 +25f3cd383c5892fcc9429e2bbefdef1905486200052dfbc23e4becc2092b3de460d1da429aca81 +71cdfcfab8f0acc297ab0d1a43d21ef3e21973bdffbefb290f2ab1364c79bd79b5b8c0925ec8ba +2b260ef5f34f69655f6c7cc927fe718f52d5646e9d6acd4ef70d8cb2853157014d1674e087febe +ebfe490d7a2eefaaa43a2ccdffed19f19e2ee08407f379f3c6df5a22f76cb0fddb259a1512a97f +01e0f5104884d7182d33a970b1723b31485e6692b21ae3fdbb49766deb926d60e6e85ec83fa8ac +b89bef5e47c789b5dc32dd0e0ffde52498ba5e16b70e13d46a9a7b6cdccdf8f1fc185b85d75220 +127ed19bc52c37a0900467eb745e3e4964f928b59e9425d32eac1b783ad3647f7e30cd927d7f98 +5714b67bfd035a2e1915aef2e724f3d43066a459e4322fb4a2451ff65a072a6d54b6165e5a4cda +945dce1534960c0a05a1cc476ece71a31d99d9040c80999da017f39fee87aa220b01ba259830ee +3a8511b48a13b77d1952dc39359ac7480c14bdc5e979918df01fe8c0a54981e3daf22988a69b20 +da390b53c71a0a680c524fb3eabbe15c35b295c9234633393317cb875d1d9fd3f517b75e2279e6 +b55f7e7c91f77cc2ba279c7476efe63e89d51d1f65d0db13595885d09c832425131dac5ece41fa +76ab3fb81ba6875b300c43eac7ca19e0aba2c2abb9dbb7294a9faffd73995826dc8530f6eb3f97 +1564878347fac82ffb51ca2eae1c33e6a638c824eef4f1a5d338cf3676e4e7f745276dfb339097 +ed250a32c1fa0d1180b1d3dcc392582ff4f3f9d2ec95070576e9bbf3c65fb490d9d63ed2e127f1 +01cd81f2913647bb7f706ea676e3b325dc1be29aeb4656a9671e23f20e8cc3faa48c9655a367dc +564401afbb7af29460e9d38237623bb923e06ac9a1a850da9b7ac1feee5b8dc0ee2b489fff40e9 +b1e94b8b84df49754e3964ebd95d78d4da5fe12cb5176af8e2b0f08914287e91cc5862bf9bfb3e +4f2ac67bbb886e3448548b892aa9cdabb9a31d264326a818f9c625a007700547c39ab44c23947e +3607b1d9d66f5ea491450fd1452bd0ce59023bb52efd3374410bc7b60a7d894b7d5a09a12016e5 +b241057cfe03f6599b51ff416fe8d8020d71c1703fea11a9ae4cd5a1031fe7e62c7ff736c25a03 +7bdab4e6e414531fd022ea2614654e63f4340ee5ea7ffce0141b2f5c45ba6906136000d02dca9b +7f9707edef541163206dd366c2430102401fd575caeaa480f411afb7f5980aedee47be44512546 +5ead0d747055a75bc903d53e80f4ce800f5d67dd158990d91ef3458634159e43cc7e275063ff33 +5cc8fe01aa86703d42b4c1064dd8a84167345f1d461a1f87606cc686c76389eeebbfb483eef9eb +e44baf29b4c1a2e47096185b8338472a8f1a94a91c679062c0faafe7bf2f029388d0d683a1700b +6394e4faf06e5af001770f813e49030bf702f728eb065ef465c1e9f13faff25a4a47ea07ab869a +b6f0f790142b6a0454f6b6757447953cb92c0beb5a4eb3f0a922f2e44665f07ab827bb2cbe7319 +9233fa5b048d29564773e81dccf60846e4bd857bf3875f2e79638250e227fb0b8ce80188870594 +030b97021665cfc6f3212c6703602a6b5bdf717a81a96e38e554d715e2949c230c79441e83f8b5 +4e58726c1de83264c31a72be2b0eb98c663ad88fa6a7a2e16f4bb2661938436a1b3934d76e74ae +f519bbc78cc977bf7edd77a441088b7c885ad7b0a7976e37f45d62d089b0a7d086cd4de86ed662 +b9d8010b8bc8e164eeaad11d8ad996c6e882cd824599a22533d1efd052b5cd9fc3a5efc611e4ce +2c4c1a342f5cb4e1eeecadb5b5c9883f54396b118b023421e48cee67a34dd58a45a21b880e0779 +c9dc637d78956415c5f4fdbaf530a55126a659408336b4b25ea132575796b36cdb8a657922331c +f66d459036fd6a8d10d39d9d7abefc8f624614452bbdc744dafea6225ff9dd6f0aeb017aa8f567 +2eb50f8e82a6ed80260b51cd7f19e7ff05c23c2583a8dd01b377a91e7e39c71f0da015bb767975 +20df5ddc2425269f99d33dc2cf60feb54418ee93210dcd9ff5e5d82f99758fafa8fbfeafe56e02 +75b4fe335f4ea2dce58263d0c3df59b4361dce5ca5b2d8a08a76e94c25dca8496b31825c112d16 +bbfda27ab03306a40879b164121c0018aa96f189660b053eaf0bd03663f976faa6e6fb263d4d48 +ebec3debc5dcf1e0eaed7b9402597d79e491750b2076f668f4557964e2b73511abd5c028d96a02 +1e82370f6c51b76e9dc536f6e557268777faa2c7e7306bf077861e650167f6e7523ecd525c5701 +4b14dcdc7a0d31f76ef8d5518ec3fb14e2cc3401325079a23fd6f91809343e9b3d0c347b56a4a9 +9d759e4a965b339db7df1a054d9ca96d2713aa412f083d5284e05c3139cd9ecb978725d453bbe0 +5310448b4e263691d414f62512b2ee3bf50d589bba13705785572368dec4a5d94f50f5a26172af +0f44393302812948e5358029cdd53b87017b69a3901a9c7a27953e8fa81f41a8d03a1522f91eca +fed281ee0e7722b4263aab2e4a7d5705839aa7bcf9057948b36c6a26caa9308dfbf7f955edb94d +805a7f49ab51cacc0a9bbd9601d5088a2845989e13c388676389e36701a5d7d9d89ee8614f9fe9 +df1c3793a0454b7a5a91d7b0f0aabea3a94ce1cfe2c480e6b8ede4c8ba9c235a2cb1e28fdf938c +6c51a3a3a28e7a80fb2454ef057107d8ccbca1d32ed45d64422f7d15b81211df041cd668a3a1ab +1fca1abe17cf4cb1f3fb88be6159b777797f2082209d8fc2c8b752145ee7168ee6d338ccff0bde +30a68491b706582dd31a4c8f07e73f1b93a7598689a69ba9f30485af7d164ee57c2e8b79f03603 +59000d83626921478f4733cde7263c25b2d5f0d910a2490057bb599ebab933b0db5a55dec80780 +93b6ca009d1f77809302ccda480c1860a88cf1ae85cc38890dd91ba261642c49670143d2fda7e6 +a463868a288b4883c29dac66f5b74575afcf06680c1b23155ae25e22b303eb6f8d9da9e1e216d7 +cc86a854700dc1cbc59ca158206fd9cd5fdcec227ffc20ba2f8563d34a71b8b32bf81ace6be0fa +c00a262cfb2690873a2f3b132bb950253eee7b6e62647f71e056225055cccd4e4bae19a277fdd4 +a0330f85db2110381faecdfceda5c820e2b0b22bd2ce5e65477f418af4d3df07582574aaf6ebeb +b781887e7bae86d0ee00ea33d84502f6da28895010b6a25d60dd66516d0ec4a7293e9b52f02b3c +bd2acdd1f70d561996592a7923f0eabe9ee8212638c4014ae431e7ed1b080794bf44bf640de46c +bc3ad8118f58cb3dabe9ff2a6572a1d8384d922425afa46f8ba0f01955164d6be9a2666328836e +c1e63bd0b741ba1e8c247c2e8dc86502287a57e0db57a57b2c264348d7f0ae23f2f287939f13b3 +9b78b3676f2e84dfeed137f0a41d9c44205889498dcffb9f7b77c8b587979e94f0381c982ba947 +a9c1d4b19ac8eabd5e8bdad55849ebc7e9e600bd11c5f9a9d7fffd69a274a18683dc69632a8d01 +8c181d95b06c10453a6abebf6922457fec592b99e4a96a8986c9b8416f63b2ceda5702028cbe9c +2917c3312340de93764166ad219081df78a1edfbabb9f4e2db16118368653733bd57c9e25bfcfe +282fae411e126d4966366271bbede5da9a48728de36d4fdedbee8985c24ad3aee0ab22e45837f9 +e6e22f1ea37a784e6d174ff3477d7c236c6d150512727b818549036078e960deef47daae259360 +61b9a8c03aee7984965b5dcce066e7b5b359735007d7a121ce6302cb5918cc18819ccfa0b17c00 +a73743bf6aed7eff15aabe1cf558913ac4c1474f7e6fa6ded48aedc460ef2ad767f47edabc2e9e +f390752eea5b3bb9573e9ef08464d4b9c47203eada3b3c247e987a67c7fc56b54ddc34515c31fc +1e18365c823091d75f1482a02088c2f139ccf310c72d25ff4a75351eb6dd345747945cdd93ec0e +6cfd2be6c942a5230e39d62d6e4812e137836f2a683768d63685f01a63c37dbc823f80ed37923b +93f13462171635e8b4bb3a5ef547b84105db78046b7e9f6ba8957e8e35e2f15c02aa49331d6e57 +8f2ddd75ccfdb7d73af3b8cfc48069d0bf81c1ab7f205067e0b3fdb8dba05399800fc3f01d58a0 +ce8ced16b2674ca557c15b0f597150dbae4eae3409ed9dd05639b9b52414d7c8c731048b00ae83 +b239c116d836aaf6c54928550cab67a24a7a6fcbcd43c46c343aeb63898fdb19e42debbdd3521f +46fcae9049d3354ff5acbde61e5377ba75150ccf3087427c154fc8b605c1e3dbcb2197fce95b95 +c7a2a3f751f48440a30a6bbe46b973b88454388e228121d03064aeac8260e72601a9f4047d7794 +359eab6e32d59563c2c49f44d059d6e328051f0bfe44ba538572f0a3184e520001d355af4f7227 +f31f533051711b7395d0ee6d5799ae702922dc89ca95d537557a1b7d60f577cd8f0e5fee34d829 +2c9d582bb3feab3548c913003d9394567d3b85fc358521a3a862579688be6c3188daec46336391 +2b7046205f979eb21b737e85211680c6d5639f5a16eb3653fd969f084547f509cc37406754701f +f81359cc1ca82e41747c2c2eb61f2c40f077dd4dd56e6c0f712ee4b4de768be140a47135d38ced +d9214deda6068da169f716f65b1c9201f86fc3a5ed7cb9f14e73f39cd1105666043776ce171f76 +2a31ab1ca4d610715211bfb8fefa5b3cab7a7bf33ae8590af88a1247d5bc720d622ae268893daa +62743a577c6908d4db046532fc7ae6cc3ae15278ba0498bb4813618015f01fad8c4665abdaa0a1 +5c1b1ae567bef5a0d9c2905944c1a5a78d59fd940f2f6d08f3302577d70a7b4d39afb424235791 +f9fddfe88b9fa8d2be4d7c012a94c8d403dfdf44d48e34280d9a327dbf9d7e4b128f1bd70254f4 +f6da92998d9fc702e1695956f87921ad8af75a1a81259bfa985c2a53effd40b881e0b3714a2454 +ece15cc6db4ed531ac65cf9bbf9fe7cd60fd9bc729fae104e7c8b867096b5cd5b3f3d437bf8765 +90c222db6a2231f8b58622095107c2c57c5ee6df2fddea548c893c65265295c41d1315701d46fa +3208a3e87c5f12420c30609f9758ed81e5e1d344db3359e85fb823aaa9309b97f479fd2b935825 +2ad12d6954ef2a729f9d10b6cc6a111a6c020527bfc685ae087a1062b564656f9b9d4723fdaf9d +dc7410e2dc5647a5ade74c0c611abd006138df07e2dae381bee39cdb6b24f6c273736fda0adc62 +8418568157893ba7916866e7e2a6451651825a5dbcd2811163a1a8d047a3100b739fcdecae7e5b +de7e9019648d35370a5f70b944566ce1bdd136a8c3f9883c542997cb195e6780c767ee8ac0394c +4445ce19268e734949d51d642112ece9291b3204e4351f30af6b3b5c5b08a2a371a51f868b305f +54ab2aab660cb8328bcecafbe87e5226f4f83990fb31c424528463b1c806b5b74ba01374d0f70f +6e3269593de4230e4061411918ee1221b58e3d3920036e114f8c8ee392bcbe78b54e574ec2d573 +46a06dbd8aef1b49efbcc0688d7f9767324124886fa195e86a757f651275d51016fdee4155fbc0 +501e683efd8779a29d510edfd1bde99e86cd03f5f171b05c720640ca10919b0787da963747a3cf +c2f722419b6f8c7a361ca7768c8c804861a07874b681ffc266e284c683505c1ac948e9312db8f8 +33ead8243171e959a74dba1105de9869d94dfa578008dd30e994c5b2107a90cccc52e9c7b96a4b +8b36512fd8442f454987979f59fc5fb2d7464a0501cb7932413a379ff8fce516d20286ec9a86f4 +52c5e1ff5ea907cc6882b58952fccaad4291eebe3a890f49da5b4cff04e006a1c18fb4a95a1958 +decf0c84dad894c3b355761e7173fc43e44de12d4d0c0e05a61f1daa64288170d17da7777950ec +6c685a1752ac7d555403b80db90abce6335fb9916957bfd2b16e8c9c114cd0b95409c9bbff4f10 +6d21cb6e267f6f4a8883e4831c015ed6ef7fe4e8bd20ef254f7602de028baf9c88c62b8323334a +b5b7f4cd68d03c2acd95ddee88a0ef26199a9d6ba435a96a91ef55887aa4870468dc516ffdf1eb +12ff797d8fff0f6e5de2afcad81614e3bb9fd950a5db3b6879f3cedc9c9c64f2043c291867a594 +c024d571eb0f91b450f183b3fc1b7fbd31bb9c2610794855346726de64d3367cdfcd0470f35f45 +f86d481fb94dd2faf6fc2e93f2602822c8f7c94f2a538fbc3ade59a5a62de463c1835d9a74ca0b +163ffb7fb8de8f658dbeb272daca86c431fef354af +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if + +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 6 5 257 172 +%%EndPageSetup +q 6 5 251 167 rectclip q +0 g +0.8 w +1 J +1 j +[] 0.0 d +4 M q 1 0 0 -1 0 180 cm +37.602 139.602 m 31.602 139.602 l S Q +BT +8 0 0 8 22 37.44 Tm +/f-0-0 1 Tf +(0)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 113.922 m 31.602 113.922 l S Q +BT +8 0 0 8 18 63.12 Tm +/f-0-0 1 Tf +(10)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 88.238 m 31.602 88.238 l S Q +BT +8 0 0 8 18 88.8 Tm +/f-0-0 1 Tf +(20)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 62.641 m 31.602 62.641 l S Q +BT +8 0 0 8 18 114.4 Tm +/f-0-0 1 Tf +(30)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 36.961 m 31.602 36.961 l S Q +BT +8 0 0 8 18 140.08 Tm +/f-0-0 1 Tf +(40)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 11.281 m 31.602 11.281 l S Q +BT +8 0 0 8 18 165.76 Tm +/f-0-0 1 Tf +(50)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 139.602 m 37.602 145.602 l S Q +BT +8 0 0 8 35.6 19.44 Tm +/f-0-0 1 Tf +(1)Tj +ET +q 1 0 0 -1 0 180 cm +57.121 139.602 m 57.121 145.602 l S Q +BT +8 0 0 8 55.12 19.44 Tm +/f-0-0 1 Tf +(2)Tj +ET +q 1 0 0 -1 0 180 cm +76.719 139.602 m 76.719 145.602 l S Q +BT +8 0 0 8 74.72 19.44 Tm +/f-0-0 1 Tf +(3)Tj +ET +q 1 0 0 -1 0 180 cm +96.238 139.602 m 96.238 145.602 l S Q +BT +8 0 0 8 94.24 19.44 Tm +/f-0-0 1 Tf +(4)Tj +ET +q 1 0 0 -1 0 180 cm +115.762 139.602 m 115.762 145.602 l S Q +BT +8 0 0 8 113.76 19.44 Tm +/f-0-0 1 Tf +(5)Tj +ET +q 1 0 0 -1 0 180 cm +135.281 139.602 m 135.281 145.602 l S Q +BT +8 0 0 8 133.28 19.44 Tm +/f-0-0 1 Tf +(6)Tj +ET +q 1 0 0 -1 0 180 cm +154.879 139.602 m 154.879 145.602 l S Q +BT +8 0 0 8 152.88 19.44 Tm +/f-0-0 1 Tf +(7)Tj +ET +q 1 0 0 -1 0 180 cm +174.398 139.602 m 174.398 145.602 l S Q +BT +8 0 0 8 172.4 19.44 Tm +/f-0-0 1 Tf +(8)Tj +ET +q 1 0 0 -1 0 180 cm +193.922 139.602 m 193.922 145.602 l S Q +BT +8 0 0 8 191.92 19.44 Tm +/f-0-0 1 Tf +(9)Tj +ET +q 1 0 0 -1 0 180 cm +213.441 139.602 m 213.441 145.602 l S Q +BT +8 0 0 8 209.44 19.44 Tm +/f-0-0 1 Tf +(10)Tj +ET +q 1 0 0 -1 0 180 cm +233.039 139.602 m 233.039 145.602 l S Q +BT +8 0 0 8 229.04 19.44 Tm +/f-0-0 1 Tf +(11)Tj +ET +q 1 0 0 -1 0 180 cm +252.559 139.602 m 252.559 145.602 l S Q +BT +8 0 0 8 248.56 19.44 Tm +/f-0-0 1 Tf +(12)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 11.281 m 37.602 139.602 l 252.559 139.602 l S Q +BT +0 8 -8 0 11.76 92.567813 Tm +/f-0-0 1 Tf +[(Time, s)]TJ +8 0 0 8 114.829063 5.44 Tm +[(Initial no. of nodes)]TJ +2.516367 18.54 Td +[(1. Time without)3( failures)]TJ +ET +1.6 w +q 1 0 0 -1 0 180 cm +100.961 23.281 m 129.359 23.281 l 37.602 56.16 m 39.762 61.52 l 41.922 +66.801 l 44.078 72 l 46.32 76.961 l 48.48 81.68 l 50.641 86.078 l 52.801 + 90.16 l 54.961 93.762 l 57.121 96.879 l 59.281 99.52 l 61.52 101.602 l +63.68 103.359 l 65.84 104.719 l 68 105.84 l 70.16 106.719 l 74.48 108.32 + l 76.719 109.039 l 78.879 109.84 l 83.199 111.762 l 85.359 112.719 l 89.68 + 114.641 l 91.922 115.602 l 94.078 116.48 l 96.238 117.281 l 98.398 118 +l 100.559 118.641 l 104.879 119.602 l 107.121 120 l 109.281 120.32 l 111.441 + 120.559 l 113.602 120.801 l 115.762 121.039 l 117.922 121.199 l 120.078 + 121.359 l 122.32 121.52 l 124.48 121.602 l 126.641 121.68 l 128.801 121.762 + l 130.961 121.84 l 133.121 121.922 l 135.281 122 l 137.52 122.078 l 141.84 + 122.078 l 144 122.16 l 150.48 122.16 l 152.641 122.078 l 154.879 122.078 + l 159.199 121.922 l 161.359 121.84 l 163.52 121.84 l 165.68 121.762 l 167.84 + 121.762 l 170.078 121.84 l 172.238 121.922 l 174.398 122.078 l 176.559 +122.32 l 183.039 123.281 l 185.281 123.68 l 191.762 124.641 l 193.922 124.879 + l 196.078 125.039 l 198.238 125.121 l 200.48 125.199 l 202.641 125.199 +l 204.801 125.281 l 206.961 125.281 l 209.121 125.359 l 213.441 125.68 l + 215.68 125.922 l 217.84 126.32 l 220 126.641 l 222.16 127.121 l 224.32 +127.52 l 226.48 127.922 l 228.641 128.32 l 230.879 128.719 l 233.039 129.039 + l 235.199 129.281 l 239.52 129.602 l 241.68 129.68 l 243.84 129.762 l 248.238 + 129.762 l 250.398 129.68 l 252.559 129.68 l S Q +BT +8 0 0 8 134.96 141.76 Tm +/f-0-0 1 Tf +[(2. Time with a)3( slave node fail)3(ure)]TJ +ET +[ 4.8 4.8] 0 d +q 1 0 0 -1 0 180 cm +100.961 35.281 m 129.359 35.281 l 57.121 57.602 m 61.121 66.398 l 63.039 + 70.641 l 65.039 74.879 l 67.039 78.879 l 68.961 82.719 l 70.961 86.398 +l 72.961 89.762 l 74.879 92.801 l 76.879 95.52 l 78.879 97.84 l 80.801 99.84 + l 82.801 101.602 l 84.801 103.121 l 86.719 104.398 l 88.719 105.441 l 90.719 + 106.398 l 92.641 107.281 l 94.641 108.16 l 96.641 108.961 l 98.559 109.762 + l 100.559 110.559 l 102.559 111.441 l 104.48 112.238 l 106.48 113.121 l + 108.48 114 l 110.398 114.801 l 112.398 115.68 l 114.398 116.48 l 116.32 + 117.281 l 118.32 118.078 l 120.32 118.879 l 122.32 119.602 l 124.238 120.238 + l 126.238 120.801 l 128.238 121.281 l 130.16 121.68 l 132.16 121.922 l +134.16 122 l 136.078 122 l 138.078 121.762 l 140.078 121.52 l 142 121.121 + l 144 120.719 l 146 120.32 l 147.922 120 l 149.922 119.68 l 151.922 119.52 + l 153.84 119.441 l 155.84 119.602 l 157.84 119.922 l 159.762 120.398 l +161.762 120.961 l 163.762 121.68 l 165.68 122.32 l 169.68 123.602 l 171.602 + 124.16 l 173.602 124.559 l 175.602 124.801 l 177.52 124.879 l 179.52 124.879 + l 181.52 124.719 l 183.441 124.398 l 185.441 124.078 l 187.441 123.762 +l 189.359 123.359 l 191.359 122.961 l 193.359 122.559 l 195.281 122.238 +l 197.281 121.922 l 199.281 121.762 l 201.199 121.602 l 203.199 121.52 l + 205.199 121.52 l 207.121 121.68 l 209.121 121.84 l 211.121 122.16 l 213.121 + 122.559 l 215.039 123.121 l 217.039 123.68 l 219.039 124.398 l 220.961 +125.121 l 222.961 125.922 l 224.961 126.641 l 226.879 127.359 l 228.879 +128.078 l 230.879 128.641 l 232.801 129.121 l 234.801 129.52 l 236.801 129.762 + l 238.719 129.922 l 240.719 130 l 242.719 130 l 244.641 129.922 l 248.641 + 129.602 l 250.559 129.441 l 252.559 129.281 l S Q +BT +8 0 0 8 134.96 129.76 Tm +/f-0-0 1 Tf +[(3. Time with a)3( master node fail)3(ure)]TJ +ET +0.801 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +54.121 49.719 6 6 re S Q +q 1 0 0 -1 0 180 cm +73.719 93.398 6 6 re S Q +q 1 0 0 -1 0 180 cm +93.238 106.281 6 6 re S Q +q 1 0 0 -1 0 180 cm +112.762 114.039 6 6 re S Q +q 1 0 0 -1 0 180 cm +132.281 117 6 6 re S Q +q 1 0 0 -1 0 180 cm +151.879 117 6 6 re S Q +q 1 0 0 -1 0 180 cm +171.398 119 6 6 re S Q +q 1 0 0 -1 0 180 cm +190.922 119 6 6 re S Q +q 1 0 0 -1 0 180 cm +210.441 123.238 6 6 re S Q +q 1 0 0 -1 0 180 cm +230.039 126.121 6 6 re S Q +q 1 0 0 -1 0 180 cm +249.559 126.602 6 6 re S Q +q 1 0 0 -1 0 180 cm +112.199 44.281 6 6 re S Q +BT +8 0 0 8 134.96 117.76 Tm +/f-0-0 1 Tf +[(4. Time with a)3( backup node failure)]TJ +ET +1.6 w +[ 2.4 2.4] 0 d +q 1 0 0 -1 0 180 cm +100.961 59.281 m 129.359 59.281 l 57.121 15.84 m 59.121 15.762 l 61.121 + 15.84 l 63.039 16.078 l 65.039 16.641 l 67.039 17.52 l 68.961 18.879 l +70.961 20.801 l 72.961 23.359 l 74.879 26.719 l 76.879 30.879 l 78.879 36 + l 80.801 41.762 l 82.801 48 l 84.801 54.559 l 86.719 61.281 l 88.719 67.84 + l 90.719 74.16 l 92.641 80 l 94.641 85.121 l 96.641 89.281 l 98.559 92.559 + l 100.559 94.879 l 102.559 96.398 l 104.48 97.359 l 106.48 97.762 l 108.48 + 97.762 l 110.398 97.602 l 114.398 96.961 l 116.32 96.801 l 118.32 96.879 + l 120.32 97.121 l 122.32 97.602 l 124.238 98.16 l 126.238 98.801 l 128.238 + 99.52 l 130.16 100.32 l 132.16 101.121 l 134.16 101.84 l 136.078 102.559 + l 138.078 103.199 l 140.078 103.762 l 142 104.238 l 146 105.199 l 147.922 + 105.602 l 149.922 106 l 151.922 106.48 l 153.84 106.879 l 155.84 107.359 + l 157.84 107.922 l 159.762 108.48 l 161.762 109.121 l 163.762 109.84 l +165.68 110.641 l 167.68 111.441 l 169.68 112.48 l 171.602 113.52 l 173.602 + 114.719 l 175.602 116.078 l 177.52 117.441 l 179.52 118.961 l 181.52 120.398 + l 183.441 121.762 l 185.441 123.039 l 187.441 124.078 l 189.359 124.879 + l 191.359 125.359 l 193.359 125.52 l 195.281 125.281 l 197.281 124.641 +l 199.281 123.762 l 201.199 122.641 l 203.199 121.441 l 205.199 120.32 l + 207.121 119.199 l 209.121 118.32 l 211.121 117.762 l 213.121 117.52 l 215.039 + 117.762 l 217.039 118.398 l 219.039 119.441 l 220.961 120.719 l 222.961 + 122.16 l 224.961 123.762 l 226.879 125.281 l 228.879 126.801 l 230.879 +128.238 l 232.801 129.359 l 234.801 130.238 l 236.801 130.879 l 238.719 +131.199 l 240.719 131.359 l 242.719 131.359 l 244.641 131.121 l 246.641 +130.801 l 248.641 130.398 l 250.559 129.922 l 252.559 129.359 l S Q +0.8 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +37.602 11.281 m 37.602 139.602 l 252.559 139.602 l S Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/graphics/factory-6000.eps b/graphics/factory-6000.eps @@ -0,0 +1,742 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.2 (http://cairographics.org) +%%CreationDate: Fri Apr 8 12:08:15 2016 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 6 5 257 172 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font NimbusRomNo9L-Regu +%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.06 +%%Title: NimbusRomNo9L-Regu +%Version: 1.06 +%%CreationDate: Thu Aug 2 13:14:49 2007 +%%Creator: frob +%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design & +%Copyright: Development; Cyrillic glyphs added by Valek Filippov (C) +%Copyright: 2001-2005 +% Generated by FontForge 20070723 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/NimbusRomNo9L-Regu known{/NimbusRomNo9L-Regu findfont dup/UniqueID known pop false {dup +/UniqueID get 5020931 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /f-0-0 def +/FontBBox {-168 -281 1031 924 }readonly def + +/PaintType 0 def +/FontInfo 9 dict dup begin + /version (1.06) readonly def + /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001-2005) readonly def + /FullName (Nimbus Roman No9 L Regular) readonly def + /FamilyName (Nimbus Roman No9 L) readonly def + /Weight (Regular) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 32 /space put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 73 /I put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +readonly def +currentdict end +currentfile eexec +f983ef0097ece61cf3a79690d73bfb4b0027b850f3158905fdac1bc024d7276e0a12b7ddcede59 +e3601ab4509dfe0977ed5bf624ebc1f818c45f1350d41b052a72743accb053eb06ed043568d319 +6a30bed220227e2a15bacef508449221cf338a8666e92410a9aa91d5a31900a93c01ec21742cd1 +4dc46bffa111ce10b78ae01abaeba7f36cdf79a4733245c63f6d36234d6b0961f1ac295d617793 +1b9ed554bb5fc6741a63c493daabf03d753c7d2b8e8c01e3e280898f810da5985212c8c0bbdee4 +e8ab9b22bea83671c0460443ede9be044168f8ab53c69bc49ad71a0547df6f3447fc6ffd34e2d3 +9ed48de6bc2089b6b5552aa4085f6c1987df2caca5508fa11423e466bf458fecda5995f25f0324 +14e6f58c6c59ce2ffc8c211b06d42d5a7b8a72fa665c59275415182aa8381c14ac61c786471323 +36963a5eeed481f9b51f45d790f579fef6f6027eae46127239042d2b16b6d1361b86fa7dfd08bc +82c364a6d545c39c36dead5411eb689b2f50c96fd178f942869a35f0f6891ba5b60ea8635b461f +2046c2a875cd629a9ebd077d8e8fb197aa8af4470528a6f71daca21dec753c632d273cf515faa4 +de0ddf08d221ad58c716869dd0bebafbac5ac5ecd59d904d0e5945dffe802f30d4c3d18e64f593 +28924caf91832420f387cd6e5761c589c4280665c32eca518a60a0690bfda35df9911050e6cebc +d48090f6237ee6070fe0a47be80820fb3c0200e22ddd432fa006c0a4687afa406cf2aa0d45e77c +b2d5a436342baf07e35e65b72f2683cd2e1065b4b16cb42c4bd06c6d814975fc77063df25dab93 +459ceb04bfb4f66fd36d907428db57278b68a763f405b1156fcad7e27686b6c3908df3b3d83c76 +03ca5ebfaa2b9eabe8e6fb747b8ca1268d646f46dd5e6dc67435654dca97e30c71c4f463717063 +c5f1c6a85482f677271ee47383bb9cd3a11c7fbf5cf708c24fd1c879a2ffb67640865bc36d08e0 +898faf149794e9e4205bebcaaef0646103349eacaee5ceb5db05c87be2a4d6eb6a752b3bf41e00 +125f0f55bdd01e769c06bb93c67b95d3c02e25d76c78ed8c63a2f05cb7a85f1f7593e4bfe852ce +6a7c07faf7171616a5a8bec8c453c2c3c22743132bc02c2f4a11de7e58e31f3734f94733b13d2c +7278e41d6db7deb9214d00c66e3eda6680b9965718cb56615b3613bf2a19e37dabf09d1216dda5 +71e79c07a3accf8673702928cfdeecc81b2a0359b2f927c2815deb2a1a51ad21520c2d969f8c7f +3c67631418badea64103c9777237f7418fa1e4c9034e3af0fc85fa63f6615f5ab8c473404fde7c +b801cb443e03c4f3d52c1daf37bb0952873fe67392ee576dc91c291f148e2df4310325fdddf02e +5499a2017bda7960ceeafb8a581caad7d1e87e63d85dc99eff45fd6b8c9e83296b0307a987daa9 +398547381beacf5338d38d8e008bb8327c990095f805ffef64490d4f1e9f89eddaf8d60e81af47 +79a7c386552c2ec1f2397b36992f8eb492c23bd50e967d9126aca191048973bbf708a9e6e0d742 +736dacf5b09159fecd6e5b679c0cc507f2f479c150e079fb13f7da493e8588d6834d7e4df9efce +f21988e67b79f5eab2c00ec0335fbf5ab821c88024725ff83ee1708143489c69009fe16657e68d +533037e0e7cee1d3b132e4ad03b876d12a04e52946be29a027e2dec925faf22db3c819a4978811 +75a07edcec18c28f2ab11c07aa2749e3e885f7dbadb8021fb24656c1c3acdb6232c3db1d353c1b +0ab8e2f252ec70527aec582bf99d5ef1d4c43253012b070333d465a4039769428617614bdbc829 +0a7af5421dd3071e112d6b64f78d956923a530e3c0c1c4120d65ff13ac7cd54385577cdcf77d63 +ac2dcdb8e467609de84d142abf564b93a80e2abddeba49743424dfb6bb1ab386b87a7657aac296 +08f6156642c9b46f9efde1c4963cf919780124a63d6f86bcbbbe42db2800ae2a7a358774efedd4 +5c96c9816b046fe44ba12d853067c01deaba7d23500443a3530075e9d41d0cdc73a2f7d31ddab2 +ce734fcb918f9e27eb37352d5d4b42112b7748eca670880181d830ed35141bb7e7134a353726fc +a3dbfb50e6027d821224dbeadb2d8909fabd711753f0712c71d7c4193257f33db3388db8cbceca +89a0524843b46815d1baa04c3308c33ad99d4f4d490b34849cb91dfed06962dd67e62f0e2639af +b9a9f3a33c59e317a9600a0cb01c2e6662d82e2b257f1f6c07fc7e2b0b973b74948aef6444f688 +3c1db3f518fef3274eb38a260eadc9a22bef425ca6360e099b6175575a4db1d3ce6bd22c56e81b +a0a9b57448d847eae41816a59e0b7c6a93be20e3caaef6667920303aaa9be83cfb57f2d7dbd928 +9f94b9584a0596b2a49c06a582965019446870e6a7d6b1fc20d9b6dd0d9a6fcc3bae71f926dd71 +c9ba32dda0a065379d10d4ea820c649b306b09912ba9bfbcd90a5b33f753deaf16a6ae74d5d97c +e3c2912587c6ca0022078ea689c3fb5363c993b7c7c255fa5de668e1094a881da5dd7384e8079b +725b1fd175eff99d567c8680e565a17ced65952792a75c2d4b9d5d69b8f6d987a7be6da9e404c4 +21b41a7813223bf8246dfcbbd6fa0ba8b7ef1aa08b494642dd3941137e649d17f31b1f88214b99 +e6b34dca411dffbc3ea9299f675f3ae7129196dee244fc629001b03391a861e4d457be024a2838 +84a7463f97e378a96f3623f195a854913666475563f813a774ff0b2bc3436cf69d4bfb55282ae9 +3165088e1e2bd1ede8ae9f0ce65bcb4ec48bf06c5d17b78fc9f05489d648286bd61d7ebfd949d1 +94798119e95f438aa8a48f43c0f43d24c906b737c98f7a1527f949992fa07910d5c1ac8a0f7091 +8eaf52d45fe82b10cf5b560cd06df291a1793f9a355a2266e22a68dcf5d64d93d3699f0c2da9cc +2b3777817ca130c41d9ccfd3e7f44dc831062b6c17388aaa6bbd48a22b13487f02908ccd6c5ac2 +6424fe97dd950b5e6e7168bf46ff87062cd352af50a81a7890f822d302a268be250971e6ee73bb +4dd5effb630d0d50caa3260fa8fd2a2d0769dd483fd2e0d4cfdf3bec4a20af1b55979ac2178ffc +4a2e162d98f61082b5bae7a5a60d8c042d97bb87abecef118ee66879710229d6aeaca50bef4ec8 +cf06e58fd3a63c5725c28b5ed9abdabde509d1c0c1a575fef23b9dcf8e403a4a3cc541e618d1fe +1b119628a299eb83dbbfdaefae37d3638a4a74769fd219766efa01ebcc81a780106266b80f15c0 +1a51af1ce978184ecf65c60cb5b3f5d28cf6e62630198ad9ad1c32a244b1968ee962f61a3b49b7 +d13a0d9cb5694c291e72696c40f4dea8a00fde7c01f8b6a20d42ad93d71cd8d8aa207d123e5cc0 +bf86d8dcaea33672b45a2f9c0549c70a6681780a9a8c555b5a2913a27638e851d9a26c738051c5 +d51e643d5bc972c4d254bb9064b1a9a0c1fc0b903c3f823cda898450360ff79f9aa39b9f63f58b +310fa0b487ad57bd5ac10185458b77a75ffe10103004fdb4b55b09b9c336b8e227ab44db4681a5 +15dc7bfb6c0a417d266732815b299412d0855664922d76d25211545e99b50c31b4757e63825dac +ed9c08504af7e46fdbb1ee3c731c355712999949d55ce4a8c7e1e5e1b5d94659d2b93a6792188e +9abf7f082a352f95115fde60b7e4098e064935272618e3ce37efa02620233ef48f1c12eabbafce +286cc06a8d8f46462f5d6fbbf167bd30cb5ac44901030d03bdc02840f8839bdcff2d378c4fdc93 +0a30b765b5670cf81d762b465bd4737c9b00955758d32b7b2f80b942c018c6169cb98d9fb2424b +23a3638cc270b82ba760a18534f8b27e18519f6f3aa73afa9e14d07e457e24c30485bacf933ac3 +a15f15c2347d04eeb30b5b441401d941bd01c148a6dc8420c6c38a7c97f02320f7771c180940ba +28a7dbb6db8d49a3a03b863b08c2d383bb3ec558adff2953567537c0a185261f358631583344a1 +1e3b4423f60ee3f770476348674ac64df8f848d4d000eb6fd06a44d0320975a8eee85173e4d7e3 +9ec9db03a8ed20daed86d273ce5762a5d35d300f438e9070df37bc2c3f45d2848e638edf15fdb5 +fb9a0015993012c5b8277e4f92584d393531cfa0059a6531f8c9cbccb00ba73413eb4555bd30cc +0fa8e414502447dd977bf5943db2f0a740efcec3fbaa039960f39302b719195650c5ffb637594b +34f2f9681477258d010390c241fa41249fd5d57c310cb6dfdc9dfb0039d3a95486dbd4f45daec8 +997aa6661bf11eed2aba5cafd6ceb7f90a8ce42c7b215eab422bf1522bc47fb7d001ebfb76223f +2471326d68d6fd5279ff5fd6ef5276bdcb4b1264381d165d31f039b19079561a2a2dc9b35562bc +d336a90c26a055a92b70be2a20494b535bcc643e7f6c45c0b441cfa4300c7c4c30ba2ef8d6215b +8da8945e544dd54a416412f4517280ef73dfb1a9a2390fbc863f64ef977ab4a4813bcb17ab2b74 +b95eb97028ce0c714f52ee9f28b403bb57ebc7fec24061e5cf24442126242a4b5a68a0fa55089b +45d722a99e0a45ef6dd44e35adf911ced9ee958e8d313844ab95690451f710352d4c8ba639a65c +05b74c6f4804149d60500c911878999f654a0fd0d7f50bb09e450960bc58fef8e386171d627d27 +955467f4687a461eb761837e03967a42fbf184ce21de728741313680519767f305c820e2fa0372 +4a1433c7a5262a45df14c33d8d5f88b3d7d6edf43fde8bdbd9462081a187a4514ce22c899d9a0f +7a85b16457f0ce8dc4dd1e9073db73cc9852479ad04aae56d96648fd728e38de754fcbdb79dab5 +4945564ae229faa128a214335aa91e552e34bd83d8cf2d7f993ba85f3785957ce6d510ce754122 +d8ab98c5edb24361b663dfcd536c0e8fa6f8f1b592c3485025d9ca93950f6668d45adbd13c6080 +652a5abf36da54779f09dfdbc3d676045d6593a3b5fdfd247afb5f8598bfbacc85109dc162f584 +5bb10cc35962c69416a3e08cf90d80bbcc3e7327d090fb6093644e4664346cc132d26081c1d90a +00cdf6ad438ff32acb23ba5615f432d266723e02f58e506c6c712c22965e01b17413cc9772df09 +86d37ceb16ab8c74815e5a2e9abf6a2174c7595ef44ddfbee56fd6d2ef863b4242f0b18ce448a3 +fb7fa0c196c6a2ba6946a98f2e5990c59efac14b8f1afc93cf67445bef35ad0d02999956b690e3 +2cce52671b118df8a4ade5ef0faf91c725c0d3d9a507cb96c1bdf2ed7ba88b286e10dce55717a7 +c7aefb7cb8f6ed79ee02a10fa81b0f166a5cc099337aea3ca0e3ae8c913786b7281f502d1671d3 +62f08ef104e22c14cb5b76633331786dc234becbf5065fdbbe4885078d43e18be29bad865b0ad8 +610decc2000b7094dd66e60ed379f4ec09fe62d6527bc0259b52c64c3350a0602a27ea6edbe5b3 +7e64677301f26e5424c4ec2227ebda1c2ec113b6f17fc736a945ad1ec770161fa135637e09971f +7a86e8175a82a82e1627fa27cd1852e0544739665b43564495a9f6fa7e460a881698b7fcee0e8d +8d31dff340f8847e11d53e276423f3cd3ca6cbd46feccce37891b7d01fa50f472924e42fba1a4c +59e34c674bb5aef3af1b574b318525678ecf72020ec8db2a75da1b89e990fa6a0450b5ae0a4d87 +a0d5edc8c4b83b7c45af21cffd544b9e71b68999cf86ec685bd3de4acf886ff0ccdf9ccb662c92 +ef968b219843708bd979c308dfe8958ffa0d81b4ec770ac6c024fc80f4c1e3b526745195754a42 +eaac4b118aa0e5f9a3582a47bd21bf8ff0dce46bc2cea77f74a0701ee0792d50a03951821a2769 +e904e2ba8eb38b58a34380e6842a31a5432041585d6e5345df42b9f61688bb32506b8585e457ea +527354244b9d1dfe6414c54379794bb53f75a594147e70a8a4fa5541e3de1c060d7f464d3e5f28 +86b9d1dc713086f50ee7239dc30edbc09c66dc474a4095d8523fc6ed58a4383d3c91239b818ad2 +e0bd1fc2949f874dcf2f8d32ccc1f19a6b6708f527681f87c252cd0e1f35c786d62a8b4560cf99 +ecd7d3302355237e9b236e91aa76c17a82513316afc2fe509ea03a0f79463ec4432e4bfeb70f60 +3adcb299a8d9998fc80c656366a15be322418c8de6f4b5953e170609fe61ea36c3b80dab055443 +e77e8232bceb0fe40fc3774c465e7ba2e867204895a939addda4c7f8baa794a682922580ecb60e +1f019d6abd81e43e7901a45bbc8ad4c9bbe51cff7dac8ef9a584cb1a4bcceb089d9e255a50f086 +89cfb53ec006f39a8b54177e938e5cf853ca526df863c25093fe0f2f5404f71dcf9201c54ee93b +edef0a6338d0854ec381d3570e481b00ed9b8b2cc643c0c78b4afe0d41d222e79e006660ec133d +4a28d4a1117400842e0ffc4336104e1a28c1558a9d1d021ef26a883babe54cbf2f0d6646e4a270 +bc0aa7e0d3af3475c8a3f753ccd99326d74d5c7da9921b040427312c74c46eb4b68d97d798a6c3 +fd359e67c11207d8b10c2da5756507f2b0d4393f0d6f0a6bcb59fd36b31ed4f6befc12cce1bedd +4143fa6bbf62b02feb004a630bf5322573ec2ad3dae6b969abdcc72d7322c72d54f1acbd5009d4 +0577eeae4e41ae0c9337d4bc98f11555aa1bdf48e7efbbf4841f29181555df6f2e45c014f954cd +7a33a9d6ef8a5937eb9e2e0735e531e1271eb071e9203b643cc7b0e87903020ae27032cdd83338 +248fa24c7b9921e53d5fcd7b80540fcd5228cb26ccc01201f2130106faff96dfa9ff08de5e2e12 +d0110bf01f2e14562e1114cd3059322d16ac31b25deb911b4e1c3eedcfc792688981483021de41 +0ada3b3853ef43b6f1102bf6f10c1e4344d3ef4e36004b6acdc95d9c41bdbec1958501560080dc +85bbce4bb5080bd1bde1be32cd52ea9a7c868ca3d01f7a838156da7035bcb781855f939539ea62 +eabae3d3d1e25c27e54aaa10bc74a5af5db40eddb60ef60b33d73acfdfcc31579a65b9f0fbb799 +e584a35fa33134a7122207d40dbd2ad29d613a646aefe020077b80d330d170f674950e877db760 +b4e252bcb1fe7f7dafb5f6eaea4e09a99a628621014013d52089cb721097dbd897d27d6717d53a +92c1e11c903da5a5b1abeb1ecab75a03fd67f8a815157461f2933d39762f1f4598475ef113a0b5 +49574d320d4106cf45aac7d1bdfa6d88db48abdbf5d2d0df10f56001cbc5af1b3ded7cd411233a +1d4ee7a727c4096df37376e220b32f06c16533df3e80be8bc8264a869676966418a183b4805e5f +eb6bf898dd5169aaf084222fc6bad9e652d0927a18933ed9e577a0714ea7a05ae4aafa4a318488 +30d7ba321429e950ddbac048e8822caf7a036aa3f9e9b15b5e099cc05a9126e194f41b9c1dd893 +754fb5a1c276c583c00fc740279a658eb3612d62ddb153609f2208cb761d963da2a040ebe2b8e6 +235589709b65d32eb73775a77721248f6ac3999b3766c98aa313f98943ed567aec3f0ef2cca4ea +c94e2b507fdce890b42ddee560d64e411e20943e16105f6438b749292eef7d79edeae660a6411f +4845a851b09232031d8e3435a5ac79dd6b227a8722063c6dfeeb6ef0d3ec6ff1370eb04856c7e3 +ef3b2e29c54e7fbf7c5f73736b71029145375acd7e1bca48959e42de232b0b8acada48a82597f4 +668917c7f95984938037974ab763b132c9f71692da966de63f50191603be855c1062c4dbccd685 +579d76adfbaa7abfe3ea6bb0693a8e4ebe98e222b9dddc7b5c00caaa52ad4d2d275906e992f9e0 +5b608246414b3e944b2835d1a7a79cb5fa2f9b04edbf7fc84073fef6de04f4158fe121df4ce9f9 +a828cfe8e09a5c80141404cc220b2492565c5d3f24fdf03570ed0da8d729d7e8dba4dd98111d62 +0de366f47d61c1a538d89e0bc0a6dbceb6105a45e9e2ad4e64924abdf7c765b72921dc524e7b68 +7d2dd93db6c721db754360384a227ad94136b61fd0c9fc317a75f71b204ae0a1d12bfca52b12a6 +9c77a40028b1db87c7c276a37ec21a4093f304bd8e3b7f0aad86ce3b32ce1fe568beb0e813ffcc +947f0a668fbefaaee7ff65cdc29d672cbfcb74712c3938b6418bf4855b615a7795153883a56058 +fbdbebcd65cada5d34a61d70cd617bb515057020d51d1371fbb261e63e6c23540cc9e698c72444 +e85512a3a8fbf302559e325df1768d6728be219a29034ca77d63df6f6c33d01b7f6aa1e57b215a +e09a4afcfa3de019d248d658dc0cadba830983343b1f6a0fe0aa632cc9d8e63f708ce4913c5ee5 +54c63640e25ddf5f3b367e903158c2a8417cdb13fc06549f626022dc215e337a6c2340475fe7cb +315f8731d69fe05517fcd1c2a38c8420b80c36a46f6325c15e51a9bc975ce2587501c1cb0e2aae +d78b597281c3c3e7310cfff0e3c85765e40c1296c519bc5af94fcba2ce9921da3cfbb167e89208 +8b08a5ce362317abb13a9b56c345ca242f0d9c56aaec4f3697ced94b2756a36d46e24eaeadf171 +b5c074491b14455c19f20e6ba055f05c542bb6b7c3975718bd9f657861e5740e20c97a3d25edbc +d40ce7ca5591627dbb311e3ac19501865de39059d570f1b0af793af5abb10837fb24143d1d1a08 +ace4655de917253766d45df81384535d264d4daa41fc32301996048b7eb638ae471fb2362518fe +c11b39fbd13739c5617bac3a589b56eaa5bdbdba70e6c30931e978b15b5319dc1c62294cefef9b +54467d179c3feb9f02df8608b100cf4a5425202493fed90e9ae277fbd14038848d3ffd8165a747 +dfbc54173f49c6814b41088b980c1bfe78fa848e075c6e3a2d62f25cea02f48604531d65b7a1f9 +8f34e19093a6a8d732ae2bcef21ba428097c7877c71a382f8303b38672bc99ff02c8bfeb06d903 +91c8eefc1c9167994d589c2be4af8ca721e9764345e24e2ae1582b38b458eaebff13089b12b850 +28d07872f48fed6d108e9e523b1ba1ccb2f853161b1f32ea11092eb751b9807cbafa481b040870 +b95bae5fa2dae352ee14b739db6d6e5d6fc12703ba6860921df2dface3d47f1c2a29418764e4e1 +69719f4ebcb96ce64e113f071f3cb594758ca871491d394f8ec24f96cb696c6338dec2969b1167 +542c174f34e1ee517380605a8a511e7af70bce113a6a70ca855e5a1cfb9429063541f579121fcf +a7eb18b30b39df61f89947f4a629a63c347d512dad1e9d80d582bead23df0ae3e92d38e3783c97 +70109a2921835144408e6f284923d28cf3c20a8e023ae9afe169f579a44cb432c0b91bb48384a1 +6ee743795014d1d37e81d3efacc0a59b76c102ee53509e0d2562452fe1177854f96f26f9e94644 +183055b8906c9a0ac65b3335b762d74606b04bb418c17c38b7b41c5bd73ebd2ab30c8f4252a8d2 +78fa9b7aaab007cd23c016c415594f973a9a83790f5ef5911197d4a20b638688302ad8c179e8da +15a08862a50b2b2165a2db724ffb9107ef6eeb2648a0c7c2693e5778ded2e72bb995e19933cffb +d7de74627218386899c302dcb969dc37d5b454892d7032880ac41c3c5f84a1358602e4d9872345 +97a9d11499b1f56e8139a214626026a2b5ed9f240435350a8061a3d6471a1f70f9dd154b11b98b +6301190f77b3dabb9730c4539a8f39e56c9ff29635a0f5d6abbd3a1cdece80bae849b76a5d8d4b +46e62e8c7e5a10b6e3f942de4570ba16eff5f6de2bae4dc4f3183f061ee50f7f25df683a742cde +2ccd2a72104cfe3f9bc757cc05714f33d507264f7835db680f4a2eee60f153829103f9ca4a8e8d +7f1445c991bc646c2a59a6afad1f5976f5d95251d2770333efd9a24326c1c2983315f8958916ca +c08618bd470750e5cf501740b09b6f270fc47a4700af5aceb1f60f9e83821013261be7d20ca221 +758b262fe2cf0d55fbca06548ad9b4a002b34381fd80e4f7934a7f00ca913e81b5fd91dcef124f +d73991b3d28f9de813a540dcf089679f19d3c42e0aade5463ed47a84c9335056150d56b276ff99 +ff904a25fac4a434045f61e01e05760325a1c0ea62aa8f8bb0022ffb83ece29e29f8ad9e767ec2 +75b440f45f1f9505d8f4f35ae06aa89e04f1e6b38b64339001286cb9d4b3d2702e27457f8e9eff +efafb11dc8b20ba86ad21b7026a5479c1015bd2159ea3513c4f3fa55a71d42c573b96960d398e8 +fbe9132005725cac8cf485a580ae949d0b79ede5a0d25ad89577d345ff4890dc66b255a5567e0f +92c909ff90a78e16179f66762e3dcc9273bcb23af678385fca0ca7557c1c345f1f5df3fff48f96 +e59df0d56923497ff7a791c6ea35c827730e3b09e0bca80ffd9ed44f9bdfaf6b277cc96f5014d2 +f54790e7f0f43dfd197678e5538e3e4ec7740de286d079db6b48925211033e1db7af4fc2b0e08e +25306d5277bcc5ea326d6460455b9c17ba739aa226e5184ac4962180df22e480cd063f3481d618 +9835801cb1a465b627a15a53dfdc1ad2450b3128498918b26666dbdd913df039b9f393754014da +7c7dbf4f4cd160e6290e57d24415c602892843dda447b11c2d76549f70847b80616e6046016cc2 +fbc6fc2fef354ca4cb76bd174d77ce23be60942d7e677998edbd014fe4e40f662c9de90b5bc22a +24dc8e4890f2d0d27c6ac5714f77d1c51d85f6de7dd73ff7a5f12ac69b5b4a91195f96674e639a +281796838e22dd65afea42123acdfbe01f6e368f9f199007375d6f466beff2d14df5a040bbc107 +0caa73f8713574037d2d4e10bd551e8f235f0ffe57a74619f936a5f6c79da62d6d9d56a1f36ab4 +a0d2389f1c2e3b262cfcea1c17b67d1432495a08c8ebab99c951595f4c17fc249976a66a5e6362 +e05456bb64e4d84da9146e816d24148dd68ccbd3f0a6d550f239566361467eb1033d0a6d84d73e +9988fa01d3623e0724f8ea61aeae7abf0bd6e1de5f6573f0c435d13d4789096edac3b49ee70987 +f23570e10ba8b67d8d5f22134854872c13010fc621ee3cf34670e562a049da9d644d232b416b09 +6fb726db767301402af153bd5c4d746f423f0708e58639bffb1c958cd594aff8c5983ed16df7fd +db777189002380f8777d850770381eebbc2ad21de7db045ce0beffa404fe69a26a57c8d2277876 +5a73047498d5597360a6b0d1a9af94b2b15292c36440a8198e41ee7950a169d8b12b4b17e433bc +8af9437c9b17098506e0c54a4d95cbc1550507cb7a5d7883a5edb2696559744c130a81cb5f1e14 +25f3cd383c5892fcc9429e2bbefdef1905486200052dfbc23e4becc2092b3de460d1da429aca81 +71cdfcfab8f0acc297ab0d1a43d21ef3e21973bdffbefb290f2ab1364c79bd79b5b8c0925ec8ba +2b260ef5f34f69655f6c7cc927fe718f52d5646e9d6acd4ef70d8cb2853157014d1674e087febe +ebfe490d7a2eefaaa43a2ccdffed19f19e2ee08407f379f3c6df5a22f76cb0fddb259a1512a97f +01e0f5104884d7182d33a970b1723b31485e6692b21ae3fdbb49766deb926d60e6e85ec83fa8ac +b89bef5e47c789b5dc32dd0e0ffde52498ba5e16b70e13d46a9a7b6cdccdf8f1fc185b85d75220 +127ed19bc52c37a0900467eb745e3e4964f928b59e9425d32eac1b783ad3647f7e30cd927d7f98 +5714b67bfd035a2e1915aef2e724f3d43066a459e4322fb4a2451ff65a072a6d54b6165e5a4cda +945dce1534960c0a05a1cc476ece71a31d99d9040c80999da017f39fee87aa220b01ba259830ee +3a8511b48a13b77d1952dc39359ac7480c14bdc5e979918df01fe8c0a54981e3daf22988a69b20 +da390b53c71a0a680c524fb3eabbe15c35b295c9234633393317cb875d1d9fd3f517b75e2279e6 +b55f7e7c91f77cc2ba279c7476efe63e89d51d1f65d0db13595885d09c832425131dac5ece41fa +76ab3fb81ba6875b300c43eac7ca19e0aba2c2abb9dbb7294a9faffd73995826dc8530f6eb3f97 +1564878347fac82ffb51ca2eae1c33e6a638c824eef4f1a5d338cf3676e4e7f745276dfb339097 +ed250a32c1fa0d1180b1d3dcc392582ff4f3f9d2ec95070576e9bbf3c65fb490d9d63ed2e127f1 +01cd81f2913647bb7f706ea676e3b325dc1be29aeb4656a9671e23f20e8cc3faa48c9655a367dc +564401afbb7af29460e9d38237623bb923e06ac9a1a850da9b7ac1feee5b8dc0ee2b489fff40e9 +b1e94b8b84df49754e3964ebd95d78d4da5fe12cb5176af8e2b0f08914287e91cc5862bf9bfb3e +4f2ac67bbb886e3448548b892aa9cdabb9a31d264326a818f9c625a007700547c39ab44c23947e +3607b1d9d66f5ea491450fd1452bd0ce59023bb52efd3374410bc7b60a7d894b7d5a09a12016e5 +b241057cfe03f6599b51ff416fe8d8020d71c1703fea11a9ae4cd5a1031fe7e62c7ff736c25a03 +7bdab4e6e414531fd022ea2614654e63f4340ee5ea7ffce0141b2f5c45ba6906136000d02dca9b +7f9707edef541163206dd366c2430102401fd575caeaa480f411afb7f5980aedee47be44512546 +5ead0d747055a75bc903d53e80f4ce800f5d67dd158990d91ef3458634159e43cc7e275063ff33 +5cc8fe01aa86703d42b4c1064dd8a84167345f1d461a1f87606cc686c76389eeebbfb483eef9eb +e44baf29b4c1a2e47096185b8338472a8f1a94a91c679062c0faafe7bf2f029388d0d683a1700b +6394e4faf06e5af001770f813e49030bf702f728eb065ef465c1e9f13faff25a4a47ea07ab869a +b6f0f790142b6a0454f6b6757447953cb92c0beb5a4eb3f0a922f2e44665f07ab827bb2cbe7319 +9233fa5b048d29564773e81dccf60846e4bd857bf3875f2e79638250e227fb0b8ce80188870594 +030b97021665cfc6f3212c6703602a6b5bdf717a81a96e38e554d715e2949c230c79441e83f8b5 +4e58726c1de83264c31a72be2b0eb98c663ad88fa6a7a2e16f4bb2661938436a1b3934d76e74ae +f519bbc78cc977bf7edd77a441088b7c885ad7b0a7976e37f45d62d089b0a7d086cd4de86ed662 +b9d8010b8bc8e164eeaad11d8ad996c6e882cd824599a22533d1efd052b5cd9fc3a5efc611e4ce +2c4c1a342f5cb4e1eeecadb5b5c9883f54396b118b023421e48cee67a34dd58a45a21b880e0779 +c9dc637d78956415c5f4fdbaf530a55126a659408336b4b25ea132575796b36cdb8a657922331c +f66d459036fd6a8d10d39d9d7abefc8f624614452bbdc744dafea6225ff9dd6f0aeb017aa8f567 +2eb50f8e82a6ed80260b51cd7f19e7ff05c23c2583a8dd01b377a91e7e39c71f0da015bb767975 +20df5ddc2425269f99d33dc2cf60feb54418ee93210dcd9ff5e5d82f99758fafa8fbfeafe56e02 +75b4fe335f4ea2dce58263d0c3df59b4361dce5ca5b2d8a08a76e94c25dca8496b31825c112d16 +bbfda27ab03306a40879b164121c0018aa96f189660b053eaf0bd03663f976faa6e6fb263d4d48 +ebec3debc5dcf1e0eaed7b9402597d79e491750b2076f668f4557964e2b73511abd5c028d96a02 +1e82370f6c51b76e9dc536f6e557268777faa2c7e7306bf077861e650167f6e7523ecd525c5701 +4b14dcdc7a0d31f76ef8d5518ec3fb14e2cc3401325079a23fd6f91809343e9b3d0c347b56a4a9 +9d759e4a965b339db7df1a054d9ca96d2713aa412f083d5284e05c3139cd9ecb978725d453bbe0 +5310448b4e263691d414f62512b2ee3bf50d589bba13705785572368dec4a5d94f50f5a26172af +0f44393302812948e5358029cdd53b87017b69a3901a9c7a27953e8fa81f41a8d03a1522f91eca +fed281ee0e7722b4263aab2e4a7d5705839aa7bcf9057948b36c6a26caa9308dfbf7f955edb94d +805a7f49ab51cacc0a9bbd9601d5088a2845989e13c388676389e36701a5d7d9d89ee8614f9fe9 +df1c3793a0454b7a5a91d7b0f0aabea3a94ce1cfe2c480e6b8ede4c8ba9c235a2cb1e28fdf938c +6c51a3a3a28e7a80fb2454ef057107d8ccbca1d32ed45d64422f7d15b81211df041cd668a3a1ab +1fca1abe17cf4cb1f3fb88be6159b777797f2082209d8fc2c8b752145ee7168ee6d338ccff0bde +30a68491b706582dd31a4c8f07e73f1b93a7598689a69ba9f30485af7d164ee57c2e8b79f03603 +59000d83626921478f4733cde7263c25b2d5f0d910a2490057bb599ebab933b0db5a55dec80780 +93b6ca009d1f77809302ccda480c1860a88cf1ae85cc38890dd91ba261642c49670143d2fda7e6 +a463868a288b4883c29dac66f5b74575afcf06680c1b23155ae25e22b303eb6f8d9da9e1e216d7 +cc86a854700dc1cbc59ca158206fd9cd5fdcec227ffc20ba2f8563d34a71b8b32bf81ace6be0fa +c00a262cfb2690873a2f3b132bb950253eee7b6e62647f71e056225055cccd4e4bae19a277fdd4 +a0330f85db2110381faecdfceda5c820e2b0b22bd2ce5e65477f418af4d3df07582574aaf6ebeb +b781887e7bae86d0ee00ea33d84502f6da28895010b6a25d60dd66516d0ec4a7293e9b52f02b3c +bd2acdd1f70d561996592a7923f0eabe9ee8212638c4014ae431e7ed1b080794bf44bf640de46c +bc3ad8118f58cb3dabe9ff2a6572a1d8384d922425afa46f8ba0f01955164d6be9a2666328836e +c1e63bd0b741ba1e8c247c2e8dc86502287a57e0db57a57b2c264348d7f0ae23f2f287939f13b3 +9b78b3676f2e84dfeed137f0a41d9c44205889498dcffb9f7b77c8b587979e94f0381c982ba947 +a9c1d4b19ac8eabd5e8bdad55849ebc7e9e600bd11c5f9a9d7fffd69a274a18683dc69632a8d01 +8c181d95b06c10453a6abebf6922457fec592b99e4a96a8986c9b8416f63b2ceda5702028cbe9c +2917c3312340de93764166ad219081df78a1edfbabb9f4e2db16118368653733bd57c9e25bfcfe +282fae411e126d4966366271bbede5da9a48728de36d4fdedbee8985c24ad3aee0ab22e45837f9 +e6e22f1ea37a784e6d174ff3477d7c236c6d150512727b818549036078e960deef47daae259360 +61b9a8c03aee7984965b5dcce066e7b5b359735007d7a121ce6302cb5918cc18819ccfa0b17c00 +a73743bf6aed7eff15aabe1cf558913ac4c1474f7e6fa6ded48aedc460ef2ad767f47edabc2e9e +f390752eea5b3bb9573e9ef08464d4b9c47203eada3b3c247e987a67c7fc56b54ddc34515c31fc +1e18365c823091d75f1482a02088c2f139ccf310c72d25ff4a75351eb6dd345747945cdd93ec0e +6cfd2be6c942a5230e39d62d6e4812e137836f2a683768d63685f01a63c37dbc823f80ed37923b +93f13462171635e8b4bb3a5ef547b84105db78046b7e9f6ba8957e8e35e2f15c02aa49331d6e57 +8f2ddd75ccfdb7d73af3b8cfc48069d0bf81c1ab7f205067e0b3fdb8dba05399800fc3f01d58a0 +ce8ced16b2674ca557c15b0f597150dbae4eae3409ed9dd05639b9b52414d7c8c731048b00ae83 +b239c116d836aaf6c54928550cab67a24a7a6fcbcd43c46c343aeb63898fdb19e42debbdd3521f +46fcae9049d3354ff5acbde61e5377ba75150ccf3087427c154fc8b605c1e3dbcb2197fce95b95 +c7a2a3f751f48440a30a6bbe46b973b88454388e228121d03064aeac8260e72601a9f4047d7794 +359eab6e32d59563c2c49f44d059d6e328051f0bfe44ba538572f0a3184e520001d355af4f7227 +f31f533051711b7395d0ee6d5799ae702922dc89ca95d537557a1b7d60f577cd8f0e5fee34d829 +2c9d582bb3feab3548c913003d9394567d3b85fc358521a3a862579688be6c3188daec46336391 +2b7046205f979eb21b737e85211680c6d5639f5a16eb3653fd969f084547f509cc37406754701f +f81359cc1ca82e41747c2c2eb61f2c40f077dd4dd56e6c0f712ee4b4de768be140a47135d38ced +d9214deda6068da169f716f65b1c9201f86fc3a5ed7cb9f14e73f39cd1105666043776ce171f76 +2a31ab1ca4d610715211bfb8fefa5b3cab7a7bf33ae8590af88a1247d5bc720d622ae268893daa +62743a577c6908d4db046532fc7ae6cc3ae15278ba0498bb4813618015f01fad8c4665abdaa0a1 +5c1b1ae567bef5a0d9c2905944c1a5a78d59fd940f2f6d08f3302577d70a7b4d39afb424235791 +f9fddfe88b9fa8d2be4d7c012a94c8d403dfdf44d48e34280d9a327dbf9d7e4b128f1bd70254f4 +f6da92998d9fc702e1695956f87921ad8af75a1a81259bfa985c2a53effd40b881e0b3714a2454 +ece15cc6db4ed531ac65cf9bbf9fe7cd60fd9bc729fae104e7c8b867096b5cd5b3f3d437bf8765 +90c222db6a2231f8b58622095107c2c57c5ee6df2fddea548c893c65265295c41d1315701d46fa +3208a3e87c5f12420c30609f9758ed81e5e1d344db3359e85fb823aaa9309b97f479fd2b935825 +2ad12d6954ef2a729f9d10b6cc6a111a6c020527bfc685ae087a1062b564656f9b9d4723fdaf9d +dc7410e2dc5647a5ade74c0c611abd006138df07e2dae381bee39cdb6b24f6c273736fda0adc62 +8418568157893ba7916866e7e2a6451651825a5dbcd2811163a1a8d047a3100b739fcdecae7e5b +de7e9019648d35370a5f70b944566ce1bdd136a8c3f9883c542997cb195e6780c767ee8ac0394c +4445ce19268e734949d51d642112ece9291b3204e4351f30af6b3b5c5b08a2a371a51f868b305f +54ab2aab660cb8328bcecafbe87e5226f4f83990fb31c424528463b1c806b5b74ba01374d0f70f +6e3269593de4230e4061411918ee1221b58e3d3920036e114f8c8ee392bcbe78b54e574ec2d573 +46a06dbd8aef1b49efbcc0688d7f9767324124886fa195e86a757f651275d51016fdee4155fbc0 +501e683efd8779a29d510edfd1bde99e86cd03f5f171b05c720640ca10919b0787da963747a3cf +c2f722419b6f8c7a361ca7768c8c804861a07874b681ffc266e284c683505c1ac948e9312db8f8 +33ead8243171e959a74dba1105de9869d94dfa578008dd30e994c5b2107a90cccc52e9c7b96a4b +8b36512fd8442f454987979f59fc5fb2d7464a0501cb7932413a379ff8fce516d20286ec9a86f4 +52c5e1ff5ea907cc6882b58952fccaad4291eebe3a890f49da5b4cff04e006a1c18fb4a95a1958 +decf0c84dad894c3b355761e7173fc43e44de12d4d0c0e05a61f1daa64288170d17da7777950ec +6c685a1752ac7d555403b80db90abce6335fb9916957bfd2b16e8c9c114cd0b95409c9bbff4f10 +6d21cb6e267f6f4a8883e4831c015ed6ef7fe4e8bd20ef254f7602de028baf9c88c62b8323334a +b5b7f4cd68d03c2acd95ddee88a0ef26199a9d6ba435a96a91ef55887aa4870468dc516ffdf1eb +12ff797d8fff0f6e5de2afcad81614e3bb9fd950a5db3b6879f3cedc9c9c64f2043c291867a594 +c024d571eb0f91b450f183b3fc1b7fbd31bb9c2610794855346726de64d3367cdfcd0470f35f45 +f86d481fb94dd2faf6fc2e93f2602822c8f7c94f2a538fbc3ade59a5a62de463c1835d9a74ca0b +163ffb7fb8de8f658dbeb272daca86c431fef354af +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if + +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 6 5 257 172 +%%EndPageSetup +q 6 5 251 167 rectclip q +0 g +0.8 w +1 J +1 j +[] 0.0 d +4 M q 1 0 0 -1 0 180 cm +37.602 139.602 m 31.602 139.602 l S Q +BT +8 0 0 8 22 37.44 Tm +/f-0-0 1 Tf +(0)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 118.238 m 31.602 118.238 l S Q +BT +8 0 0 8 18 58.8 Tm +/f-0-0 1 Tf +(10)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 96.801 m 31.602 96.801 l S Q +BT +8 0 0 8 18 80.24 Tm +/f-0-0 1 Tf +(20)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 75.441 m 31.602 75.441 l S Q +BT +8 0 0 8 18 101.6 Tm +/f-0-0 1 Tf +(30)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 54.078 m 31.602 54.078 l S Q +BT +8 0 0 8 18 122.96 Tm +/f-0-0 1 Tf +(40)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 32.641 m 31.602 32.641 l S Q +BT +8 0 0 8 18 144.4 Tm +/f-0-0 1 Tf +(50)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 11.281 m 31.602 11.281 l S Q +BT +8 0 0 8 18 165.76 Tm +/f-0-0 1 Tf +(60)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 139.602 m 37.602 145.602 l S Q +BT +8 0 0 8 35.6 19.44 Tm +/f-0-0 1 Tf +(1)Tj +ET +q 1 0 0 -1 0 180 cm +57.121 139.602 m 57.121 145.602 l S Q +BT +8 0 0 8 55.12 19.44 Tm +/f-0-0 1 Tf +(2)Tj +ET +q 1 0 0 -1 0 180 cm +76.719 139.602 m 76.719 145.602 l S Q +BT +8 0 0 8 74.72 19.44 Tm +/f-0-0 1 Tf +(3)Tj +ET +q 1 0 0 -1 0 180 cm +96.238 139.602 m 96.238 145.602 l S Q +BT +8 0 0 8 94.24 19.44 Tm +/f-0-0 1 Tf +(4)Tj +ET +q 1 0 0 -1 0 180 cm +115.762 139.602 m 115.762 145.602 l S Q +BT +8 0 0 8 113.76 19.44 Tm +/f-0-0 1 Tf +(5)Tj +ET +q 1 0 0 -1 0 180 cm +135.281 139.602 m 135.281 145.602 l S Q +BT +8 0 0 8 133.28 19.44 Tm +/f-0-0 1 Tf +(6)Tj +ET +q 1 0 0 -1 0 180 cm +154.879 139.602 m 154.879 145.602 l S Q +BT +8 0 0 8 152.88 19.44 Tm +/f-0-0 1 Tf +(7)Tj +ET +q 1 0 0 -1 0 180 cm +174.398 139.602 m 174.398 145.602 l S Q +BT +8 0 0 8 172.4 19.44 Tm +/f-0-0 1 Tf +(8)Tj +ET +q 1 0 0 -1 0 180 cm +193.922 139.602 m 193.922 145.602 l S Q +BT +8 0 0 8 191.92 19.44 Tm +/f-0-0 1 Tf +(9)Tj +ET +q 1 0 0 -1 0 180 cm +213.441 139.602 m 213.441 145.602 l S Q +BT +8 0 0 8 209.44 19.44 Tm +/f-0-0 1 Tf +(10)Tj +ET +q 1 0 0 -1 0 180 cm +233.039 139.602 m 233.039 145.602 l S Q +BT +8 0 0 8 229.04 19.44 Tm +/f-0-0 1 Tf +(11)Tj +ET +q 1 0 0 -1 0 180 cm +252.559 139.602 m 252.559 145.602 l S Q +BT +8 0 0 8 248.56 19.44 Tm +/f-0-0 1 Tf +(12)Tj +ET +q 1 0 0 -1 0 180 cm +37.602 11.281 m 37.602 139.602 l 252.559 139.602 l S Q +BT +0 8 -8 0 11.76 92.567813 Tm +/f-0-0 1 Tf +[(Time, s)]TJ +8 0 0 8 114.829063 5.44 Tm +[(Initial no. of nodes)]TJ +2.516367 18.54 Td +[(1. Time without)3( failures)]TJ +ET +1.6 w +q 1 0 0 -1 0 180 cm +100.961 23.281 m 129.359 23.281 l 37.602 70.48 m 39.762 69.52 l 41.922 +68.641 l 44.078 67.922 l 46.32 67.441 l 48.48 67.121 l 50.641 67.281 l 52.801 + 67.762 l 54.961 68.719 l 57.121 70.238 l 59.281 72.398 l 61.52 74.961 l + 63.68 77.922 l 65.84 80.961 l 68 84.078 l 70.16 86.961 l 72.32 89.602 l + 74.48 91.762 l 76.719 93.281 l 78.879 94.16 l 81.039 94.398 l 83.199 94.16 + l 85.359 93.68 l 87.52 92.961 l 89.68 92.32 l 91.922 91.84 l 94.078 91.68 + l 96.238 92 l 98.398 92.961 l 100.559 94.398 l 102.719 96.238 l 107.121 + 100.641 l 109.281 103.039 l 111.441 105.359 l 113.602 107.52 l 115.762 +109.359 l 117.922 110.879 l 120.078 112 l 122.32 112.801 l 124.48 113.359 + l 126.641 113.762 l 128.801 113.922 l 133.121 113.922 l 135.281 113.84 +l 137.52 113.762 l 139.68 113.68 l 148.32 113.68 l 152.641 114 l 154.879 + 114.16 l 159.199 114.801 l 161.359 115.199 l 163.52 115.602 l 165.68 116 + l 167.84 116.48 l 170.078 116.961 l 172.238 117.359 l 174.398 117.84 l +176.559 118.238 l 178.719 118.559 l 180.879 118.961 l 183.039 119.281 l +185.281 119.52 l 187.441 119.762 l 189.602 120 l 193.922 120.32 l 196.078 + 120.48 l 198.238 120.559 l 200.48 120.641 l 202.641 120.641 l 204.801 120.719 + l 206.961 120.879 l 209.121 120.961 l 211.281 121.121 l 213.441 121.359 + l 215.68 121.602 l 217.84 121.922 l 220 122.238 l 222.16 122.641 l 224.32 + 123.039 l 228.641 123.68 l 230.879 124 l 233.039 124.238 l 237.359 124.559 + l 239.52 124.641 l 241.68 124.719 l 243.84 124.719 l 246.078 124.641 l +248.238 124.641 l 250.398 124.559 l 252.559 124.48 l S Q +BT +8 0 0 8 134.96 141.76 Tm +/f-0-0 1 Tf +[(2. Time with a)3( slave node fail)3(ure)]TJ +ET +[ 4.8 4.8] 0 d +q 1 0 0 -1 0 180 cm +100.961 35.281 m 129.359 35.281 l 37.602 124.48 m 39.762 126.719 l 41.922 + 128.801 l 44.078 130.559 l 46.32 131.762 l 48.48 132.32 l 50.641 132 l +52.801 130.719 l 54.961 128.32 l 57.121 124.48 l 59.281 119.281 l 61.52 +112.961 l 63.68 105.84 l 65.84 98.48 l 68 91.039 l 70.16 84.16 l 72.32 78 + l 74.48 73.121 l 76.719 69.762 l 78.879 68.32 l 81.039 68.559 l 83.199 +70.16 l 85.359 72.801 l 87.52 76.238 l 89.68 80.16 l 91.922 84.238 l 94.078 + 88.16 l 96.238 91.68 l 98.398 94.48 l 100.559 96.641 l 102.719 98.32 l +104.879 99.52 l 107.121 100.32 l 109.281 100.961 l 111.441 101.52 l 113.602 + 102 l 115.762 102.559 l 117.922 103.281 l 120.078 104.078 l 122.32 105.039 + l 124.48 106 l 126.641 107.039 l 128.801 108 l 130.961 108.801 l 133.121 + 109.52 l 135.281 110.078 l 137.52 110.398 l 139.68 110.559 l 141.84 110.559 + l 144 110.48 l 146.16 110.398 l 150.48 110.078 l 152.641 110 l 154.879 +110.078 l 157.039 110.238 l 159.199 110.559 l 161.359 110.961 l 165.68 112.078 + l 167.84 112.641 l 170.078 113.281 l 174.398 114.398 l 178.719 115.359 +l 180.879 115.762 l 183.039 116.16 l 185.281 116.48 l 187.441 116.719 l +189.602 117.039 l 191.762 117.281 l 193.922 117.441 l 196.078 117.68 l 198.238 + 117.922 l 200.48 118.078 l 202.641 118.32 l 206.961 118.641 l 209.121 118.879 + l 213.441 119.199 l 215.68 119.359 l 217.84 119.602 l 222.16 119.922 l +224.32 120.16 l 226.48 120.32 l 228.641 120.559 l 230.879 120.719 l 233.039 + 120.961 l 235.199 121.121 l 237.359 121.359 l 239.52 121.602 l 243.84 122.078 + l 246.078 122.32 l 248.238 122.559 l 250.398 122.801 l 252.559 123.039 +l S Q +BT +8 0 0 8 134.96 129.76 Tm +/f-0-0 1 Tf +[(3. Time with a)3( master node fail)3(ure)]TJ +ET +0.801 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +34.602 120.039 6 6 re S Q +q 1 0 0 -1 0 180 cm +54.121 120.039 6 6 re S Q +q 1 0 0 -1 0 180 cm +73.719 67.719 6 6 re S Q +q 1 0 0 -1 0 180 cm +93.238 88.121 6 6 re S Q +q 1 0 0 -1 0 180 cm +112.762 100.039 6 6 re S Q +q 1 0 0 -1 0 180 cm +132.281 106.441 6 6 re S Q +q 1 0 0 -1 0 180 cm +151.879 106.762 6 6 re S Q +q 1 0 0 -1 0 180 cm +171.398 111.398 6 6 re S Q +q 1 0 0 -1 0 180 cm +190.922 113.879 6 6 re S Q +q 1 0 0 -1 0 180 cm +210.441 115.879 6 6 re S Q +q 1 0 0 -1 0 180 cm +230.039 117.961 6 6 re S Q +q 1 0 0 -1 0 180 cm +249.559 120.281 6 6 re S Q +q 1 0 0 -1 0 180 cm +112.199 44.281 6 6 re S Q +BT +8 0 0 8 134.96 117.76 Tm +/f-0-0 1 Tf +[(4. Time with a)3( backup node failure)]TJ +ET +1.6 w +[ 2.4 2.4] 0 d +q 1 0 0 -1 0 180 cm +100.961 59.281 m 129.359 59.281 l 37.602 123.281 m 39.762 127.199 l 41.922 + 130.719 l 44.078 133.762 l 46.32 135.84 l 48.48 136.801 l 50.641 136.32 + l 52.801 134.078 l 54.961 129.84 l 57.121 123.281 l 59.281 114.32 l 61.52 + 103.359 l 63.68 91.121 l 65.84 78.238 l 68 65.359 l 70.16 53.121 l 72.32 + 42.16 l 74.48 33.199 l 76.719 26.801 l 78.879 23.52 l 81.039 22.961 l 83.199 + 24.719 l 85.359 28.32 l 87.52 33.281 l 89.68 39.039 l 91.922 45.281 l 94.078 + 51.359 l 96.238 56.879 l 98.398 61.441 l 100.559 65.121 l 102.719 68 l +104.879 70.238 l 107.121 71.922 l 109.281 73.281 l 111.441 74.398 l 113.602 + 75.359 l 115.762 76.398 l 117.922 77.52 l 120.078 78.719 l 122.32 80.078 + l 126.641 82.641 l 128.801 83.84 l 130.961 84.879 l 133.121 85.762 l 135.281 + 86.398 l 137.52 86.801 l 139.68 86.961 l 141.84 86.879 l 144 86.801 l 146.16 + 86.559 l 150.48 86.238 l 152.641 86.16 l 154.879 86.238 l 157.039 86.48 + l 159.199 86.961 l 161.359 87.52 l 163.52 88.238 l 165.68 89.121 l 167.84 + 90 l 170.078 90.961 l 172.238 91.922 l 174.398 92.879 l 176.559 93.762 +l 180.879 95.52 l 183.039 96.32 l 185.281 97.039 l 187.441 97.762 l 189.602 + 98.398 l 191.762 98.961 l 193.922 99.52 l 196.078 100 l 198.238 100.398 + l 200.48 100.801 l 202.641 101.199 l 204.801 101.68 l 206.961 102.238 l + 209.121 102.801 l 211.281 103.52 l 213.441 104.32 l 215.68 105.281 l 217.84 + 106.398 l 222.16 108.32 l 224.32 109.039 l 226.48 109.52 l 228.641 109.602 + l 230.879 109.281 l 233.039 108.32 l 235.199 106.879 l 237.359 104.801 +l 239.52 102.238 l 241.68 99.281 l 243.84 95.922 l 246.078 92.32 l 248.238 + 88.559 l 252.559 80.559 l S Q +0.8 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +37.602 11.281 m 37.602 139.602 l 252.559 139.602 l S Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/graphics/spec.eps b/graphics/spec.eps @@ -0,0 +1,735 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.2 (http://cairographics.org) +%%CreationDate: Sun Apr 17 19:50:17 2016 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 6 5 257 172 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font NimbusRomNo9L-Regu +%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.06 +%%Title: NimbusRomNo9L-Regu +%Version: 1.06 +%%CreationDate: Thu Aug 2 13:14:49 2007 +%%Creator: frob +%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design & +%Copyright: Development; Cyrillic glyphs added by Valek Filippov (C) +%Copyright: 2001-2005 +% Generated by FontForge 20070723 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/NimbusRomNo9L-Regu known{/NimbusRomNo9L-Regu findfont dup/UniqueID known pop false {dup +/UniqueID get 5020931 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /f-0-0 def +/FontBBox {-168 -281 1031 924 }readonly def + +/PaintType 0 def +/FontInfo 9 dict dup begin + /version (1.06) readonly def + /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001-2005) readonly def + /FullName (Nimbus Roman No9 L Regular) readonly def + /FamilyName (Nimbus Roman No9 L) readonly def + /Weight (Regular) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 32 /space put +dup 44 /comma put +dup 46 /period put +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 73 /I put +dup 84 /T put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 104 /h put +dup 105 /i put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +readonly def +currentdict end +currentfile eexec +f983ef0097ece61cf3a79690d73bfb4b0027b850f3158905fdac1bc024d7276e0a12b7ddcede59 +e3601ab4509dfe0977ed5bf624ebc1f818c45f1350d41b052a72743accb053eb06ed043568d319 +6a30bed220227e2a15bacef508449221cf338a8666e92410a9aa91d5a31900a93c01ec21742cd1 +4dc46bffa111ce10b78ae01abaeba7f36cdf79a4733245c63f6d36234d6b0961f1ac295d617793 +1b9ed554bb5fc6741a63c493daabf03d753c7d2b8e8c01e3e280898f810da5985212c8c0bbdee4 +e8ab9b22bea83671c0460443ede9be044168f8ab53c69bc49ad71a0547df6f3447fc6ffd34e2d3 +9ed48de6bc2089b6b5552aa4085f6c1987df2caca5508fa11423e466bf458fecda5995f25f0324 +14e6f58c6c59ce2ffc8c211b06d42d5a7b8a72fa665c59275415182aa8381c14ac61c786471323 +36963a5eeed481f9b51f45d790f579fef6f6027eae46127239042d2b16b6d1361b86fa7dfd08bc +82c364a6d545c39c36dead5411eb689b2f50c96fd178f942869a35f0f6891ba5b60ea8635b461f +2046c2a875cd629a9ebd077d8e8fb197aa8af4470528a6f71daca21dec753c632d273cf515faa4 +de0ddf08d221ad58c716869dd0bebafbac5ac5ecd59d904d0e5945dffe802f30d4c3d18e64f593 +28924caf91832420f387cd6e5761c589c4280665c32eca518a60a0690bfda35df9911050e6cebc +d48090f6237ee6070fe0a47be80820fb3c0200e22ddd432fa006c0a4687afa406cf2aa0d45e77c +b2d5a436342baf07e35e65b72f2683cd2e1065b4b16cb42c4bd06c6d814975fc77063df25dab93 +459ceb04bfb4f66fd36d907428db57278b68a763f405b1156fcad7e27686b6c3908df3b3d83c76 +03ca5ebfaa2b9eabe8e6fb747b8ca1268d646f46dd5e6dc67435654dca97e30c71c4f463717063 +c5f1c6a85482f677271ee47383bb9cd3a11c7fbf5cf708c24fd1c879a2ffb67640865bc36d08e0 +898faf149794e9e4205bebcaaef0646103349eacaee5ceb5db05c87be2a4d6eb6a752b3bf41e00 +125f0f55bdd01e769c06bb93c67b95d3c02e25d76c78ed8c63a2f05cb7a85f1f7593e4bfe852ce +6a7c07faf7171616a5a8bec8c453c2c3c22743132bc02c2f4a11de7e58e31f3734f94733b13d2c +7278e41d6db7deb9214d00c66e3eda6680b9965718cb56615b3613bf2a19e37dabf09d1216dda5 +71e79c07a3accf8673702928cfdeecc81b2a0359b2f927c2815deb2a1a51ad21520c2d969f8c7f +3c67631418badea64103c9777237f7418fa1e4c9034e3af0fc85fa63f6615f5ab8c473404fde7c +b801cb443e03c4f3d52c1daf37bb0952873fe67392ee576dc91c291f148e2df4310325fdddf02e +5499a2017bda7960ceeafb8a581caad7d1e87e63d85dc99eff45fd6b8c9e83296b0307a987daa9 +398547381beacf5338d38d8e008bb8327c990095f805ffef64490d4f1e9f89eddaf8d60e81af47 +79a7c386552c2ec1f2397b36992f8eb492c23bd50e967d9126aca191048973bbf708a9e6e0d742 +736dacf5b09159fecd6e5b679c0cc507f2f479c150e079fb13f7da493e8588d6834d7e4df9efce +f21988e67b79f5eab2c00ec0335fbf5ab821c88024725ff83ee1708143489c69009fe16657e68d +533037e0e7cee1d3b132e4ad03b876d12a04e52946be29a027e2dec925faf22db3c819a4978811 +75a07edcec18c28f2ab11c07aa2749e3e885f7dbadb8021fb24656c1c3acdb6232c3db1d353c1b +0ab8e2f252ec70527aec582bf99d5ef1d4c43253012b070333d465a4039769428617614bdbc829 +0a7af5421dd3071e112d6b64f78d956923a530e3c0c1c4120d65ff13ac7cd54385577cdcf77d63 +ac2dcdb8e467609de84d142abf564b93a80e2abddeba49743424dfb6bb1ab386b87a7657aac296 +08f6156642c9b46f9efde1c4963cf919780124a63d6f86bcbbbe42db2800ae2a7a358774efedd4 +5c96c9816b046fe44ba12d853067c01deaba7d23500443a3530075e9d41d0cdc73a2f7d31ddab2 +ce734fcb918f9e27eb37352d5d4b42112b7748eca670880181d830ed35141bb7e7134a353726fc +a3dbfb50e6027d821224dbeadb2d8909fabd711753f0712c71d7c4193257f33db3388db8cbceca +89a0524843b46815d1baa04c3308c33ad99d4f4d490b34849cb91dfed06962dd67e62f0e2639af +b9a9f3a33c59e317a9600a0cb01c2e6662d82e2b257f1f6c07fc7e2b0b973b74948aef6444f688 +3c1db3f518fef3274eb38a260eadc9a22bef425ca6360e099b6175575a4db1d3ce6bd22c56e81b +a0a9b57448d847eae41816a59e0b7c6a93be20e3caaef6667920303aaa9be83cfb57f2d7dbd928 +9f94b9584a0596b2a49c06a582965019446870e6a7d6b1fc20d9b6dd0d9a6fcc3bae71f926dd71 +c9ba32dda0a065379d10d4ea820c649b306b09912ba9bfbcd90a5b33f753deaf16a6ae74d5d97c +e3c2912587c6ca0022078ea689c3fb5363c993b7c7c255fa5de668e1094a881da5dd7384e8079b +725b1fd175eff99d567c8680e565a17ced65952792a75c2d4b9d5d69b8f6d987a7be6da9e404c4 +21b41a7813223bf8246dfcbbd6fa0ba8b7ef1aa08b494642dd3941137e649d17f31b1f88214b99 +e6b34dca411dffbc3ea9299f675f3ae7129196dee244fc629001b03391a861e4d457be024a2838 +84a7463f97e378a96f3623f195a854913666475563f813a774ff0b2bc3436cf69d4bfb55282ae9 +3165088e1e2bd1ede8ae9f0ce65bcb4ec48bf06c5d17b78fc9f05489d648286bd61d7ebfd949d1 +94798119e95f438aa8a48f43c0f43d24c906b737c98f7a1527f949992fa07910d5c1ac8a0f7091 +8eaf52d45fe82b10cf5b560cd06df291a1793f9a355a2266e22a68dcf5d64d93d3699f0c2da9cc +2b3777817ca130c41d9ccfd3e7f44dc831062b6c17388aaa6bbd48a22b13487f02908ccd6c5ac2 +6424fe97dd950b5e6e7168bf46ff87062cd352af50a81a7890f822d302a268be250971e6ee73bb +4dd5effb630d0d50caa3260fa8fd2a2d0769dd483fd2e0d4cfdf3bec4a20af1b55979ac2178ffc +4a2e162d98f61082b5bae7a5a60d8c042d97bb87abecef118ee66879710229d6aeaca50bef4ec8 +cf06e58fd3a63c5725c28b5ed9abdabde509d1c0c1a575fef23b9dcf8e403a4a3cc541e618d1fe +1b119628a299eb83dbbfdaefae37d3638a4a74769fd219766efa01ebcc81a780106266b80f15c0 +1a51af1ce978184ecf65c60cb5b3f5d28cf6e62630198ad9ad1c32a244b1968ee962f61a3b49b7 +d13a0d9cb5694c291e72696c40f4dea8a00fde7c01f8b6a20d42ad93d71cd8d8aa207d123e5cc0 +bf86d8dcaea33672b45a2f9c0549c70a6681780a9a8c555b5a2913a27638e851d9a26c738051c5 +d51e643d5bc972c4d254bb9064b1a9a0c1fc0b903c3f823cda898450360ff79f9aa39b9f63f58b +310fa0b487ad57bd5ac10185458b77a75ffe10103004fdb4b55b09b9c336b8e227ab44db4681a5 +15dc7bfb6c0a417d266732815b299412d0855664922d76d25211545e99b50c31b4757e63825dac +ed9c08504af7e46fdbb1ee3c731c355712999949d55ce4a8c7e1e5e1b5d94659d2b93a6792188e +9abf7f082a352f95115fde60b7e4098e064935272618e3ce37efa02620233ef48f1c12eabbafce +286cc06a8d8f46462f5d6fbbf167bd30cb5ac44901030d03bdc02840f8839bdcff2d378c4fdc93 +0a30b765b5670cf81d762b465bd4737c9b00955758d32b7b2f80b942c018c6169cb98d9fb2424b +23a3638cc270b82ba760a18534f8b27e18519f6f3aa73afa9e14d07e457e24c30485bacf933ac3 +a15f15c2347d04eeb30b5b441401d941bd01c148a6dc8420c6c38a7c97f02320f7771c180940ba +28a7dbb6db8d49a3a03b863b08c2d383bb3ec558adff2953567537c0a185261f358631583344a1 +1e3b4423f60ee3f770476348674ac64df8f848d4d000eb6fd06a44d0320975a8eee85173e4d7e3 +9ec9db03a8ed20daed86d273ce5762a5d35d300f438e9070df37bc2c3f45d2848e638edf15fdb5 +fb9a0015993012c5b8277e4f92584d393531cfa0059a6531f8c9cbccb00ba73413eb4555bd30cc +0fa8e414502447dd977bf5943db2f0a740efcec3fbaa039960f39302b719195650c5ffb637594b +34f2f9681477258d010390c241fa41249fd5d57c310cb6dfdc9dfb0039d3a95486dbd4f45daec8 +997aa6661bf11eed2aba5cafd6ceb7f90a8ce42c7b215eab422bf1522bc47fb7d001ebfb76223f +2471326d68d6fd5279ff5fd6ef5276bdcb4b1264381d165d31f039b19079561a2a2dc9b35562bc +d336a90c26a055a92b70be2a20494b535bcc643e7f6c45c0b441cfa4300c7c4c30ba2ef8d6215b +8da8945e544dd54a416412f4517280ef73dfb1a9a2390fbc863f64ef977ab4a4813bcb17ab2b74 +b95eb97028ce0c714f52ee9f28b403bb57ebc7fec24061e5cf24442126242a4b5a68a0fa55089b +45d722a99e0a45ef6dd44e35adf911ced9ee958e8d313844ab95690451f710352d4c8ba639a65c +05b74c6f4804149d60500c911878999f654a0fd0d7f50bb09e450960bc58fef8e386171d627d27 +955467f4687a461eb761837e03967a42fbf184ce21de728741313680519767f305c820e2fa0372 +4a1433c7a5262a45df14c33d8d5f88b3d7d6edf43fde8bdbd9462081a187a4514ce22c899d9a0f +7a85b16457f0ce8dc4dd1e9073db73cc9852479ad04aae56d96648fd728e38de754fcbdb79dab5 +4945564ae229faa128a214335aa91e552e34bd83d8cf2d7f993ba85f3785957ce6d510ce754122 +d8ab98c5edb24361b663dfcd536c0e8fa6f8f1b592c3485025d9ca93950f6668d45adbd13c6080 +652a5abf36da54779f09dfdbc3d676045d6593a3b5fdfd247afb5f8598bfbacc85109dc162f584 +5bb10cc35962c69416a3e08cf90d80bbcc3e7327d090fb6093644e4664346cc132d26081c1d90a +00cdf6ad438ff32acb23ba5615f432d266723e02f58e506c6c712c22965e01b17413cc9772df09 +86d37ceb16ab8c74815e5a2e9abf6a2174c7595ef44ddfbee56fd6d2ef863b4242f0b18ce448a3 +fb7fa0c196c6a2ba6946a98f2e5990c59efac14b8f1afc93cf67445bef35ad0d02999956b690e3 +2cce52671b118df8a4ade5ef0faf91c725c0d3d9a507cb96c1bdf2ed7ba88b286e10dce55717a7 +c7aefb7cb8f6ed79ee02a10fa81b0f166a5cc099337aea3ca0e3ae8c913786b7281f502d1671d3 +62f08ef104e22c14cb5b76633331786dc234becbf5065fdbbe4885078d43e18be29bad865b0ad8 +610decc2000b7094dd66e60ed379f4ec09fe62d6527bc0259b52c64c3350a0602a27ea6edbe5b3 +7e64677301f26e5424c4ec2227ebda1c2ec113b6f17fc736a945ad1ec770161fa135637e09971f +7a86e8175a82a82e1627fa27cd1852e0544739665b43564495a9f6fa7e460a881698b7fcee0e8d +8d31dff340f8847e11d53e276423f3cd3ca6cbd46feccce37891b7d01fa50f472924e42fba1a4c +59e34c674bb5aef3af1b574b318525678ecf72020ec8db2a75da1b89e990fa6a0450b5ae0a4d87 +a0d5edc8c4b83b7c45af21cffd544b9e71b68999cf86ec685bd3de4acf886ff0ccdf9ccb662c92 +ef968b219843708bd979c308dfe8958ffa0d81b4ec770ac6c024fc80f4c1e3b526745195754a42 +eaac4b118aa0e5f9a3582a47bd21bf8ff0dce46bc2cea77f74a0701ee0792d50a03951821a2769 +e904e2ba8eb38b58a34380e6842a31a5432041585d6e5345df42b9f61688bb32506b8585e457ea +527354244b9d1dfe6414c54379794bb53f75a594147e70a8a4fa5541e3de1c060d7f464d3e5f28 +86b9d1dc713086f50ee7239dc30edbc09c66dc474a4095d8523fc6ed58a4383d3c91239b818ad2 +e0bd1fc2949f874dcf2f8d32ccc1f19a6b6708f527681f87c252cd0e1f35c786d62a8b4560cf99 +ecd7d3302355237e9b236e91aa76c17a82513316afc2fe509ea03a0f79463ec4432e4bfeb70f60 +3adcb299a8d9998fc80c656366a15be322418c8de6f4b5953e170609fe61ea36c3b80dab055443 +e77e8232bceb0fe40fc3774c465e7ba2e867204895a939addda4c7f8baa794a682922580ecb60e +1f019d6abd81e43e7901a45bbc8ad4c9bbe51cff7dac8ef9a584cb1a4bcceb089d9e255a50f086 +89cfb53ec006f39a8b54177e938e5cf853ca526df863c25093fe0f2f5404f71dcf9201c54ee93b +edef0a6338d0854ec381d3570e481b00ed9b8b2cc643c0c78b4afe0d41d222e79e006660ec133d +4a28d4a1117400842e0ffc4336104e1a28c1558a9d1d021ef26a883babe54cbf2f0d6646e4a270 +bc0aa7e0d3af3475c8a3f753ccd99326d74d5c7da9921b040427312c74c46eb4b68d97d798a6c3 +fd359e67c11207d8b10c2da5756507f2b0d4393f0d6f0a6bcb59fd36b31ed4f6befc12cce1bedd +4143fa6bbf62b02feb004a630bf5322573ec2ad3dae6b969abdcc72d7322c72d54f1acbd5009d4 +0577eeae4e41ae0c9337d4bc98f11555aa1bdf48e7efbbf4841f29181555df6f2e45c014f954cd +7a33a9d6ef8a5937eb9e2e0735e531e1271eb071e9203b643cc7b0e87903020ae27032cdd83338 +248fa24c7b9921e53d5fcd7b80540fcd5228cb26ccc01201f2130106faff96dfa9ff08de5e2e12 +d0110bf01f2e14562e1114cd3059322d16ac31b25deb911b4e1c3eedcfc792688981483021de41 +0ada3b3853ef43b6f1102bf6f10c1e4344d3ef4e36004b6acdc95d9c41bdbec1958501560080dc +85bbce4bb5080bd1bde1be32cd52ea9a7c868ca3d01f7a838156da7035bcb781855f939539ea62 +eabae3d3d1e25c27e54aaa10bc74a5af5db40eddb60ef60b33d73acfdfcc31579a65b9f0fbb799 +e584a35fa33134a7122207d40dbd2ad29d613a646aefe020077b80d330d170f674950e877db760 +b4e252bcb1fe7f7dafb5f6eaea4e09a99a628621014013d52089cb721097dbd897d27d6717d53a +92c1e11c903da5a5b1abeb1ecab75a03fd67f8a815157461f2933d39762f1f4598475ef113a0b5 +49574d320d4106cf45aac7d1bdfa6d88db48abdbf5d2d0df10f56001cbc5af1b3ded7cd411233a +1d4ee7a727c4096df37376e220b32f06c16533df3e80be8bc8264a869676966418a183b4805e5f +eb6bf898dd5169aaf084222fc6bad9e652d0927a18933ed9e577a0714ea7a05ae4aafa4a318488 +30d7ba321429e950ddbac048e8822caf7a036aa3f9e9b15b5e099cc05a9126e194f41b9c1dd893 +754fb5a1c276c583c00fc740279a658eb3612d62ddb153609f2208cb761d963da2a040ebe2b8e6 +235589709b65d32eb73775a77721248f6ac3999b3766c98aa313f98943ed567aec3f0ef2cca4ea +c94e2b507fdce890b42ddee560d64e411e20943e16105f6438b749292eef7d79edeae660a6411f +4845a851b09232031d8e3435a5ac79dd6b227a8722063c6dfeeb6ef0d3ec6ff1370eb04856c7e3 +ef3b2e29c54e7fbf7c5f73736b71029145375acd7e1bca48959e42de232b0b8acada48a82597f4 +668917c7f95984938037974ab763b132c9f71692da966de63f50191603be855c1062c4dbccd685 +579d76adfbaa7abfe3ea6bb0693a8e4ebe98e222b9dddc7b5c00caaa52ad4d2d275906e992f9e0 +5b608246414b3e944b2835d1a7a79cb5fa2f9b04edbf7fc84073fef6de04f4158fe121df4ce9f9 +a828cfe8e09a5c80141404cc220b2492565c5d3f24fdf03570ed0da8d729d7e8dba4dd98111d62 +0de366f47d61c1a538d89e0bc0a6dbceb6105a45e9e2ad4e64924abdf7c765b72921dc524e7b68 +7d2dd93db6c721db754360384a227ad94136b61fd0c9fc317a75f71b204ae0a1d12bfca52b12a6 +9c77a40028b1db87c7c276a37ec21a4093f304bd8e3b7f0aad86ce3b32ce1fe568beb0e813ffcc +947f0a668fbefaaee7ff65cdc29d672cbfcb74712c3938b6418bf4855b615a7795153883a56058 +fbdbebcd65cada5d34a61d70cd617bb515057020d51d1371fbb261e63e6c23540cc9e698c72444 +e85512a3a8fbf302559e325df1768d6728be219a29034ca77d63df6f6c33d01b7f6aa1e57b215a +e09a4afcfa3de019d248d658dc0cadba830983343b1f6a0fe0aa632cc9d8e63f708ce4913c5ee5 +54c63640e25ddf5f3b367e903158c2a8417cdb13fc06549f626022dc215e337a6c2340475fe7cb +315f8731d69fe05517fcd1c2a38c8420b80c36a46f6325c15e51a9bc975ce2587501c1cb0e2aae +d78b597281c3c3e7310cfff0e3c85765e40c1296c519bc5af94fcba2ce9921da3cfbb167e89208 +8b08a5ce362317abb13a9b56c345ca242f0d9c56aaec4f3697ced94b2756a36d46e24eaeadf171 +b5c074491b14455c19f20e6ba055f05c542bb6b7c3975718bd9f657861e5740e20c97a3d25edbc +d40ce7ca5591627dbb311e3ac19501865de39059d570f1b0af793af5abb10837fb24143d1d1a08 +ace4655de917253766d45df81384535d264d4daa41fc32301996048b7eb638ae471fb2362518fe +c11b39fbd13739c5617bac3a589b56eaa5bdbdba70e6c30931e978b15b5319dc1c62294cefef9b +54467d179c3feb9f02df8608b100cf4a5425202493fed90e9ae277fbd14038848d3ffd8165a747 +dfbc54173f49c6814b41088b980c1bfe78fa848e075c6e3a2d62f25cea02f48604531d65b7a1f9 +8f34e19093a6a8d732ae2bcef21ba428097c7877c71a382f8303b38672bc99ff02c8bfeb06d903 +91c8eefc1c9167994d589c2be4af8ca721e9764345e24e2ae1582b38b458eaebff13089b12b850 +28d07872f48fed6d108e9e523b1ba1ccb2f853161b1f32ea11092eb751b9807cbafa481b040870 +b95bae5fa2dae352ee14b739db6d6e5d6fc12703ba6860921df2dface3d47f1c2a29418764e4e1 +69719f4ebcb96ce64e113f071f3cb594758ca871491d394f8ec24f96cb696c6338dec2969b1167 +542c174f34e1ee517380605a8a511e7af70bce113a6a70ca855e5a1cfb9429063541f579121fcf +a7eb18b30b39df61f89947f4a629a63c347d512dad1e9d80d582bead23df0ae3e92d38e3783c97 +70109a2921835144408e6f284923d28cf3c20a8e023ae9afe169f579a44cb432c0b91bb48384a1 +6ee743795014d1d37e81d3efacc0a59b76c102ee53509e0d2562452fe1177854f96f26f9e94644 +183055b8906c9a0ac65b3335b762d74606b04bb418c17c38b7b41c5bd73ebd2ab30c8f4252a8d2 +78fa9b7aaab007cd23c016c415594f973a9a83790f5ef5911197d4a20b638688302ad8c179e8da +15a08862a50b2b2165a2db724ffb9107ef6eeb2648a0c7c2693e5778ded2e72bb995e19933cffb +d7de74627218386899c302dcb969dc37d5b454892d7032880ac41c3c5f84a1358602e4d9872345 +97a9d11499b1f56e8139a214626026a2b5ed9f240435350a8061a3d6471a1f70f9dd154b11b98b +6301190f77b3dabb9730c4539a8f39e56c9ff29635a0f5d6abbd3a1cdece80bae849b76a5d8d4b +46e62e8c7e5a10b6e3f942de4570ba16eff5f6de2bae4dc4f3183f061ee50f7f25df683a742cde +2ccd2a72104cfe3f9bc757cc05714f33d507264f7835db680f4a2eee60f153829103f9ca4a8e8d +7f1445c991bc646c2a59a6afad1f5976f5d95251d2770333efd9a24326c1c2983315f8958916ca +c08618bd470750e5cf501740b09b6f270fc47a4700af5aceb1f60f9e83821013261be7d20ca221 +758b262fe2cf0d55fbca06548ad9b4a002b34381fd80e4f7934a7f00ca913e81b5fd91dcef124f +d73991b3d28f9de813a540dcf089679f19d3c42e0aade5463ed47a84c9335056150d56b276ff99 +ff904a25fac4a434045f61e01e05760325a1c0ea62aa8f8bb0022ffb83ece29e29f8ad9e767ec2 +75b440f45f1f9505d8f4f35ae06aa89e04f1e6b38b64339001286cb9d4b3d2702e27457f8e9eff +efafb11dc8b20ba86ad21b7026a5479c1015bd2159ea3513c4f3fa55a71d42c573b96960d398e8 +fbe9132005725cac8cf485a580ae949d0b79ede5a0d25ad89577d345ff4890dc66b255a5567e0f +92c909ff90a78e16179f66762e3dcc9273bcb23af678385fca0ca7557c1c345f1f5df3fff48f96 +e59df0d56923497ff7a791c6ea35c827730e3b09e0bca80ffd9ed44f9bdfaf6b277cc96f5014d2 +f54790e7f0f43dfd197678e5538e3e4ec7740de286d079db6b48925211033e1db7af4fc2b0e08e +25306d5277bcc5ea326d6460455b9c17ba739aa226e5184ac4962180df22e480cd063f3481d618 +9835801cb1a465b627a15a53dfdc1ad2450b3128498918b26666dbdd913df039b9f393754014da +7c7dbf4f4cd160e6290e57d24415c602892843dda447b11c2d76549f70847b80616e6046016cc2 +fbc6fc2fef354ca4cb76bd174d77ce23be60942d7e677998edbd014fe4e40f662c9de90b5bc22a +24dc8e4890f2d0d27c6ac5714f77d1c51d85f6de7dd73ff7a5f12ac69b5b4a91195f96674e639a +281796838e22dd65afea42123acdfbe01f6e368f9f199007375d6f466beff2d14df5a040bbc107 +0caa73f8713574037d2d4e10bd551e8f235f0ffe57a74619f936a5f6c79da62d6d9d56a1f36ab4 +a0d2389f1c2e3b262cfcea1c17b67d1432495a08c8ebab99c951595f4c17fc249976a66a5e6362 +e05456bb64e4d84da9146e816d24148dd68ccbd3f0a6d550f239566361467eb1033d0a6d84d73e +9988fa01d3623e0724f8ea61aeae7abf0bd6e1de5f6573f0c435d13d4789096edac3b49ee70987 +f23570e10ba8b67d8d5f22134854872c13010fc621ee3cf34670e562a049da9d644d232b416b09 +6fb726db767301402af153bd5c4d746f423f0708e58639bffb1c958cd594aff8c5983ed16df7fd +db777189002380f8777d850770381eebbc2ad21de7db045ce0beffa404fe69a26a57c8d2277876 +5a73047498d5597360a6b0d1a9af94b2b15292c36440a8198e41ee7950a169d8b12b4b17e433bc +8af9437c9b17098506e0c54a4d95cbc1550507cb7a5d7883a5edb2696559744c130a81cb5f1e14 +25f3cd383c5892fcc9429e2bbefdef1905486200052dfbc23e4becc2092b3de460d1da429aca81 +71cdfcfab8f0acc297ab0d1a43d21ef3e21973bdffbefb290f2ab1364c79bd79b5b8c0925ec8ba +2b260ef5f34f69655f6c7cc927fe718f52d5646e9d6acd4ef70d8cb2853157014d1674e087febe +ebfe490d7a2eefaaa43a2ccdffed19f19e2ee08407f379f3c6df5a22f76cb0fddb259a1512a97f +01e0f5104884d7182d33a970b1723b31485e6692b21ae3fdbb49766deb926d60e6e85ec83fa8ac +b89bef5e47c789b5dc32dd0e0ffde52498ba5e16b70e13d46a9a7b6cdccdf8f1fc185b85d75220 +127ed19bc52c37a0900467eb745e3e4964f928b59e9425d32eac1b783ad3647f7e30cd927d7f98 +5714b67bfd035a2e1915aef2e724f3d43066a459e4322fb4a2451ff65a072a6d54b6165e5a4cda +945dce1534960c0a05a1cc476ece71a31d99d9040c80999da017f39fee87aa220b01ba259830ee +3a8511b48a13b77d1952dc39359ac7480c14bdc5e979918df01fe8c0a54981e3daf22988a69b20 +da390b53c71a0a680c524fb3eabbe15c35b295c9234633393317cb875d1d9fd3f517b75e2279e6 +b55f7e7c91f77cc2ba279c7476efe63e89d51d1f65d0db13595885d09c832425131dac5ece41fa +76ab3fb81ba6875b300c43eac7ca19e0aba2c2abb9dbb7294a9faffd73995826dc8530f6eb3f97 +1564878347fac82ffb51ca2eae1c33e6a638c824eef4f1a5d338cf3676e4e7f745276dfb339097 +ed250a32c1fa0d1180b1d3dcc392582ff4f3f9d2ec95070576e9bbf3c65fb490d9d63ed2e127f1 +01cd81f2913647bb7f706ea676e3b325dc1be29aeb4656a9671e23f20e8cc3faa48c9655a367dc +564401afbb7af29460e9d38237623bb923e06ac9a1a850da9b7ac1feee5b8dc0ee2b489fff40e9 +b1e94b8b84df49754e3964ebd95d78d4da5fe12cb5176af8e2b0f08914287e91cc5862bf9bfb3e +4f2ac67bbb886e3448548b892aa9cdabb9a31d264326a818f9c625a007700547c39ab44c23947e +3607b1d9d66f5ea491450fd1452bd0ce59023bb52efd3374410bc7b60a7d894b7d5a09a12016e5 +b241057cfe03f6599b51ff416fe8d8020d71c1703fea11a9ae4cd5a1031fe7e62c7ff736c25a03 +7bdab4e6e414531fd022ea2614654e63f4340ee5ea7ffce0141b2f5c45ba6906136000d02dca9b +7f9707edef541163206dd366c2430102401fd575caeaa480f411afb7f5980aedee47be44512546 +5ead0d747055a75bc903d53e80f4ce800f5d67dd158990d91ef3458634159e43cc7e275063ff33 +5cc8fe01aa86703d42b4c1064dd8a84167345f1d461a1f87606cc686c76389eeebbfb483eef9eb +e44baf29b4c1a2e47096185b8338472a8f1a94a91c679062c0faafe7bf2f029388d0d683a1700b +6394e4faf06e5af001770f813e49030bf702f728eb065ef465c1e9f13faff25a4a47ea07ab869a +b6f0f790142b6a0454f6b6757447953cb92c0beb5a4eb3f0a922f2e44665f07ab827bb2cbe7319 +9233fa5b048d29564773e81dccf60846e4bd857bf3875f2e79638250e227fb0b8ce80188870594 +030b97021665cfc6f3212c6703602a6b5bdf717a81a96e38e554d715e2949c230c79441e83f8b5 +4e58726c1de83264c31a72be2b0eb98c663ad88fa6a7a2e16f4bb2661938436a1b3934d76e74ae +f519bbc78cc977bf7edd77a441088b7c885ad7b0a7976e37f45d62d089b0a7d086cd4de86ed662 +b9d8010b8bc8e164eeaad11d8ad996c6e882cd824599a22533d1efd052b5cd9fc3a5efc611e4ce +2c4c1a342f5cb4e1eeecadb5b5c9883f54396b118b023421e48cee67a34dd58a45a21b880e0779 +c9dc637d78956415c5f4fdbaf530a55126a659408336b4b25ea132575796b36cdb8a657922331c +f66d459036fd6a8d10d39d9d7abefc8f624614452bbdc744dafea6225ff9dd6f0aeb017aa8f567 +2eb50f8e82a6ed80260b51cd7f19e7ff05c23c2583a8dd01b377a91e7e39c71f0da015bb767975 +20df5ddc2425269f99d33dc2cf60feb54418ee93210dcd9ff5e5d82f99758fafa8fbfeafe56e02 +75b4fe335f4ea2dce58263d0c3df59b4361dce5ca5b2d8a08a76e94c25dca8496b31825c112d16 +bbfda27ab03306a40879b164121c0018aa96f189660b053eaf0bd03663f976faa6e6fb263d4d48 +ebec3debc5dcf1e0eaed7b9402597d79e491750b2076f668f4557964e2b73511abd5c028d96a02 +1e82370f6c51b76e9dc536f6e557268777faa2c7e7306bf077861e650167f6e7523ecd525c5701 +4b14dcdc7a0d31f76ef8d5518ec3fb14e2cc3401325079a23fd6f91809343e9b3d0c347b56a4a9 +9d759e4a965b339db7df1a054d9ca96d2713aa412f083d5284e05c3139cd9ecb978725d453bbe0 +5310448b4e263691d414f62512b2ee3bf50d589bba13705785572368dec4a5d94f50f5a26172af +0f44393302812948e5358029cdd53b87017b69a3901a9c7a27953e8fa81f41a8d03a1522f91eca +fed281ee0e7722b4263aab2e4a7d5705839aa7bcf9057948b36c6a26caa9308dfbf7f955edb94d +805a7f49ab51cacc0a9bbd9601d5088a2845989e13c388676389e36701a5d7d9d89ee8614f9fe9 +df1c3793a0454b7a5a91d7b0f0aabea3a94ce1cfe2c480e6b8ede4c8ba9c235a2cb1e28fdf938c +6c51a3a3a28e7a80fb2454ef057107d8ccbca1d32ed45d64422f7d15b81211df041cd668a3a1ab +1fca1abe17cf4cb1f3fb88be6159b777797f2082209d8fc2c8b752145ee7168ee6d338ccff0bde +30a68491b706582dd31a4c8f07e73f1b93a7598689a69ba9f30485af7d164ee57c2e8b79f03603 +59000d83626921478f4733cde7263c25b2d5f0d910a2490057bb599ebab933b0db5a55dec80780 +93b6ca009d1f77809302ccda480c1860a88cf1ae85cc38890dd91ba261642c49670143d2fda7e6 +a463868a288b4883c29dac66f5b74575afcf06680c1b23155ae25e22b303eb6f8d9da9e1e216d7 +cc86a854700dc1cbc59ca158206fd9cd5fdcec227ffc20ba2f8563d34a71b8b32bf81ace6be0fa +c00a262cfb2690873a2f3b132bb950253eee7b6e62647f71e056225055cccd4e4bae19a277fdd4 +a0330f85db2110381faecdfceda5c820e2b0b22bd2ce5e65477f418af4d3df07582574aaf6ebeb +b781887e7bae86d0ee00ea33d84502f6da28895010b6a25d60dd66516d0ec4a7293e9b52f02b3c +bd2acdd1f70d561996592a7923f0eabe9ee8212638c4014ae431e7ed1b080794bf44bf640de46c +bc3ad8118f58cb3dabe9ff2a6572a1d8384d922425afa46f8ba0f01955164d6be9a2666328836e +c1e63bd0b741ba1e8c247c2e8dc86502287a57e0db57a57b2c264348d7f0ae23f2f287939f13b3 +9b78b3676f2e84dfeed137f0a41d9c44205889498dcffb9f7b77c8b587979e94f0381c982ba947 +a9c1d4b19ac8eabd5e8bdad55849ebc7e9e600bd11c5f9a9d7fffd69a274a18683dc69632a8d01 +8c181d95b06c10453a6abebf6922457fec592b99e4a96a8986c9b8416f63b2ceda5702028cbe9c +2917c3312340de93764166ad219081df78a1edfbabb9f4e2db16118368653733bd57c9e25bfcfe +282fae411e126d4966366271bbede5da9a48728de36d4fdedbee8985c24ad3aee0ab22e45837f9 +e6e22f1ea37a784e6d174ff3477d7c236c6d150512727b818549036078e960deef47daae259360 +61b9a8c03aee7984965b5dcce066e7b5b359735007d7a121ce6302cb5918cc18819ccfa0b17c00 +a73743bf6aed7eff15aabe1cf558913ac4c1474f7e6fa6ded48aedc460ef2ad767f47edabc2e9e +f390752eea5b3bb9573e9ef08464d4b9c47203eada3b3c247e987a67c7fc56b54ddc34515c31fc +1e18365c823091d75f1482a02088c2f139ccf310c72d25ff4a75351eb6dd345747945cdd93ec0e +6cfd2be6c942a5230e39d62d6e4812e137836f2a683768d63685f01a63c37dbc823f80ed37923b +93f13462171635e8b4bb3a5ef547b84105db78046b7e9f6ba8957e8e35e2f15c02aa49331d6e57 +8f2ddd75ccfdb7d73af3b8cfc48069d0bf81c1ab7f205067e0b3fdb8dba05399800fc3f01d58a0 +ce8ced16b2674ca557c15b0f597150dbae4eae3409ed9dd05639b9b52414d7c8c731048b00ae83 +b239c116d836aaf6c54928550cab67a24a7a6fcbcd43c46c343aeb63898fdb19e42debbdd3521f +46fcae9049d3354ff5acbde61e5377ba75150ccf3087427c154fc8b605c1e3dbcb2197fce95b95 +c7a2a3f751f48440a30a6bbe46b973b88454388e228121d03064aeac8260e72601a9f4047d7794 +359eab6e32d59563c2c49f44d059d6e328051f0bfe44ba538572f0a3184e520001d355af4f7227 +f31f533051711b7395d0ee6d5799ae702922dc89ca95d537557a1b7d60f577cd8f0e5fee34d829 +2c9d582bb3feab3548c913003d9394567d3b85fc358521a3a862579688be6c3188daec46336391 +2b7046205f979eb21b737e85211680c6d5639f5a16eb3653fd969f084547f509cc37406754701f +f81359cc1ca82e41747c2c2eb61f2c40f077dd4dd56e6c0f712ee4b4de768be140a47135d38ced +d9214deda6068da169f716f65b1c9201f86fc3a5ed7cb9f14e73f39cd1105666043776ce171f76 +2a31ab1ca4d610715211bfb8fefa5b3cab7a7bf33ae8590af88a1247d5bc720d622ae268893daa +62743a577c6908d4db046532fc7ae6cc3ae15278ba0498bb4813618015f01fad8c4665abdaa0a1 +5c1b1ae567bef5a0d9c2905944c1a5a78d59fd940f2f6d08f3302577d70a7b4d39afb424235791 +f9fddfe88b9fa8d2be4d7c012a94c8d403dfdf44d48e34280d9a327dbf9d7e4b128f1bd70254f4 +f6da92998d9fc702e1695956f87921ad8af75a1a81259bfa985c2a53effd40b881e0b3714a2454 +ece15cc6db4ed531ac65cf9bbf9fe7cd60fd9bc729fae104e7c8b867096b5cd5b3f3d437bf8765 +90c222db6a2231f8b58622095107c2c57c5ee6df2fddea548c893c65265295c41d1315701d46fa +3208a3e87c5f12420c30609f9758ed81e5e1d344db3359e85fb823aaa9309b97f479fd2b935825 +2ad12d6954ef2a729f9d10b6cc6a111a6c020527bfc685ae087a1062b564656f9b9d4723fdaf9d +dc7410e2dc5647a5ade74c0c611abd006138df07e2dae381bee39cdb6b24f6c273736fda0adc62 +8418568157893ba7916866e7e2a6451651825a5dbcd2811163a1a8d047a3100b739fcdecae7e5b +de7e9019648d35370a5f70b944566ce1bdd136a8c3f9883c542997cb195e6780c767ee8ac0394c +4445ce19268e734949d51d642112ece9291b3204e4351f30af6b3b5c5b08a2a371a51f868b305f +54ab2aab660cb8328bcecafbe87e5226f4f83990fb31c424528463b1c806b5b74ba01374d0f70f +6e3269593de4230e4061411918ee1221b58e3d3920036e114f8c8ee392bcbe78b54e574ec2d573 +46a06dbd8aef1b49efbcc0688d7f9767324124886fa195e86a757f651275d51016fdee4155fbc0 +501e683efd8779a29d510edfd1bde99e86cd03f5f171b05c720640ca10919b0787da963747a3cf +c2f722419b6f8c7a361ca7768c8c804861a07874b681ffc266e284c683505c1ac948e9312db8f8 +33ead8243171e959a74dba1105de9869d94dfa578008dd30e994c5b2107a90cccc52e9c7b96a4b +8b36512fd8442f454987979f59fc5fb2d7464a0501cb7932413a379ff8fce516d20286ec9a86f4 +52c5e1ff5ea907cc6882b58952fccaad4291eebe3a890f49da5b4cff04e006a1c18fb4a95a1958 +decf0c84dad894c3b355761e7173fc43e44de12d4d0c0e05a61f1daa64288170d17da7777950ec +6c685a1752ac7d555403b80db90abce6335fb9916957bfd2b16e8c9c114cd0b95409c9bbff4f10 +6d21cb6e267f6f4a8883e4831c015ed6ef7fe4e8bd20ef254f7602de028baf9c88c62b8323334a +b5b7f4cd68d03c2acd95ddee88a0ef26199a9d6ba435a96a91ef55887aa4870468dc516ffdf1eb +12ff797d8fff0f6e5de2afcad81614e3bb9fd950a5db3b6879f3cedc9c9c64f2043c291867a594 +c024d571eb0f91b450f183b3fc1b7fbd31bb9c2610794855346726de64d3367cdfcd0470f35f45 +f86d481fb94dd2faf6fc2e93f2602822c8f7c94f2a538fbc3ade59a5a62de463c1835d9a74ca0b +163ffb7fb8de8f658dbeb272daca86c431fef354af +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if + +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 6 5 257 172 +%%EndPageSetup +q 6 5 251 167 rectclip q +0 g +0.8 w +1 J +1 j +[] 0.0 d +4 M q 1 0 0 -1 0 180 cm +43.199 139.602 m 37.199 139.602 l S Q +BT +8 0 0 8 27.6 37.44 Tm +/f-0-0 1 Tf +(0)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 113.922 m 37.199 113.922 l S Q +BT +8 0 0 8 23.6 63.12 Tm +/f-0-0 1 Tf +(40)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 88.238 m 37.199 88.238 l S Q +BT +8 0 0 8 23.6 88.8 Tm +/f-0-0 1 Tf +(80)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 62.641 m 37.199 62.641 l S Q +BT +8 0 0 8 19.6 114.4 Tm +/f-0-0 1 Tf +(120)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 36.961 m 37.199 36.961 l S Q +BT +8 0 0 8 19.6 140.08 Tm +/f-0-0 1 Tf +(160)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 11.281 m 37.199 11.281 l S Q +BT +8 0 0 8 19.6 165.76 Tm +/f-0-0 1 Tf +(200)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 139.602 m 43.199 145.602 l S Q +BT +8 0 0 8 41.2 19.44 Tm +/f-0-0 1 Tf +(1)Tj +ET +q 1 0 0 -1 0 180 cm +62.238 139.602 m 62.238 145.602 l S Q +BT +8 0 0 8 60.24 19.44 Tm +/f-0-0 1 Tf +(2)Tj +ET +q 1 0 0 -1 0 180 cm +81.281 139.602 m 81.281 145.602 l S Q +BT +8 0 0 8 79.28 19.44 Tm +/f-0-0 1 Tf +(3)Tj +ET +q 1 0 0 -1 0 180 cm +100.32 139.602 m 100.32 145.602 l S Q +BT +8 0 0 8 98.32 19.44 Tm +/f-0-0 1 Tf +(4)Tj +ET +q 1 0 0 -1 0 180 cm +119.359 139.602 m 119.359 145.602 l S Q +BT +8 0 0 8 117.36 19.44 Tm +/f-0-0 1 Tf +(5)Tj +ET +q 1 0 0 -1 0 180 cm +138.398 139.602 m 138.398 145.602 l S Q +BT +8 0 0 8 136.4 19.44 Tm +/f-0-0 1 Tf +(6)Tj +ET +q 1 0 0 -1 0 180 cm +157.359 139.602 m 157.359 145.602 l S Q +BT +8 0 0 8 155.36 19.44 Tm +/f-0-0 1 Tf +(7)Tj +ET +q 1 0 0 -1 0 180 cm +176.398 139.602 m 176.398 145.602 l S Q +BT +8 0 0 8 174.4 19.44 Tm +/f-0-0 1 Tf +(8)Tj +ET +q 1 0 0 -1 0 180 cm +195.441 139.602 m 195.441 145.602 l S Q +BT +8 0 0 8 193.44 19.44 Tm +/f-0-0 1 Tf +(9)Tj +ET +q 1 0 0 -1 0 180 cm +214.48 139.602 m 214.48 145.602 l S Q +BT +8 0 0 8 210.48 19.44 Tm +/f-0-0 1 Tf +(10)Tj +ET +q 1 0 0 -1 0 180 cm +233.52 139.602 m 233.52 145.602 l S Q +BT +8 0 0 8 229.52 19.44 Tm +/f-0-0 1 Tf +(11)Tj +ET +q 1 0 0 -1 0 180 cm +252.559 139.602 m 252.559 145.602 l S Q +BT +8 0 0 8 248.56 19.44 Tm +/f-0-0 1 Tf +(12)Tj +ET +q 1 0 0 -1 0 180 cm +43.199 11.281 m 43.199 139.602 l 252.559 139.602 l S Q +BT +0 8 -8 0 11.76 92.567813 Tm +/f-0-0 1 Tf +[(Time, s)]TJ +8 0 0 8 117.629063 5.44 Tm +[(Initial no. of nodes)]TJ +2.166367 18.54 Td +[(1. Time without)3( failures)]TJ +ET +1.6 w +q 1 0 0 -1 0 180 cm +100.961 23.281 m 129.359 23.281 l 43.199 53.039 m 45.281 58.16 l 47.441 + 63.281 l 49.52 68.32 l 51.68 73.199 l 53.762 77.922 l 55.922 82.48 l 58 + 86.719 l 60.078 90.641 l 62.238 94.238 l 64.32 97.52 l 66.48 100.32 l 68.559 + 102.879 l 70.719 105.121 l 72.801 106.961 l 74.961 108.641 l 77.039 110 + l 79.121 111.199 l 81.281 112.16 l 83.359 112.961 l 85.52 113.602 l 87.602 + 114.16 l 89.762 114.559 l 91.84 114.879 l 93.922 115.121 l 96.078 115.359 + l 98.16 115.602 l 100.32 115.84 l 102.398 116.078 l 104.559 116.398 l 106.641 + 116.719 l 108.719 117.121 l 110.879 117.441 l 112.961 117.84 l 115.121 +118.16 l 117.199 118.559 l 119.359 118.879 l 121.441 119.281 l 123.602 119.602 + l 125.68 119.84 l 127.762 120.078 l 129.922 120.32 l 132 120.48 l 134.16 + 120.559 l 136.238 120.559 l 138.398 120.48 l 140.48 120.398 l 142.559 120.238 + l 144.719 120 l 146.801 119.762 l 148.961 119.52 l 151.039 119.359 l 153.199 + 119.281 l 155.281 119.199 l 157.359 119.281 l 159.52 119.52 l 161.602 119.84 + l 163.762 120.238 l 165.84 120.801 l 168 121.359 l 170.078 121.922 l 172.16 + 122.559 l 174.32 123.199 l 176.398 123.84 l 178.559 124.48 l 180.641 125.039 + l 182.801 125.602 l 184.879 126.16 l 187.039 126.641 l 189.121 127.039 +l 191.199 127.441 l 193.359 127.762 l 195.441 128 l 197.602 128.238 l 199.68 + 128.32 l 201.84 128.48 l 208.16 128.48 l 210.238 128.398 l 212.398 128.32 + l 214.48 128.238 l 216.641 128.16 l 218.719 128 l 220.801 127.922 l 222.961 + 127.762 l 225.039 127.68 l 227.199 127.602 l 229.281 127.52 l 233.52 127.52 + l 235.68 127.602 l 237.762 127.68 l 239.84 127.762 l 242 127.922 l 244.078 + 128.078 l 246.238 128.238 l 248.32 128.48 l 250.48 128.641 l 252.559 128.879 + l S Q +BT +8 0 0 8 134.96 141.76 Tm +/f-0-0 1 Tf +[(2. Time with a)3( slave node fail)3(ure)]TJ +ET +[ 4.8 4.8] 0 d +q 1 0 0 -1 0 180 cm +100.961 35.281 m 129.359 35.281 l 62.238 52.238 m 64.16 57.121 l 66.078 + 62 l 68 66.801 l 69.922 71.441 l 71.84 75.84 l 73.762 80.078 l 75.68 84.078 + l 77.602 87.762 l 79.52 91.039 l 81.441 93.922 l 83.359 96.398 l 85.281 + 98.398 l 87.199 100.16 l 89.121 101.602 l 91.039 102.801 l 92.961 103.84 + l 94.879 104.641 l 96.801 105.441 l 98.801 106.238 l 100.719 106.961 l +102.641 107.84 l 104.559 108.641 l 106.48 109.602 l 108.398 110.48 l 110.32 + 111.441 l 112.238 112.398 l 114.16 113.359 l 116.078 114.32 l 118 115.281 + l 119.922 116.238 l 121.84 117.121 l 123.762 117.922 l 125.68 118.719 l + 127.602 119.441 l 129.52 120 l 131.441 120.48 l 133.359 120.801 l 135.281 + 120.961 l 137.199 120.879 l 139.121 120.719 l 141.039 120.32 l 142.961 +119.762 l 144.879 119.121 l 146.801 118.398 l 148.719 117.68 l 150.641 116.961 + l 152.559 116.238 l 154.48 115.68 l 156.398 115.199 l 158.32 114.879 l +160.32 114.801 l 162.238 114.801 l 164.16 114.961 l 166.078 115.281 l 169.922 + 116.078 l 171.84 116.559 l 173.762 117.121 l 175.68 117.602 l 177.602 118.078 + l 179.52 118.559 l 181.441 119.039 l 183.359 119.441 l 185.281 119.84 l + 187.199 120.16 l 189.121 120.398 l 191.039 120.641 l 192.961 120.801 l +194.879 120.961 l 200.641 120.961 l 202.559 120.879 l 206.398 120.879 l +208.32 120.961 l 210.238 121.039 l 212.16 121.281 l 214.078 121.602 l 216 + 122 l 217.922 122.559 l 219.84 123.281 l 221.84 124 l 223.762 124.719 l + 225.68 125.441 l 227.602 126.16 l 229.52 126.801 l 231.441 127.441 l 233.359 + 127.922 l 235.281 128.238 l 237.199 128.48 l 239.121 128.559 l 241.039 +128.559 l 242.961 128.48 l 244.879 128.32 l 246.801 128.16 l 248.719 127.84 + l 250.641 127.602 l 252.559 127.281 l S Q +BT +8 0 0 8 134.96 129.76 Tm +/f-0-0 1 Tf +[(3. Time with a)3( master node fail)3(ure)]TJ +ET +0.801 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +59.238 50.441 6 6 re S Q +q 1 0 0 -1 0 180 cm +78.281 91.32 6 6 re S Q +q 1 0 0 -1 0 180 cm +97.32 91.32 6 6 re S Q +q 1 0 0 -1 0 180 cm +116.359 112.52 6 6 re S Q +q 1 0 0 -1 0 180 cm +135.398 116.762 6 6 re S Q +q 1 0 0 -1 0 180 cm +154.359 115.719 6 6 re S Q +q 1 0 0 -1 0 180 cm +173.398 117.641 6 6 re S Q +q 1 0 0 -1 0 180 cm +192.441 113.719 6 6 re S Q +q 1 0 0 -1 0 180 cm +211.48 122.359 6 6 re S Q +q 1 0 0 -1 0 180 cm +230.52 123.961 6 6 re S Q +q 1 0 0 -1 0 180 cm +249.559 122.199 6 6 re S Q +q 1 0 0 -1 0 180 cm +112.199 44.281 6 6 re S Q +BT +8 0 0 8 134.96 117.76 Tm +/f-0-0 1 Tf +[(4. Time with a)3( backup node failure)]TJ +ET +1.6 w +[ 2.4 2.4] 0 d +q 1 0 0 -1 0 180 cm +100.961 59.281 m 129.359 59.281 l 62.238 36.16 m 64.16 41.602 l 66.078 +46.961 l 68 52.238 l 69.922 57.359 l 71.84 62.398 l 73.762 67.121 l 75.68 + 71.68 l 77.602 75.84 l 79.52 79.762 l 81.441 83.199 l 83.359 86.32 l 85.281 + 89.039 l 87.199 91.441 l 89.121 93.52 l 91.039 95.441 l 92.961 97.121 l + 94.879 98.719 l 96.801 100.238 l 98.801 101.68 l 100.719 103.199 l 102.641 + 104.719 l 104.559 106.238 l 106.48 107.84 l 108.398 109.359 l 110.32 110.801 + l 112.238 112.16 l 114.16 113.441 l 116.078 114.559 l 118 115.52 l 119.922 + 116.238 l 121.84 116.801 l 123.762 117.199 l 125.68 117.441 l 127.602 117.602 + l 129.52 117.68 l 137.199 117.68 l 139.121 117.84 l 141.039 118.078 l 142.961 + 118.32 l 144.879 118.641 l 146.801 118.961 l 148.719 119.281 l 150.641 +119.602 l 152.559 119.84 l 154.48 120.078 l 156.398 120.16 l 158.32 120.16 + l 160.32 120 l 162.238 119.84 l 164.16 119.52 l 166.078 119.199 l 168 118.961 + l 169.922 118.641 l 171.84 118.48 l 173.762 118.32 l 175.68 118.238 l 177.602 + 118.398 l 179.52 118.641 l 181.441 118.961 l 183.359 119.441 l 185.281 +119.922 l 187.199 120.559 l 189.121 121.121 l 191.039 121.762 l 192.961 +122.398 l 194.879 123.039 l 196.801 123.52 l 198.719 124.078 l 200.641 124.559 + l 202.559 124.961 l 204.48 125.281 l 206.398 125.602 l 208.32 125.922 l + 210.238 126.16 l 212.16 126.398 l 214.078 126.559 l 216 126.719 l 217.922 + 126.801 l 219.84 126.879 l 221.84 126.961 l 225.68 126.961 l 227.602 127.039 + l 229.52 127.039 l 231.441 126.961 l 241.039 126.961 l 242.961 126.879 +l 252.559 126.879 l S Q +0.8 w +[] 0.0 d +q 1 0 0 -1 0 180 cm +43.199 11.281 m 43.199 139.602 l 252.559 139.602 l S Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/llncs.cls b/llncs.cls @@ -0,0 +1,1208 @@ +% LLNCS DOCUMENT CLASS -- version 2.18 (27-Sep-2013) +% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science +% +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{llncs}[2013/09/27 v2.18 +^^J LaTeX document class for Lecture Notes in Computer Science] +% Options +\let\if@envcntreset\iffalse +\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue} +\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y} +\DeclareOption{oribibl}{\let\oribibl=Y} +\let\if@custvec\iftrue +\DeclareOption{orivec}{\let\if@custvec\iffalse} +\let\if@envcntsame\iffalse +\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue} +\let\if@envcntsect\iffalse +\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue} +\let\if@runhead\iffalse +\DeclareOption{runningheads}{\let\if@runhead\iftrue} + +\let\if@openright\iftrue +\let\if@openbib\iffalse +\DeclareOption{openbib}{\let\if@openbib\iftrue} + +% languages +\let\switcht@@therlang\relax +\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}} +\def\ds@francais{\def\switcht@@therlang{\switcht@francais}} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} + +\ProcessOptions + +\LoadClass[twoside]{article} +\RequirePackage{multicol} % needed for the list of participants, index +\RequirePackage{aliascnt} + +\setlength{\textwidth}{12.2cm} +\setlength{\textheight}{19.3cm} +\renewcommand\@pnumwidth{2em} +\renewcommand\@tocrmarg{3.5em} +% +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{$\m@th + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu$}\hfill + \nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}% + \par}% + \fi} +% +\def\switcht@albion{% +\def\abstractname{Abstract.} +\def\ackname{Acknowledgement.} +\def\andname{and} +\def\lastandname{\unskip, and} +\def\appendixname{Appendix} +\def\chaptername{Chapter} +\def\claimname{Claim} +\def\conjecturename{Conjecture} +\def\contentsname{Table of Contents} +\def\corollaryname{Corollary} +\def\definitionname{Definition} +\def\examplename{Example} +\def\exercisename{Exercise} +\def\figurename{Fig.} +\def\keywordname{{\bf Keywords:}} +\def\indexname{Index} +\def\lemmaname{Lemma} +\def\contriblistname{List of Contributors} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\mailname{{\it Correspondence to\/}:} +\def\noteaddname{Note added in proof} +\def\notename{Note} +\def\partname{Part} +\def\problemname{Problem} +\def\proofname{Proof} +\def\propertyname{Property} +\def\propositionname{Proposition} +\def\questionname{Question} +\def\remarkname{Remark} +\def\seename{see} +\def\solutionname{Solution} +\def\subclassname{{\it Subject Classifications\/}:} +\def\tablename{Table} +\def\theoremname{Theorem}} +\switcht@albion +% Names of theorem like environments are already defined +% but must be translated if another language is chosen +% +% French section +\def\switcht@francais{%\typeout{On parle francais.}% + \def\abstractname{R\'esum\'e.}% + \def\ackname{Remerciements.}% + \def\andname{et}% + \def\lastandname{ et}% + \def\appendixname{Appendice} + \def\chaptername{Chapitre}% + \def\claimname{Pr\'etention}% + \def\conjecturename{Hypoth\`ese}% + \def\contentsname{Table des mati\`eres}% + \def\corollaryname{Corollaire}% + \def\definitionname{D\'efinition}% + \def\examplename{Exemple}% + \def\exercisename{Exercice}% + \def\figurename{Fig.}% + \def\keywordname{{\bf Mots-cl\'e:}} + \def\indexname{Index} + \def\lemmaname{Lemme}% + \def\contriblistname{Liste des contributeurs} + \def\listfigurename{Liste des figures}% + \def\listtablename{Liste des tables}% + \def\mailname{{\it Correspondence to\/}:} + \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}% + \def\notename{Remarque}% + \def\partname{Partie}% + \def\problemname{Probl\`eme}% + \def\proofname{Preuve}% + \def\propertyname{Caract\'eristique}% +%\def\propositionname{Proposition}% + \def\questionname{Question}% + \def\remarkname{Remarque}% + \def\seename{voir} + \def\solutionname{Solution}% + \def\subclassname{{\it Subject Classifications\/}:} + \def\tablename{Tableau}% + \def\theoremname{Th\'eor\`eme}% +} +% +% German section +\def\switcht@deutsch{%\typeout{Man spricht deutsch.}% + \def\abstractname{Zusammenfassung.}% + \def\ackname{Danksagung.}% + \def\andname{und}% + \def\lastandname{ und}% + \def\appendixname{Anhang}% + \def\chaptername{Kapitel}% + \def\claimname{Behauptung}% + \def\conjecturename{Hypothese}% + \def\contentsname{Inhaltsverzeichnis}% + \def\corollaryname{Korollar}% +%\def\definitionname{Definition}% + \def\examplename{Beispiel}% + \def\exercisename{\"Ubung}% + \def\figurename{Abb.}% + \def\keywordname{{\bf Schl\"usselw\"orter:}} + \def\indexname{Index} +%\def\lemmaname{Lemma}% + \def\contriblistname{Mitarbeiter} + \def\listfigurename{Abbildungsverzeichnis}% + \def\listtablename{Tabellenverzeichnis}% + \def\mailname{{\it Correspondence to\/}:} + \def\noteaddname{Nachtrag}% + \def\notename{Anmerkung}% + \def\partname{Teil}% +%\def\problemname{Problem}% + \def\proofname{Beweis}% + \def\propertyname{Eigenschaft}% +%\def\propositionname{Proposition}% + \def\questionname{Frage}% + \def\remarkname{Anmerkung}% + \def\seename{siehe} + \def\solutionname{L\"osung}% + \def\subclassname{{\it Subject Classifications\/}:} + \def\tablename{Tabelle}% +%\def\theoremname{Theorem}% +} + +% Ragged bottom for the actual page +\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil +\global\let\@textbottom\relax}} + +\renewcommand\small{% + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@}% + \belowdisplayskip \abovedisplayskip +} + +\frenchspacing +\widowpenalty=10000 +\clubpenalty=10000 + +\setlength\oddsidemargin {63\p@} +\setlength\evensidemargin {63\p@} +\setlength\marginparwidth {90\p@} + +\setlength\headsep {16\p@} + +\setlength\footnotesep{7.7\p@} +\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {8mm\@plus 2\p@ \@minus 2\p@} + +\setcounter{secnumdepth}{2} + +\newcounter {chapter} +\renewcommand\thechapter {\@arabic\c@chapter} + +\newif\if@mainmatter \@mainmattertrue +\newcommand\frontmatter{\cleardoublepage + \@mainmatterfalse\pagenumbering{Roman}} +\newcommand\mainmatter{\cleardoublepage + \@mainmattertrue\pagenumbering{arabic}} +\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi + \@mainmatterfalse} + +\renewcommand\part{\cleardoublepage + \thispagestyle{empty}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \null\vfil + \secdef\@part\@spart} + +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \partname~\thepart + \par + \vskip 20\p@ + \fi + \Huge \bfseries #2\par}% + \@endpart} +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \normalfont + \Huge \bfseries #1\par}% + \@endpart} +\def\@endpart{\vfil\newpage + \if@twoside + \null + \thispagestyle{empty}% + \newpage + \fi + \if@tempswa + \twocolumn + \fi} + +\newcommand\chapter{\clearpage + \thispagestyle{empty}% + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +\def\@makechapterhead#1{% +% \vspace*{50\p@}% + {\centering + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \large\bfseries \@chapapp{} \thechapter + \par\nobreak + \vskip 20\p@ + \fi + \fi + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +\def\@makeschapterhead#1{% +% \vspace*{50\p@}% + {\centering + \normalfont + \interlinepenalty\@M + \Large \bfseries #1\par\nobreak + \vskip 40\p@ + }} + +\renewcommand\section{\@startsection{section}{1}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {12\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\large\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {8\p@ \@plus 4\p@ \@minus 4\p@}% + {\normalfont\normalsize\bfseries\boldmath + \rightskip=\z@ \@plus 8em\pretolerance=10000 }} +\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-18\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\bfseries\boldmath}} +\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {-12\p@ \@plus -4\p@ \@minus -4\p@}% + {-0.5em \@plus -0.22em \@minus -0.1em}% + {\normalfont\normalsize\itshape}} +\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use + \string\subparagraph\space with this class}\vskip0.5cm +You should not use \verb|\subparagraph| with this class.\vskip0.5cm} + +\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A} + +\let\footnotesize\small + +\if@custvec +\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}} +{\mbox{\boldmath$\textstyle#1$}} +{\mbox{\boldmath$\scriptstyle#1$}} +{\mbox{\boldmath$\scriptscriptstyle#1$}}} +\fi + +\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}} +\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil +\penalty50\hskip1em\null\nobreak\hfil\squareforqed +\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi} + +\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr\gets\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets +\cr\to\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +\gets\cr\to\cr}}}}} +\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +<\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr +\noalign{\vskip1.2pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr +\noalign{\vskip1pt}=\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr +\noalign{\vskip0.9pt}=\cr}}}}} +\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip +\halign{\hfil +$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr +>\cr\noalign{\vskip-1pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.8pt}<\cr}}} +{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr +>\cr\noalign{\vskip-0.3pt}<\cr}}}}} +\def\bbbr{{\rm I\!R}} %reelle Zahlen +\def\bbbm{{\rm I\!M}} +\def\bbbn{{\rm I\!N}} %natuerliche Zahlen +\def\bbbf{{\rm I\!F}} +\def\bbbh{{\rm I\!H}} +\def\bbbk{{\rm I\!K}} +\def\bbbp{{\rm I\!P}} +\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l} +{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}} +\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox +to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise +0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}} +\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm +T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox +to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}} +\def\bbbs{{\mathchoice +{\setbox0=\hbox{$\displaystyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\textstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox +to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptstyle \rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}} +{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox +to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox +to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}} +\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}} +{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}} +{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}} + +\let\ts\, + +\setlength\leftmargini {17\p@} +\setlength\leftmargin {\leftmargini} +\setlength\leftmarginii {\leftmargini} +\setlength\leftmarginiii {\leftmargini} +\setlength\leftmarginiv {\leftmargini} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} + +\def\@listI{\leftmargin\leftmargini + \parsep 0\p@ \@plus1\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep0\p@} +\let\@listi\@listI +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus2\p@ \@minus\p@} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep 0\p@ \@plus\p@\@minus\p@ + \parsep \z@ + \partopsep \p@ \@plus\z@ \@minus\p@} + +\renewcommand\labelitemi{\normalfont\bfseries --} +\renewcommand\labelitemii{$\m@th\bullet$} + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}% + {{\contentsname}}} + \def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}} + \def\lastand{\ifnum\value{auco}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{auco}% + \lastand + \else + \unskip, + \fi}% + \@starttoc{toc}\if@restonecol\twocolumn\fi} + +\def\l@part#1#2{\addpenalty{\@secpenalty}% + \addvspace{2em plus\p@}% % space above part line + \begingroup + \parindent \z@ + \rightskip \z@ plus 5em + \hrule\vskip5pt + \large % same size as for a contribution heading + \bfseries\boldmath % set line in boldface + \leavevmode % TeX command to enter horizontal mode. + #1\par + \vskip5pt + \hrule + \vskip1pt + \nobreak % Never break after part entry + \endgroup} + +\def\@dotsep{2} + +\let\phantomsection=\relax + +\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else +{}\fi} + +\def\addnumcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline + {\thechapter}#3}{\thepage}\hyperhrefextend}}% +\def\addcontentsmark#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}% +\def\addcontentsmarkwop#1#2#3{% +\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}% + +\def\@adcmk[#1]{\ifcase #1 \or +\def\@gtempa{\addnumcontentsmark}% + \or \def\@gtempa{\addcontentsmark}% + \or \def\@gtempa{\addcontentsmarkwop}% + \fi\@gtempa{toc}{chapter}% +} +\def\addtocmark{% +\phantomsection +\@ifnextchar[{\@adcmk}{\@adcmk[3]}% +} + +\def\l@chapter#1#2{\addpenalty{-\@highpenalty} + \vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + {\large\bfseries\boldmath#1}\ifx0#2\hfil\null + \else + \nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}% + \fi\par + \penalty\@highpenalty \endgroup} + +\def\l@title#1#2{\addpenalty{-\@highpenalty} + \addvspace{8pt plus 1pt} + \@tempdima \z@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \parfillskip -\rightskip \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip + #1\nobreak + \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern + \@dotsep mu$}\hfill + \nobreak\hbox to\@pnumwidth{\hss #2}\par + \penalty\@highpenalty \endgroup} + +\def\l@author#1#2{\addpenalty{\@highpenalty} + \@tempdima=15\p@ %\z@ + \begingroup + \parindent \z@ \rightskip \@tocrmarg + \advance\rightskip by 0pt plus 2cm + \pretolerance=10000 + \leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip + \textit{#1}\par + \penalty\@highpenalty \endgroup} + +\setcounter{tocdepth}{0} +\newdimen\tocchpnum +\newdimen\tocsecnum +\newdimen\tocsectotal +\newdimen\tocsubsecnum +\newdimen\tocsubsectotal +\newdimen\tocsubsubsecnum +\newdimen\tocsubsubsectotal +\newdimen\tocparanum +\newdimen\tocparatotal +\newdimen\tocsubparanum +\tocchpnum=\z@ % no chapter numbers +\tocsecnum=15\p@ % section 88. plus 2.222pt +\tocsubsecnum=23\p@ % subsection 88.8 plus 2.222pt +\tocsubsubsecnum=27\p@ % subsubsection 88.8.8 plus 1.444pt +\tocparanum=35\p@ % paragraph 88.8.8.8 plus 1.666pt +\tocsubparanum=43\p@ % subparagraph 88.8.8.8.8 plus 1.888pt +\def\calctocindent{% +\tocsectotal=\tocchpnum +\advance\tocsectotal by\tocsecnum +\tocsubsectotal=\tocsectotal +\advance\tocsubsectotal by\tocsubsecnum +\tocsubsubsectotal=\tocsubsectotal +\advance\tocsubsubsectotal by\tocsubsubsecnum +\tocparatotal=\tocsubsubsectotal +\advance\tocparatotal by\tocparanum} +\calctocindent + +\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}} +\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}} +\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}} +\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}} +\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}} + +\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}} + \@starttoc{lof}\if@restonecol\twocolumn\fi} +\def\l@figure{\@dottedtocline{1}{0em}{1.5em}} + +\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}} + \@starttoc{lot}\if@restonecol\twocolumn\fi} +\let\l@table\l@figure + +\renewcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\listfigurename}{\listfigurename}}% + \@starttoc{lof}% + } + +\renewcommand\listoftables{% + \section*{\listtablename + \@mkboth{\listtablename}{\listtablename}}% + \@starttoc{lot}% + } + +\ifx\oribibl\undefined +\ifx\citeauthoryear\undefined +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \def\@biblabel##1{##1.} + \small + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw + {\let\protect\noexpand\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\newcount\@tempcntc +\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi + \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do + {\@ifundefined + {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries + ?}\@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}% + \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne + \@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}% + \else + \advance\@tempcntb\@ne + \ifnum\@tempcntb=\@tempcntc + \else\advance\@tempcntb\m@ne\@citeo + \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}} +\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else + \@citea\def\@citea{,\,\hskip\z@skip}% + \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else + {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else + \def\@citea{--}\fi + \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi} +\else +\renewenvironment{thebibliography}[1] + {\section*{\refname} + \small + \list{}% + {\settowidth\labelwidth{}% + \leftmargin\parindent + \itemindent=-\parindent + \labelsep=\z@ + \if@openbib + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + \fi + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{}}% + \if@openbib + \renewcommand\newblock{\par}% + \else + \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% + \fi + \sloppy\clubpenalty4000\widowpenalty4000% + \sfcode`\.=\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} + \def\@cite#1{#1}% + \def\@lbibitem[#1]#2{\item[]\if@filesw + {\def\protect##1{\string ##1\space}\immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} + \fi +\else +\@cons\@openbib@code{\noexpand\small} +\fi + +\def\idxquad{\hskip 10\p@}% space that divides entry from number + +\def\@idxitem{\par\hangindent 10\p@} + +\def\subitem{\par\setbox0=\hbox{--\enspace}% second order + \noindent\hangindent\wd0\box0}% index entry + +\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third + \noindent\hangindent\wd0\box0}% order index entry + +\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax} + +\renewenvironment{theindex} + {\@mkboth{\indexname}{\indexname}% + \thispagestyle{empty}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\par + \def\,{\relax\ifmmode\mskip\thinmuskip + \else\hskip0.2em\ignorespaces\fi}% + \normalfont\small + \begin{multicols}{2}[\@makeschapterhead{\indexname}]% + } + {\end{multicols}} + +\renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width 2truecm + \kern2.6\p@} + \newdimen\fnindent + \fnindent1em +\long\def\@makefntext#1{% + \parindent \fnindent% + \leftskip \fnindent% + \noindent + \llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1} + +\long\def\@makecaption#1#2{% + \small + \vskip\abovecaptionskip + \sbox\@tempboxa{{\bfseries #1.} #2}% + \ifdim \wd\@tempboxa >\hsize + {\bfseries #1.} #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} + +\def\fps@figure{htbp} +\def\fnum@figure{\figurename\thinspace\thefigure} +\def \@floatboxreset {% + \reset@font + \small + \@setnobreak + \@setminipage +} +\def\fps@table{htbp} +\def\fnum@table{\tablename~\thetable} +\renewenvironment{table} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@float{table}} + {\end@float} +\renewenvironment{table*} + {\setlength\abovecaptionskip{0\p@}% + \setlength\belowcaptionskip{10\p@}% + \@dblfloat{table}} + {\end@dblfloat} + +\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname + ext@#1\endcsname}{#1}{\protect\numberline{\csname + the#1\endcsname}{\ignorespaces #2}}\begingroup + \@parboxrestore + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} + +% LaTeX does not provide a command to enter the authors institute +% addresses. The \institute command is defined here. + +\newcounter{@inst} +\newcounter{@auth} +\newcounter{auco} +\newdimen\instindent +\newbox\authrun +\newtoks\authorrunning +\newtoks\tocauthor +\newbox\titrun +\newtoks\titlerunning +\newtoks\toctitle + +\def\clearheadinfo{\gdef\@author{No Author Given}% + \gdef\@title{No Title Given}% + \gdef\@subtitle{}% + \gdef\@institute{No Institute Given}% + \gdef\@thanks{}% + \global\titlerunning={}\global\authorrunning={}% + \global\toctitle={}\global\tocauthor={}} + +\def\institute#1{\gdef\@institute{#1}} + +\def\institutename{\par + \begingroup + \parskip=\z@ + \parindent=\z@ + \setcounter{@inst}{1}% + \def\and{\par\stepcounter{@inst}% + \noindent$^{\the@inst}$\enspace\ignorespaces}% + \setbox0=\vbox{\def\thanks##1{}\@institute}% + \ifnum\c@@inst=1\relax + \gdef\fnnstart{0}% + \else + \xdef\fnnstart{\c@@inst}% + \setcounter{@inst}{1}% + \noindent$^{\the@inst}$\enspace + \fi + \ignorespaces + \@institute\par + \endgroup} + +\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or + {\star\star\star}\or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi}} + +\def\inst#1{\unskip$^{#1}$} +\def\fnmsep{\unskip$^,$} +\def\email#1{{\tt#1}} +\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}% +\@ifpackageloaded{babel}{% +\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}% +\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}% +\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}% +\@ifundefined{extrasngerman}{}{\addto\extrasngerman{\switcht@deutsch}}% +}{\switcht@@therlang}% +\providecommand{\keywords}[1]{\par\addvspace\baselineskip +\noindent\keywordname\enspace\ignorespaces#1}% +} +\def\homedir{\~{ }} + +\def\subtitle#1{\gdef\@subtitle{#1}} +\clearheadinfo +% +%%% to avoid hyperref warnings +\providecommand*{\toclevel@author}{999} +%%% to make title-entry parent of section-entries +\providecommand*{\toclevel@title}{0} +% +\renewcommand\maketitle{\newpage +\phantomsection + \refstepcounter{chapter}% + \stepcounter{section}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{figure}{0} + \setcounter{table}{0} + \setcounter{equation}{0} + \setcounter{footnote}{0}% + \begingroup + \parindent=\z@ + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{empty}\@thanks +% + \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}% + \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}% + \instindent=\hsize + \advance\instindent by-\headlineindent + \if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else + \addcontentsline{toc}{title}{\the\toctitle}\fi + \if@runhead + \if!\the\titlerunning!\else + \edef\@title{\the\titlerunning}% + \fi + \global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}% + \ifdim\wd\titrun>\instindent + \typeout{Title too long for running head. Please supply}% + \typeout{a shorter form with \string\titlerunning\space prior to + \string\maketitle}% + \global\setbox\titrun=\hbox{\small\rm + Title Suppressed Due to Excessive Length}% + \fi + \xdef\@title{\copy\titrun}% + \fi +% + \if!\the\tocauthor!\relax + {\def\and{\noexpand\protect\noexpand\and}% + \protected@xdef\toc@uthor{\@author}}% + \else + \def\\{\noexpand\protect\noexpand\newline}% + \protected@xdef\scratch{\the\tocauthor}% + \protected@xdef\toc@uthor{\scratch}% + \fi + \addtocontents{toc}{\noexpand\protect\noexpand\authcount{\the\c@auco}}% + \addcontentsline{toc}{author}{\toc@uthor}% + \if@runhead + \if!\the\authorrunning! + \value{@inst}=\value{@auth}% + \setcounter{@auth}{1}% + \else + \edef\@author{\the\authorrunning}% + \fi + \global\setbox\authrun=\hbox{\small\unboldmath\@author\unskip}% + \ifdim\wd\authrun>\instindent + \typeout{Names of authors too long for running head. Please supply}% + \typeout{a shorter form with \string\authorrunning\space prior to + \string\maketitle}% + \global\setbox\authrun=\hbox{\small\rm + Authors Suppressed Due to Excessive Length}% + \fi + \xdef\@author{\copy\authrun}% + \markboth{\@author}{\@title}% + \fi + \endgroup + \setcounter{footnote}{\fnnstart}% + \clearheadinfo} +% +\def\@maketitle{\newpage + \markboth{}{}% + \def\lastand{\ifnum\value{@inst}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{@inst}% + \lastand + \else + \unskip, + \fi}% + \begin{center}% + \let\newline\\ + {\Large \bfseries\boldmath + \pretolerance=10000 + \@title \par}\vskip .8cm +\if!\@subtitle!\else {\large \bfseries\boldmath + \vskip -.65cm + \pretolerance=10000 + \@subtitle \par}\vskip .8cm\fi + \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}% + \def\thanks##1{}\@author}% + \global\value{@inst}=\value{@auth}% + \global\value{auco}=\value{@auth}% + \setcounter{@auth}{1}% +{\lineskip .5em +\noindent\ignorespaces +\@author\vskip.35cm} + {\small\institutename} + \end{center}% + } + +% definition of the "\spnewtheorem" command. +% +% Usage: +% +% \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font} +% or \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font} +% or \spnewtheorem*{env_nam}{caption}{cap_font}{body_font} +% +% New is "cap_font" and "body_font". It stands for +% fontdefinition of the caption and the text itself. +% +% "\spnewtheorem*" gives a theorem without number. +% +% A defined spnewthoerem environment is used as described +% by Lamport. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def\@thmcountersep{} +\def\@thmcounterend{.} + +\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}} + +% definition of \spnewtheorem with number + +\def\@spnthm#1#2{% + \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}} +\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}} + +\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@addtoreset{#1}{#3}% + \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand + \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@spothm#1[#2]#3#4#5{% + \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\newaliascnt{#1}{#2}% + \expandafter\xdef\csname #1name\endcsname{#3}% + \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}% + \global\@namedef{end#1}{\@endtheorem}}}} + +\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\refstepcounter{#1}% +\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}} + +\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}% + \ignorespaces} + +\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname + the#1\endcsname}{#5}{#3}{#4}\ignorespaces} + +\def\@spbegintheorem#1#2#3#4{\trivlist + \item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4} + +\def\@spopargbegintheorem#1#2#3#4#5{\trivlist + \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5} + +% definition of \spnewtheorem* without number + +\def\@sthm#1#2{\@Ynthm{#1}{#2}} + +\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}% + \expandafter\xdef\csname #1name\endcsname{#2}% + \global\@namedef{end#1}{\@endtheorem}}} + +\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@ +\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}} + +\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces} + +\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1} + {#4}{#2}{#3}\ignorespaces} + +\def\@Begintheorem#1#2#3{#3\trivlist + \item[\hskip\labelsep{#2#1\@thmcounterend}]} + +\def\@Opargbegintheorem#1#2#3#4{#4\trivlist + \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }} + +\if@envcntsect + \def\@thmcountersep{.} + \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape} +\else + \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape} + \if@envcntreset + \@addtoreset{theorem}{section} + \else + \@addtoreset{theorem}{chapter} + \fi +\fi + +%definition of divers theorem environments +\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily} +\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily} +\if@envcntsame % alle Umgebungen wie Theorem. + \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}} +\else % alle Umgebungen mit eigenem Zaehler + \if@envcntsect % mit section numeriert + \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}} + \else % nicht mit section numeriert + \if@envcntreset + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{section}} + \else + \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4} + \@addtoreset{#1}{chapter}}% + \fi + \fi +\fi +\spn@wtheorem{case}{Case}{\itshape}{\rmfamily} +\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily} +\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape} +\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape} +\spn@wtheorem{example}{Example}{\itshape}{\rmfamily} +\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily} +\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape} +\spn@wtheorem{note}{Note}{\itshape}{\rmfamily} +\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily} +\spn@wtheorem{property}{Property}{\itshape}{\rmfamily} +\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape} +\spn@wtheorem{question}{Question}{\itshape}{\rmfamily} +\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily} +\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily} + +\def\@takefromreset#1#2{% + \def\@tempa{#1}% + \let\@tempd\@elt + \def\@elt##1{% + \def\@tempb{##1}% + \ifx\@tempa\@tempb\else + \@addtoreset{##1}{#2}% + \fi}% + \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname + \expandafter\def\csname cl@#2\endcsname{}% + \@tempc + \let\@elt\@tempd} + +\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist + \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5} + \def\@Opargbegintheorem##1##2##3##4{##4\trivlist + \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }} + } + +\renewenvironment{abstract}{% + \list{}{\advance\topsep by0.35cm\relax\small + \leftmargin=1cm + \labelwidth=\z@ + \listparindent=\z@ + \itemindent\listparindent + \rightmargin\leftmargin}\item[\hskip\labelsep + \bfseries\abstractname]} + {\endlist} + +\newdimen\headlineindent % dimension for space between +\headlineindent=1.166cm % number and text of headings. + +\def\ps@headings{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \leftmark\hfil} + \def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\def\ps@titlepage{\let\@mkboth\@gobbletwo + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}% + \hfil} + \def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}% + \llap{\thepage}} + \def\chaptermark##1{}% + \def\sectionmark##1{}% + \def\subsectionmark##1{}} + +\if@runhead\ps@headings\else +\ps@empty\fi + +\setlength\arraycolsep{1.4\p@} +\setlength\tabcolsep{1.4\p@} + +\endinput +%end of file llncs.cls diff --git a/main.tex b/main.tex @@ -0,0 +1,57 @@ +\documentclass[runningheads,a4paper]{llncs} + +\usepackage{amssymb} +\setcounter{tocdepth}{3} +\usepackage{graphicx} +\graphicspath{ {graphics/} } +\usepackage{cite} +\usepackage{amsmath} +\usepackage{booktabs} + +\usepackage{url} +\urldef{\mailsa}\path|{i.gankevich,y.tipikin,v.korkhov}@spbu.ru| +\urldef{\mailsb}\path|gvladimiru@gmail.com| +\urldef{\mailsc}\path|{deg,bogdanov}@csa.ru| + +\begin{document} + +\mainmatter + +\title{Factory:\\Master node high-availability for Big Data applications and beyond} + +\author{% +Ivan Gankevich% +\and Yuri Tipikin% +\and Vladimir Korkhov% +\and Vladimir Gaiduchok% +\and Alexander Degtyarev% +\and Alexander Bogdanov% +} + +\institute{% +Saint Petersburg State University,\\ +Dept. of Computer Modelling and Multiprocessor Systems\\ +Universitetskaia emb. 7-9, 199034 Saint Petersburg, Russia\\ +\mailsa\\ +\mailsb\\ +\mailsc\\ +\url{http://spbu.ru/}% +} + +\titlerunning{Factory: Master node high-availability} +\authorrunning{Gankevich et al.} + +\toctitle{Factory: Master node high-availability} +\tocauthor{Gankevich et al.} + +\maketitle + +\input{src/abstract} +\input{src/intro} +\input{src/sections} +\input{src/outro} + +\bibliography{src/refs}{} +\bibliographystyle{splncs03} + +\end{document} diff --git a/splncs03.bst b/splncs03.bst @@ -0,0 +1,1519 @@ +%% BibTeX bibliography style `splncs03' +%% +%% BibTeX bibliography style for use with numbered references in +%% Springer Verlag's "Lecture Notes in Computer Science" series. +%% (See Springer's documentation for llncs.cls for +%% more details of the suggested reference format.) Note that this +%% file will not work for author-year style citations. +%% +%% Use \documentclass{llncs} and \bibliographystyle{splncs03}, and cite +%% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text. +%% +%% This file comes to you courtesy of Maurizio "Titto" Patrignani of +%% Dipartimento di Informatica e Automazione Universita' Roma Tre +%% +%% ================================================================================================ +%% This was file `titto-lncs-02.bst' produced on Wed Apr 1, 2009 +%% Edited by hand by titto based on `titto-lncs-01.bst' (see below) +%% +%% CHANGES (with respect to titto-lncs-01.bst): +%% - Removed the call to \urlprefix (thus no "URL" string is added to the output) +%% ================================================================================================ +%% This was file `titto-lncs-01.bst' produced on Fri Aug 22, 2008 +%% Edited by hand by titto based on `titto.bst' (see below) +%% +%% CHANGES (with respect to titto.bst): +%% - Removed the "capitalize" command for editors string "(eds.)" and "(ed.)" +%% - Introduced the functions titto.bbl.pages and titto.bbl.page for journal pages (without "pp.") +%% - Added a new.sentence command to separate with a dot booktitle and series in the inproceedings +%% - Commented all new.block commands before urls and notes (to separate them with a comma) +%% - Introduced the functions titto.bbl.volume for handling journal volumes (without "vol." label) +%% - Used for editors the same name conventions used for authors (see function format.in.ed.booktitle) +%% - Removed a \newblock to avoid long spaces between title and "In: ..." +%% - Added function titto.space.prefix to add a space instead of "~" after the (removed) "vol." label +%% ================================================================================================ +%% This was file `titto.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `vonx,nm-rvvc,yr-par,jttl-rm,volp-com,jwdpg,jwdvol,numser,ser-vol,jnm-x,btit-rm,bt-rm,edparxc,bkedcap,au-col,in-col,fin-bare,pp,ed,abr,mth-bare,xedn,jabr,and-com,and-com-ed,xand,url,url-blk,em-x,nfss,') +%% ---------------------------------------- +%% *** Tentative .bst file for Springer LNCS *** +%% +%% Copyright 1994-2007 Patrick W Daly + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This generated file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2007/04/24 4.20 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is alphabetical by authors. + %--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + edition + editor + eid + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ +% newline$ +% "\newblock " write$ % removed for titto-lncs-01 + " " write$ % to avoid long spaces between title and "In: ..." + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + + +FUNCTION {add.colon} +{ duplicate$ empty$ + 'skip$ + { ":" * add.blank } + if$ +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +STRINGS {z} +FUNCTION {remove.dots} +{ 'z := + "" + { z empty$ not } + { z #1 #1 substring$ + z #2 global.max$ substring$ 'z := + duplicate$ "." = 'pop$ + { * } + if$ + } + while$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ skip$ } +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} +FUNCTION {titto.space.prefix} % always introduce a space +{ duplicate$ text.length$ #3 < + { " " } + { " " } + if$ + swap$ +} + + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {titto.bbl.volume} % for handling journals +{ "" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {titto.bbl.pages} % for journals +{ "" } + +FUNCTION {titto.bbl.page} % for journals +{ "" } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {format.url} +{ url empty$ + { "" } +% { "\urlprefix\url{" url * "}" * } + { "\url{" url * "}" * } % changed in titto-lncs-02.bst + if$ +} + +INTEGERS { nameptr namesleft numnames } + + +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, jj}{, f{.}.}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f{.}.~}{vv~}{ll}{ jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { emphasize ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + pages multi.page.check + 'titto.bbl.pages + 'titto.bbl.page + if$ + swap$ tie.or.space.prefix + "pages" bibinfo.check + * * + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} % this function is used only for journal entries +{ volume field.or.null + duplicate$ empty$ 'skip$ + { +% bbl.volume swap$ tie.or.space.prefix + titto.bbl.volume swap$ titto.space.prefix +% rationale for the change above: for journals you don't want "vol." label +% hence it does not make sense to attach the journal number to the label when +% it is short + "volume" bibinfo.check + * * + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { +% editor "editor" format.names.ed duplicate$ empty$ 'pop$ % changed by titto + editor "editor" format.names duplicate$ empty$ 'pop$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ") " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check emphasize word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + "editor" bibinfo.check + " " * bbl.etal + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + "editor" bibinfo.check + " " * bbl.etal + * + } + { + bbl.and space.word + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series emphasize * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + "journal" output.check + add.blank + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + add.colon + new.block + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { + format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.chapter.pages output + new.sentence + format.number.series output + format.publisher.address output + format.edition output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence % added by titto + format.bvolume output + format.pages output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.edition output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + add.colon + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry + empty.misc.check +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + format.bvolume output + editor empty$ + { publisher empty$ + { format.number.series output } + { + new.sentence + format.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.number.series output + format.organization.address output } + { + new.sentence + format.number.series output + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + format.date output +% new.block + format.url output +% new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {presort} +SORT +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{\texttt{#1}}" + write$ newline$ + "\providecommand{\urlprefix}{URL }" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `titto.bst'. + + diff --git a/src/abstract.tex b/src/abstract.tex @@ -0,0 +1,5 @@ +\begin{abstract} +Master node fault-tolerance is the topic that is often dimmed in the discussion of big data processing technologies. Although failure of a master node can take down the whole data processing pipeline, this is considered either improbable or too difficult to encounter. The aim of the studies reported here is to propose rather simple technique to deal with master-node failures. This technique is based on temporary delegation of master role to one of the slave nodes and transferring updated state back to the master when one step of computation is complete. That way the state is duplicated and computation can proceed to the next step regardless of a failure of a delegate or the master (but not both). We run benchmarks to show that a failure of a master is almost ``invisible'' to other nodes, and failure of a delegate results in recomputation of only one step of data processing pipeline. We believe that the technique can be used not only in Big Data processing but in other types of applications. + +\keywords{parallel computing $\cdot$ Big Data processing $\cdot$ distributed computing $\cdot$ backup node $\cdot$ state transfer $\cdot$ delegation $\cdot$ cluster computing $\cdot$ fault-tolerance} +\end{abstract}+ \ No newline at end of file diff --git a/src/intro.tex b/src/intro.tex @@ -0,0 +1,25 @@ +\section{Introduction} + +Fault tolerance of data processing pipelines is one of the top concerns in development of job schedulers for big data processing, however, most schedulers provide fault tolerance for subordinate nodes only. These types of failures are routinely mitigated by restarting the failed job or its part on healthy nodes, and failure of a master node is often considered either improbable, or too complicated to handle and configure on the target platform. System administrators often find alternatives to application level fault tolerance: they isolate master node from the rest of the cluster by placing it on a dedicated machine, or use virtualisation technologies instead. All these alternatives complexify configuration and maintenance, and by decreasing probability of a machine failure resulting in a whole system failure, they increase probability of a human error. + +From such point of view it seems more practical to implement master node fault tolerance at application level, however, there is no generic implementation. Most implementations are too tied to a particular application to become universally acceptable. We believe that this happens due to people's habit to think of a cluster as a collection of individual machines each of which can be either master or slave, rather than to think of a cluster as a whole with master and slave roles being dynamically assigned to a particular physical machine. + +This evolution in thinking allows to implement middleware that manages master and slave roles automatically and handles node failures in a generic way. This software provides an API to distribute parallel tasks on the pool of available nodes and among them. Using this API one can write an application that runs on a cluster without knowing the exact number of online nodes. The middleware works as a cluster operating system overlay allowing to write distributed applications. + +\section{Related work} + +Dynamic role assignment is an emerging trend in design of distributed systems~\cite{ostrovsky2015couchbase,divya2013elasticsearch,boyer2012glusterfs,anderson2010couchdb,lakshman2010cassandra}, however, it is still not used in big data job schedulers. For example, in popular YARN job scheduler~\cite{vavilapalli2013yarn}, which is used by Hadoop and Spark big data analysis frameworks, master and slave roles are static. Failure of a slave node is tolerated by restarting a part of a job on a healthy node, and failure of a master node is tolerated by setting up standby reserved server~\cite{murthy2011architecture}. Both master servers are coordinated by Zookeeper service which itself uses dynamic role assignment to ensure its fault-tolerance~\cite{okorafor2012zookeeper}. So, the whole setup is complicated due to Hadoop scheduler lacking dynamic roles: if dynamic roles were available, Zookeeper would be redundant in this setup. Moreover, this setup does not guarantee continuous operation of master node because standby server needs time to recover current state after a failure. + +The same problem occurs in high-performance computing where master node of a job scheduler is the single point of failure. In~\cite{uhlemann2006joshua,engelmann2006symmetric} the authors use replication to make the master node highly-available, but backup server role is assigned statically and cannot be delegated to a healthy worker node. This solution is closer to fully dynamic role assignment than high-availability solution for big data schedulers, because it does not involve using external service to store configuration which should also be highly-available, however, it is far from ideal solution where roles are completely decoupled from physical servers. + +Finally, the simplest master node high-availability is implemented in Virtual Router Redundancy Protocol (VRRP)~\cite{knight1998rfc2338,hinden2004virtual,nadas2010rfc5798}. Although VRRP protocol does provide master and backup node roles, which are dynamically assigned to available routers, this protocol works on top of the IPv4 and IPv6 protocols and is designed to be used by routers and reverse proxy servers. Such servers lack the state that needs to be restored upon a failure (i.e.~there is no job queue in web servers), so it is easier for them to provide high-availability. In Linux it is implemented in Keepalived routing daemon~\cite{cassen2002keepalived}. + +In contrast to web servers and HPC and Big Data job schedulers, some distributed key-value stores and parallel file systems have symmetric architecture, where master and slave roles are assigned dynamically, so that any node can act as a master when the current master node fails~\cite{ostrovsky2015couchbase,divya2013elasticsearch,boyer2012glusterfs,anderson2010couchdb,lakshman2010cassandra}. This design decision simplifies management and interaction with a distributed system. From system administrator point of view it is much simpler to install the same software stack on each node than to manually configure master and slave nodes. Additionally, it is much easier to bootstrap new nodes into the cluster and decommission old ones. From user point of view, it is much simpler to provide web service high-availability and load-balancing when you have multiple backup nodes to connect to. + +Dynamic role assignment would be beneficial for Big Data job schedulers because it allows to decouple distributed services from physical nodes, which is the first step to build highly-available distributed service. The reason that there is no general solution to this problem is that there is no generic programming environment to write and execute distributed programmes. The aim of this work is to propose such an environment and to describe its internal structure. + +The programming model used in this work is partly based on well-known actor model of concurrent computation~\cite{agha1985actors,hewitt1973universal}. Our model borrows the concept of actor---an object that stores data and methods to process it; this object can react to external events by either changing its state or producing more actors. We call this objects \emph{computational kernels}. Their distinct feature is hierarchical dependence on parent kernel that created each of them, which allows to implement fault-tolerance based on simple restart of a failed subordinate kernel. + +However, using hierarchical dependence alone is not enough to develop high-availability of a master kernel---the first kernel in a parallel programme. To solve the problem the other part of our programming model is based on bulk-synchronous parallel model~\cite{valiant1990bridging}. It borrows the concept of superstep---a sequential step of a parallel programme; at any time a programme executes only one superstep, which allows to implement high-availability of the first kernel (under assumption that it has only one subordinate at a time) by sending it along its subordinate to a different cluster node thus making a distributed copy of it. Since the first kernel has only one subordinate at a time, its copy is always consistent with the original kernel. This eliminates the need for complex distributed transactions and distributed consensus algorithms and guarantees protection from at most one master node failure per superstep. + +To summarise, the framework developed in this paper protects a parallel programme from failure of any number of subordinate nodes and from one failure of a master node per superstep. The paper does not answer the question of how to determine if a node failed, it assumes a failure when the network connection to a node is prematurely closed. In general, the presented research goes in line with further development of the virtual supercomputer concept coined and evaluated in~\cite{vsc-csit2013,vsc-iccsa2014,vsc-nova}. diff --git a/src/outro.tex b/src/outro.tex @@ -0,0 +1,5 @@ +\section{Conclusion} + +Dynamic roles assignment is beneficial for Big Data applications and distributed systems in general. It decouples architecture of a distributed system from underlying hardware as much as possible, providing highly-available service on top of varying number of physical machines. As much as virtualisation simplifies management and administration of a computer cluster, our approach may simplify development of reliable distributed applications which run on top of the cluster. + +\subsubsection*{Acknowledgements.} The research was carried out using computational resources of Resource Centre ``Computational Centre of Saint Petersburg State University'' (T-EDGE96 HPC-0011828-001) within frameworks of grants of Russian Foundation for Basic Research (projects no. 16-07-01111, 16-07-00886, 16-07-01113) and Saint Petersburg State University (project no. 0.37.155.2014). diff --git a/src/refs.bib b/src/refs.bib @@ -0,0 +1,268 @@ +@article{valiant1990bridging, + title={A bridging model for parallel computation}, + author={Valiant, Leslie G}, + journal={Communications of the ACM}, + volume={33}, + number={8}, + pages={103--111}, + year={1990}, + publisher={ACM} +} + +@book{ostrovsky2015couchbase, + title={Pro Couchbase Server}, + author={Ostrovsky, David and Rodenski, Yaniv and Haji, Mohammed}, + year={2015}, + publisher={Apress} +} + +@techreport{boyer2012glusterfs, + title={Glusterfs one storage server to rule them all}, + author={Boyer, Eric B and Broomfield, Matthew C and Perrotti, Terrell A}, + year={2012}, + institution={Los Alamos National Laboratory (LANL)} +} + +@article{divya2013elasticsearch, + title={ElasticSearch: An advanced and quick search technique to handle voluminous data}, + author={Divya, Manda Sai and Goyal, Shiv Kumar}, + journal={Compusoft}, + volume={2}, + number={6}, + pages={171}, + year={2013}, + publisher={COMPUSOFT, An International Journal of Advanced Computer Technology} +} + +@article{okorafor2012zookeeper, + title={Availability of Jobtracker machine in hadoop/mapreduce zookeeper coordinated clusters}, + author={Okorafor, Ekpe and Patrick, Mensah Kwabena}, + journal={Advanced Computing: An International Journal (ACIJ)}, + volume={3}, + number={3}, + pages={19--30}, + year={2012} +} + +@article{murthy2011architecture, + title={Architecture of next generation apache hadoop mapreduce framework}, + author={Murthy, Arun C and Douglas, Chris and Konar, Mahadev and O’Malley, Owen and Radia, Sanjay and Agarwal, Sharad and KV, Vinod}, + journal={Apache Jira}, + year={2011} +} + +@inproceedings{vavilapalli2013yarn, + title={Apache hadoop yarn: Yet another resource negotiator}, + author={Vavilapalli, Vinod Kumar and Murthy, Arun C and Douglas, Chris and Agarwal, Sharad and Konar, Mahadev and Evans, Robert and Graves, Thomas and Lowe, Jason and Shah, Hitesh and Seth, Siddharth and others}, + booktitle={Proceedings of the 4th annual Symposium on Cloud Computing}, + pages={5}, + year={2013}, + organization={ACM} +} + +@inproceedings{uhlemann2006joshua, + title={JOSHUA: Symmetric active/active replication for highly available HPC job and resource management}, + author={Uhlemann, Kai and Engelmann, Christian and Scott, Stephen L}, + booktitle={Cluster Computing, 2006 IEEE International Conference on}, + pages={1--10}, + year={2006}, + organization={IEEE} +} + +@article{knight1998rfc2338, + title={RFC2338}, + author={Knight, S and Weaver, D and Whipple, D and Hinden, R and Mitzel, D and Hunt, P and Higginson, P and Shand, M and Lindem, A}, + journal={Virtual Router Redundancy Protocol}, + year={1998} +} + +@article{hinden2004virtual, + title={Virtual Router Redundancy Protocol (VRRP); rfc3768. txt}, + author={Hinden, R and others}, + journal={IETF Standard, Internet Engineering Task Force, IETF, CH}, + pages={0000--0003}, + year={2004} +} + +@article{nadas2010rfc5798, + title={RFC 5798: Virtual Router Redundancy Protocol (VRRP) Version 3 for IPv4 and IPv6}, + author={Nadas, S}, + journal={Internet Engineering Task Force (IETF)}, + year={2010} +} + +@article{cassen2002keepalived, + title={Keepalived: Health checking for LVS \& high availability}, + author={Cassen, Alexandre}, + journal={URL http://www.linuxvirtualserver.org}, + year={2002} +} + +@article{engelmann2006symmetric, + title={Symmetric active/active high availability for high-performance computing system services}, + author={Engelmann, Christian and Scott, Stephen L and Leangsuksun, Chokchai Box and He, Xubin Ben and others}, + journal={Journal of Computers}, + volume={1}, + number={8}, + pages={43--54}, + year={2006} +} + +@inproceedings{acun2014charmpp, + title={Parallel programming with migratable objects: {Charm++} in practice}, + author={Acun, Bilge and Gupta, Arpan and Jain, Nikhil and Langer, Akhil and Menon, Harshitha and Mikida, Eric and Ni, Xiang and Robson, Michael and Sun, Yanhua and Totoni, Ehsan and others}, + booktitle={High Performance Computing, Networking, Storage and Analysis, SC14: International Conference for}, + pages={647--658}, + year={2014}, + organization={IEEE} +} + +@article{kale2012charm++, + title={Charm++ for Productivity and Performance}, + author={Kale, Laxmikant V and Gupta, Anshu Arya Abhinav Bhatele Abhishek and Jain, Nikhil and Lifflander, Pritish Jetley Jonathan and Miller, Phil and Sun, Yanhua and Zheng, Ramprasad Venkataraman Lukasz Wesolowski Gengbin}, + year={2012} +} + +@inproceedings{islam2012oozie, + title={Oozie: towards a scalable workflow management system for {Hadoop}}, + author={Islam, Mohammad and Huang, Angelo K and Battisha, Mohamed and Chiang, Michelle and Srinivasan, Santhosh and Peters, Craig and Neumann, Andreas and Abdelnur, Alejandro}, + booktitle={Proceedings of the 1st ACM SIGMOD Workshop on Scalable Workflow Execution Engines and Technologies}, + pages={4}, + year={2012}, + organization={ACM} +} + +@book{anderson2010couchdb, + title={CouchDB: The definitive guide}, + author={Anderson, J Chris and Lehnardt, Jan and Slater, Noah}, + year={2010}, + publisher={O'Reilly Media, Inc.} +} + +@article{lakshman2010cassandra, + title={Cassandra: A decentralized structured storage system}, + author={Lakshman, Avinash and Malik, Prashant}, + journal={ACM SIGOPS Operating Systems Review}, + volume={44}, + number={2}, + pages={35--40}, + year={2010}, + publisher={ACM} +} + +@inproceedings{gankevich2015subordination, + title={Subordination: Cluster management without distributed consensus}, + author={Gankevich, Ivan and Tipikin, Yuri and Gaiduchok, Vladimir}, + booktitle={International Conference on High Performance Computing \& Simulation (HPCS)}, + pages={639--642}, + year={2015}, + organization={IEEE} +} + +@inproceedings{gankevich2015iccsa, + title={Novel approaches for distributing workload on commodity computer systems}, + author={Gankevich, Ivan and Tipikin, Yuri and Degtyarev, Alexander and Korkhov, Vladimir}, + booktitle={Computational Science and Its Applications - ICCSA 2015, Lecture Notes in Computer Science}, + volume={9158}, + pages={259-271}, + year={2015}, +} + +@article{gankevich2015spec, + title = {Efficient processing and classification of wave energy spectrum data with a distributed pipeline}, + author = {Ivan Gankevich and Alexander Degtyarev}, + journal={Computer Research and Modeling}, + publisher={Institute of Computer Science}, + volume={7}, + number={3}, + pages={517--520}, + year={2015}, + keywords={distributed system, big data, data processing, parallel computing}, + url={http://crm-en.ics.org.ru/journal/article/2301/} +} + + +@article{dean2008mapreduce, + title={{MapReduce}: Simplified data processing on large clusters}, + author={Dean, Jeffrey and Ghemawat, Sanjay}, + journal={Communications of the ACM}, + volume={51}, + number={1}, + pages={107--113}, + year={2008}, + publisher={ACM} +} + +% spectra + +@techreport{earle1996nondirectional, + title={Nondirectional and directional wave data analysis procedures}, + author={Earle, Marshall D}, + journal={NDBC technical Document}, + institution={NDBC}, + pages={96--01}, + year={1996} +} + +@misc{ndbc-dataset, + key = {ndbc}, + title = {{NDBC} Directional Wave Stations}, + howpublished = {URL: \url{http://www.ndbc.noaa.gov/dwa.shtml}} +} + +@article{fischer1985impossibility, + title={Impossibility of distributed consensus with one faulty process}, + author={Fischer, Michael J and Lynch, Nancy A and Paterson, Michael S}, + journal={Journal of the ACM (JACM)}, + volume={32}, + number={2}, + pages={374--382}, + year={1985}, + publisher={ACM} +} + +@techreport{agha1985actors, + title={Actors: A model of concurrent computation in distributed systems.}, + author={Agha, Gul A}, + year={1985}, + institution={DTIC Document} +} + +@inproceedings{hewitt1973universal, + title={A universal modular actor formalism for artificial intelligence}, + author={Hewitt, Carl and Bishop, Peter and Steiger, Richard}, + booktitle={Proceedings of the 3rd international joint conference on Artificial intelligence}, + pages={235--245}, + year={1973}, + organization={Morgan Kaufmann Publishers Inc.} +} + +@article{vsc-nova, +author={Bogdanov, A. and Degtyarev, A. and Korkhov, V. and Gaiduchok, V. and Gankevich, I.}, +editor={Thomas S. Clary}, +title={Virtual supercomputer as basis of scientific computing}, +journal={in series: Horizons in Computer Science Research}, +year={2015}, +volume={v. 11}, +pages={pp. 159-198}, +publisher={NOVA Science Publishers} +} + +@inproceedings{vsc-iccsa2014, +author={Gankevich, I. and Korkhov, V. and Balyan, S. and Gaiduchok, V. and Gushchanskiy, D. and Tipikin, Y. and Degtyarev, A. and Bogdanov, A.}, +title={Constructing virtual private supercomputer using virtualization and cloud technologies}, +booktitle={Computational Science and Its Applications - ICCSA 2014, Lecture Notes in Computer Science}, +year={2014}, +volume={8584}, +pages={341-354}, +} + +@inproceedings{vsc-csit2013, +author={Gankevich, I. and Gaiduchok, V. and Gushchanskiy, D. and Tipikin, Y. and Korkhov, V. and Degtyarev, A. and Bogdanov, A. and Zolotarev, V.}, +title={Virtual private supercomputer: Design and evaluation}, +booktitle={CSIT 2013 - 9th International Conference on Computer Science and Information Technologies, Revised Selected Papers}, +year={2013}, +pages={1-6}, +doi={10.1109/CSITechnol.2013.6710358}, +art_number={6710358}, +}+ \ No newline at end of file diff --git a/src/sections.tex b/src/sections.tex @@ -0,0 +1,154 @@ +\section{Methods} + +\subsection{Model of computation} + +To infer fault tolerance model which is suitable for big data applications we use bulk-synchronous parallel model~\cite{valiant1990bridging} as the basis. This model assumes that a parallel programme is composed of several sequential steps that are internally parallel, and global synchronisation of all parallel processes occurs after each step. In our model all sequential steps are pipelined where it is possible. The evolution of the computational model is described as follows. + +Given a programme that is sequential and large enough to be decomposed into several sequential steps, the simplest way to make it run faster is to exploit data parallelism. Usually it means finding multi-dimensional arrays and loops that access their elements and trying to make them parallel. After transforming several loops the programme will still have the same number of sequential steps, but every step will (ideally) be internally parallel. + +After that the only possibility to speedup the programme is to overlap execution of code blocks that work with different hardware devices. The most common pattern is to overlap computation with network I/O or disk I/O. This approach makes sense because all devices operate with little synchronisation, and issuing commands in parallel makes the whole programme perform better. This behaviour can be achieved by allocating a separate task queue for each device and submitting tasks to these queues asynchronously with execution of the main thread. So, after this optimisation, the programme will be composed of several steps chained into the pipeline, each step is implemented as a task queue for a particular device. + +Pipelining of otherwise sequential steps is beneficial not only for code accessing different devices, but for code different branches of which are suitable for execution by multiple hardware threads of the same core, i.e. branches accessing different regions of memory or performing mixed arithmetic (floating point and integer). In other words, code branches which use different modules of processor are good candidates to run in parallel on a processor core with multiple hardware threads. + +Even though pipelining may not add parallelism for a programme that uses only one input file (or a set of input parameters), it adds parallelism when the programme can process multiple input files: each input generates tasks which travel through the whole pipeline in parallel with tasks generated by other inputs. With a pipeline an array of files is processed in parallel by the same set of resources allocated for a batch job, and possibly with greater efficiency for busy HPC clusters compared to executing a separate job for each input file, because the time that each subsequent job after the first spends in a queue is eliminated. + +Computational model with a pipeline can be seen as \emph{bulk-asynchronous model}, because of the parallel nature of otherwise sequential execution steps. This model is the basis of the fault-tolerance model developed here. + +\subsection{Fail over model} + +Although, fault-tolerance and high-availability are different terms, in essence they describe the same property---an ability of a system to switch processing from a failed component to its live spare or backup component. In case of fault-tolerance it is the ability to switch from a failed slave node to a spare one, i.e. to repeat computation step on a healthy slave node. In case of high-availability it is the ability to switch from a failed master node to a backup node with full restoration of execution state. These are the core abilities that constitute distributed system's ability to \emph{fail over}. + +The key feature that is missing in the current parallel programming and big data processing technologies is a possibility to specify hierarchical dependencies between parallel tasks. When one has such dependency, it is trivial to determine which task should be responsible for re-executing a failed task on a healthy node. To re-execute the root of the hierarchy, a backup root task is created and executed on a different node. There exists a number of engines that are capable of executing directed acyclic graphs of tasks in parallel~\cite{acun2014charmpp,islam2012oozie}, but graphs are not good to infer master-slave relationship between tasks, because a node in the graph may have multiple parent nodes. + +\subsection{Programming model} + +This work is based on the results of previous research: In~\cite{gankevich2015subordination,gankevich2015iccsa} we developed an algorithm that allows to build a tree hierarchy from strictly ordered set of cluster nodes. The sole purpose of this hierarchy is to make a cluster more fault-tolerant by introducing multiple master nodes. If a master node fails, then its subordinates try to connect to another node from the same or higher level of the hierarchy. If there is no such node, one of the subordinates becomes the master. In~\cite{gankevich2015spec} we developed a framework for big data processing without fault tolerance, and here this framework is combined with fault-tolerance techniques described in this paper. + +Each programme that runs on top of the tree hierarchy is composed of computational kernels---objects that contain data and code to process it. To exploit parallelism a kernel may create arbitrary number of subordinate kernels which are automatically spread first across available processor cores, second across subordinate nodes in the tree hierarchy. The programme is itself a kernel (without a parent as it is executed by a user), which either solves the problem sequentially on its own or creates subordinate kernels to solve it in parallel. + +In contrast to HPC applications, in big data applications it is inefficient to run computational kernels on arbitrary chosen nodes. More practical approach is to bind every kernel to a file location in a parallel file system and transfer the kernel to that location before processing the file. That way expensive data transfer is eliminated, and the file is always read from a local drive. This approach is more deterministic compared to existing ones, e.g. MapReduce framework runs jobs on nodes that are ``close'' to the file location, but not necessarily the exact node where the file is located~\cite{dean2008mapreduce}. However, this approach does not come without disadvantages: scalability of a big data application is limited by the strategy that was employed to distribute its input files across cluster nodes. The more nodes used to store input files, the more read performance is achieved. The advantage of our approach is that the I/O performance is more predictable, than one of hybrid approach with streaming files over the network. + +% From mathematical point of view kernel $K$ can be described as a vector-valued functional which recursively maps a kernel to $n$-component vector of kernels: +% \begin{equation*} +% K(f): \mathbb{K} \rightarrow \mathbb{K}^n +% \qquad +% \mathbb{K}^n = \left\{ f: \mathbb{K} \rightarrow \mathbb{K}^n \right\}. +% \end{equation*} +% Dummy kernel $\mathbb{O}: \mathbb{K} \rightarrow \mathbb{K}^0$, which stops recursion, is used to call the first kernel and finish execution of the programme. An argument to each kernel is interpreted using the following rules. +% \begin{enumerate} +% \item If a kernel is a new kernel, then its argument is its parent kernel. +% \item If a kernel is a parent of the kernel that produced it or some other existing kernel, then the argument is the kernel that produced it. +% \end{enumerate} + +% Engine that executes kernels is implemented as a simple loop. It starts with calling the first kernel with dummy kernel as an argument, then calls each kernel that was produced by this call and so forth. The loop finishes when a dummy kernel is returned as a result of the call. + +% Since kernel call may return multiple kernels they are executed in parallel. Parallel execution quickly produces a pool of kernels which permit execution in an unspecified order. Several threads concurrently retrieve kernels from the pool and may ``spill'' remaining kernels to neighbouring cluster nodes. + +% Kernels are implemented as closures---function objects containing all their arguments, a reference to parent kernel and user-supplied data. The data is either processed upon kernel call, or subordinate kernels are created to process it in parallel. When the processing is complete a parent kernel closure with its subordinate kernel as an argument is called to collect data from it. + +\subsection{Handling master node failures} + +A possible way of handling a failure of a node where the first kernel is located (a master node) is to replicate this kernel to a backup node, and make all updates to its state propagate to the backup node by means of a distributed transaction. This approach requires synchronisation between all nodes that execute subordinates of the first kernel and the node with the first kernel itself. When a node with the first kernel goes offline, the nodes with subordinate kernels must know what node is the backup one. However, if the backup node also goes offline in the middle of execution of some subordinate kernel, then it is impossible for this kernel to discover the next backup node to return to, because this kernel has not discovered the unavailability of the master node yet. One can think of a consensus-based algorithm to ensure that subordinate kernels always know where the backup node is, but distributed consensus algorithms do not scale well to the large number of nodes and they are not reliable~\cite{fischer1985impossibility}. So, consensus-based approach does not play well with asynchronous nature of computational kernels as it may inhibit scalability of a parallel programme. + +Fortunately, the first kernel usually does not perform operations in parallel, it is rather sequentially launches execution steps one by one, so it has only one subordinate at a time. Such behaviour is described by bulk-synchronous parallel programming model, in the framework of which a programme consists of sequential supersteps which are internally parallel~\cite{valiant1990bridging}. Keeping this in mind, we can simplify synchronisation of its state: we can send the first kernel along with its subordinate to the subordinate node. When the node with the first kernel fails, its copy receives its subordinate, and no execution time is lost. When the node with its copy fails, its subordinate is rescheduled on some other node, and in the worst case a whole step of computation is lost. + +Described approach works only for kernels that do not have a parent and have only one subordinate at a time, and act similar to manually triggered checkpoints. The advantage is that they +\begin{itemize} + \item save results after each sequential step when memory footprint of a programme is low, + \item they save only relevant data, + \item and they use memory of a subordinate node instead of stable storage. +\end{itemize} + +\section{Results} + +Master node fail over technique is evaluated on the example of wave energy spectra processing application. This programme uses NDBC dataset~\cite{ndbc-dataset} to reconstruct frequency-directional spectra from wave rider buoy measurements and compute variance. Each spectrum is reconstructed from five variables using the following formula~\cite{earle1996nondirectional}. +\begin{equation*} + S(\omega, \theta) = \frac{1}{\pi} + \left[ + \frac{1}{2} + + r_1 \cos \left( \theta - \alpha_1 \right) + + r_2 \sin \left( 2 \left( \theta - \alpha_2 \right) \right) + \right] + S_0(\omega). +\end{equation*} +Here $\omega$ denotes frequency, $\theta$ is wave direction, $r_{1,2}$ and $\alpha_{1,2}$ are parameters of spectrum decomposition and $S_0$ is non-directional spectrum; $r_{1,2}$, $\alpha_{1,2}$ and $S_0$ are acquired through measurements. Properties of the dataset which is used in evaluation are listed in Table~\ref{tab:ndbc-dataset}. + +\begin{table} + \centering + \caption{NDBC dataset properties.} + \begin{tabular}{ll} + \toprule + Dataset size & 144MB \\ + Dataset size (uncompressed) & 770MB \\ + No. of wave stations & 24 \\ + Time span & 3 years (2010--2012) \\ + Total no. of spectra & 445422 \\ + \bottomrule + \end{tabular} + \label{tab:ndbc-dataset} +\end{table} + +The algorithm of processing spectra is as follows. First, current directory is recursively scanned for input files. Data for all buoys is distributed across cluster nodes and each buoy's data processing is distributed across processor cores of a node. Processing begins with joining corresponding measurements for each spectrum variables into a tuple, then for each tuple frequency-directional spectrum is reconstructed and its variance is computed. Results are gradually copied back to the machine where application was executed and when the processing is complete the programme terminates. + +\begin{table} + \centering + \caption{Test platform configuration.} + \begin{tabular}{ll} + \toprule + CPU & Intel Xeon E5440, 2.83GHz \\ + RAM & 4Gb \\ + HDD & ST3250310NS, 7200rpm \\ + No. of nodes & 12 \\ + No. of CPU cores per node & 8 \\ + \bottomrule + \end{tabular} + \label{tab:cluster} +\end{table} + +In a series of test runs we benchmarked performance of the application in the presence of different types of failures: +\begin{itemize} + \item failure of a master node (a node where the first kernel is run), + \item failure of a slave node (a node where spectra from a particular station are reconstructed) and + \item failure of a backup node (a node where the first kernel is copied). +\end{itemize} +A tree hierarchy with sufficiently large fan-out value was chosen to make all cluster nodes connect directly to the first one so that only one master node exists in the cluster. In each run the first kernel was launched on a different node to make mapping of kernel hierarchy to the tree hierarchy optimal. A victim node was made offline after a fixed amount of time early after the programme start. To make up for the node failure all data files have replicas stored on different cluster nodes. All relevant parameters are summarised in Table~\ref{tab:benchmark} (here ``root'' and ``leaf'' refer to a node in the tree hierarchy). The results of these runs were compared to the run without node failures (Figure~\ref{fig:benchmark-bigdata}). + +\begin{table} + \centering + \caption{Benchmark parameters.} + \begin{tabular}{llll} + \toprule + Experiment no. & Master node & Victim node & Time to offline, s \\ + \midrule + 1 & root & & \\ + 2 & root & leaf & 30 \\ + 3 & leaf & leaf & 30 \\ + 4 & leaf & root & 30 \\ + \bottomrule + \end{tabular} + \label{tab:benchmark} +\end{table} + +The benchmark showed that only a backup node failure results in significant performance penalty, in all other cases the performance is roughly equals to the one without failures but with the number of nodes minus one. It happens because a backup node not only stores the copy of the state of the current computation step but executes this step in parallel with other subordinate nodes. So, when a backup node fails, the master node executes the whole step once again on arbitrarily chosen healthy subordinate node. + +% \begin{figure} +% \centering +% \includegraphics{factory-3000} +% \caption{Performance of hydrodynamics HPC application in the presence of node failures.} +% \label{fig:benchmark-hpc} +% \end{figure} + +\begin{figure} + \centering + \includegraphics{spec} + \caption{Performance of spectrum processing application in the presence of different types of node failures.} + \label{fig:benchmark-bigdata} +\end{figure} + +\section{Discussion} + +Described algorithm guarantees to handle one failure per computational step, more failures can be tolerated if they do not affect the master node. The system handles simultaneous failure of all subordinate nodes, however, if both master and backup nodes fail, there is no chance for an application to survive. In this case the state of the current computation step is lost, and the only way to restore it is to restart the application. + +Computational kernels are means of abstraction that decouple distributed application from physical hardware: it does not matter how many nodes are online for an application to run successfully. Computational kernels eliminate the need to allocate a physical backup node to make master node highly-available, with computational kernels approach any node can act as a backup one. Finally, computational kernels can handle subordinate node failures in a way that is transparent to a programmer. + +The disadvantage of this approach is evident: there is no way of making existing middleware highly-available without rewriting their source code. Although, our programming framework is lightweight, it is not easy to map architecture of existing middleware systems to it: most systems are developed keeping in mind static assignment of server/client roles, which is not easy to make dynamic. Hopefully, our approach will simplify design of future middleware systems.