From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: Date: Tue, 24 May 2005 07:53:03 -0500 From: Eric Van Hensbergen To: Fans of the OS Plan 9 from Bell Labs <9fans@cse.psu.edu> Subject: Re: [9fans] Plan9ports lib9p question: serving to a plain 'ol tcp socket In-Reply-To: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_14257_19846105.1116939183908" References: Topicbox-Message-UUID: 52236420-ead0-11e9-9d60-3106f5b1d025 ------=_Part_14257_19846105.1116939183908 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On 5/23/05, Ronald G. Minnich wrote: > I am starting to look at this but wonder if someone has beat me to it. >=20 > I need to make a simple, single-threaded 9p server that will sit on a > normal Unix TCP socket in an accept/serve loop . It seems like the bits > are there to do this in lib9p, but I'm still untangling a few things; I > don't need the /tmp/ns.whatever Unix domain socket stuff, for example, bu= t > all the other superstructure there is really nice. Anybody done this. I > can't use newsham's python server as I am sitting on a nice, bare node an= d > python is not really an option. I was simply hacking u9fs until a minute > or two ago, and I feel like I'm re-inventing something I'm sure someone > has already done -- must be somebody there who has beat me to this, I > figure. >=20 You should be able to use the plan9ports infrastructure just fine, even if its more than you need. I'm going to attach a really simple devcons style driver I wrote using plan9ports as an example. Almost all of the code can be thought of as a template. Search for Qtime and Qcons to get the parts that really do anything. One of these days I'll get around to writing a synthetic file systems SDK to help make stuff like this more straightforward. -eric ------=_Part_14257_19846105.1116939183908 Content-Type: application/x-tar; name="devcons.tar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="devcons.tar" ZGV2Y29ucy5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMjE2 MwAwMDAwMDAwADAwMDAwMDAyNTUyADEwMjIxMTQ1NTMxADAxMTY3MQAgMAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGVyaWN2aAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj aW5jbHVkZSA8dS5oPgojaW5jbHVkZSA8bGliYy5oPgojaW5jbHVkZSA8cmVnZXhwLmg+CiNpbmNs dWRlIDx0aHJlYWQuaD4KI2luY2x1ZGUgPHBsdW1iLmg+CiNpbmNsdWRlIDxmY2FsbC5oPgojaW5j bHVkZSAiZGV2Y29ucy5oIgoKaW50IGRlYnVnOwpjaGFyICp1c2VyOwpjaGFyICpob21lOwpjaGFy ICpwcm9nbmFtZTsKaW50CXByaW50ZXJyb3JzPTE7CmptcF9idWYJcGFyc2VqbXA7CmNoYXIJKmxh c3RlcnJvcjsKCnZvaWQKdGhyZWFkbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQg ZG9mb3JrOwoKCXByb2duYW1lID0gImRldmNvbnMiOwoJZG9mb3JrID0gMDsKCglBUkdCRUdJTnsK CWNhc2UgJ2QnOgoJCWRlYnVnID0gMTsKCQlicmVhazsKCWNhc2UgJ2YnOgoJCWRvZm9yayA9IDE7 CgkJYnJlYWs7Cgl9QVJHRU5ECgoJdXNlciA9IGdldHVzZXIoKTsKCWhvbWUgPSBnZXRlbnYoImhv bWUiKTsKCWlmKGhvbWUgPT0gbmlsKQoJCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKCWlmKHVzZXI9 PW5pbCB8fCBob21lPT1uaWwpCgkJZXJyb3IoImNhbid0IGluaXRpYWxpemUgJHVzZXIgb3IgJGhv bWU6ICVyIik7CgoJLyoKCSAqIFN0YXJ0IGFsbCBwcm9jZXNzZXMgYW5kIHRocmVhZHMgZnJvbSBv dGhlciBwcm9jCgkgKiBzbyB3ZSAobWFpbiBwaWQpIGNhbiByZXR1cm4gdG8gdXNlci4KCSAqLwoJ aWYoZG9mb3JrKQoJc3dpdGNoKGZvcmsoKSl7CgljYXNlIC0xOgoJCXN5c2ZhdGFsKCJmb3JrOiAl ciIpOwoJY2FzZSAwOgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlfZXhpdCgwKTsKCX0KCglwcmludGVy cm9ycyA9IDA7CglzdGFydGZzeXMoKTsKfQoKdm9pZAplcnJvcihjaGFyICpmbXQsIC4uLikKewoJ Y2hhciBidWZbNTEyXTsKCXZhX2xpc3QgYXJnczsKCgl2YV9zdGFydChhcmdzLCBmbXQpOwoJdnNl cHJpbnQoYnVmLCBidWYrc2l6ZW9mIGJ1ZiwgZm10LCBhcmdzKTsKCXZhX2VuZChhcmdzKTsKCglm cHJpbnQoMiwgIiVzOiAlc1xuIiwgcHJvZ25hbWUsIGJ1Zik7Cgl0aHJlYWRleGl0c2FsbCgiZXJy b3IiKTsKfQoKdm9pZCoKZW1hbGxvYyhsb25nIG4pCnsKCXZvaWQgKnA7CgoJcCA9IG1hbGxvYyhu KTsKCWlmKHAgPT0gbmlsKQoJCWVycm9yKCJtYWxsb2MgZmFpbGVkOiAlciIpOwoJbWVtc2V0KHAs IDAsIG4pOwoJcmV0dXJuIHA7Cn0KCnZvaWQqCmVyZWFsbG9jKHZvaWQgKnAsIGxvbmcgbikKewoJ cCA9IHJlYWxsb2MocCwgbik7CglpZihwID09IG5pbCkKCQllcnJvcigicmVhbGxvYyBmYWlsZWQ6 ICVyIik7CglyZXR1cm4gcDsKfQoKY2hhcioKZXN0cmR1cChjaGFyICpzKQp7CgljaGFyICp0OwoK CXQgPSBzdHJkdXAocyk7CglpZih0ID09IG5pbCkKCQllcnJvcigiZXN0cmR1cCBmYWlsZWQ6ICVy Iik7CglyZXR1cm4gdDsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXZj b25zLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAyMTYzADAw MDAwMDAAMDAwMDAwMDAyMjAAMTAyMjExNDU1MzEAMDExNjY0ACAwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAZXJpY3ZoAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGludAlk ZWJ1ZzsKY2hhcgkqdXNlcjsKCnZvaWQJCWVycm9yKGNoYXIqLCAuLi4pOwp2b2lkKgllbWFsbG9j KGxvbmcpOwp2b2lkKgllcmVhbGxvYyh2b2lkKiwgbG9uZyk7CmNoYXIqCWVzdHJkdXAoY2hhciop Owp2b2lkCQlzdGFydGZzeXModm9pZCk7CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZnN5cy5j AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMjE2MwAwMDAw MDAwADAwMDAwMDI0NTM2ADEwMjIxMTQ1NTMxADAxMTIyMgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAGVyaWN2aAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVk ZSA8dS5oPgojaW5jbHVkZSA8bGliYy5oPgojaW5jbHVkZSA8YmlvLmg+CiNpbmNsdWRlIDxyZWdl eHAuaD4KI2luY2x1ZGUgPHRocmVhZC5oPgojaW5jbHVkZSA8ZmNhbGwuaD4KI2luY2x1ZGUgPHN0 ZGlvLmg+CiNpbmNsdWRlICJkZXZjb25zLmgiCgplbnVtCnsKCVN0YWNrID0gMzIqMTAyNAp9OwoK dHlwZWRlZiBzdHJ1Y3QgRGlydGFiIERpcnRhYjsKdHlwZWRlZiBzdHJ1Y3QgRmlkIEZpZDsKdHlw ZWRlZiBzdHJ1Y3QgUmVhZHJlcSBSZWFkcmVxOwp0eXBlZGVmIHN0cnVjdCBTZW5kcmVxIFNlbmRy ZXE7CgpzdHJ1Y3QgRGlydGFiCnsKCWNoYXIJCSpuYW1lOwoJdWNoYXIJdHlwZTsKCXVpbnQJCXFp ZDsKCXVpbnQJCXBlcm07CglpbnQJCW5vcGVuOwkJLyogI2ZpZHMgb3BlbiBvbiB0aGlzIHBvcnQg Ki8KCUZpZAkJKmZvcGVuOwp9OwoKc3RydWN0IEZpZAp7CglpbnQJCWZpZDsKCWludAkJYnVzeTsK CWludAkJb3BlbjsKCWludAkJbW9kZTsKCVFpZAkJcWlkOwoJRGlydGFiCSpkaXI7Cglsb25nCQlv ZmZzZXQ7CQkvKiB6ZXJvZWQgYXQgYmVnaW5uaW5nIG9mIGVhY2ggbWVzc2FnZSwgcmVhZCBvciB3 cml0ZSAqLwoJY2hhcgkJKndyaXRlYnVmOwkJLyogcGFydGlhbCBtZXNzYWdlIHdyaXR0ZW4gc28g ZmFyOyBvZmZzZXQgdGVsbHMgaG93IG11Y2ggKi8KCUZpZAkJKm5leHQ7CglGaWQJCSpuZXh0b3Bl bjsKfTsKCmVudW0KewoJTkRJUgk9IDUwLAoJTmhhc2gJPSAxNiwKCglRZGlyCQk9IDAsCglRY29u cwk9IDEsCglRdGltZQk9IDIsCglRcG9ydAk9IDMsCglOUUlECT0gUXBvcnQKfTsKCnN0YXRpYyBE aXJ0YWIgZGlyW05ESVJdID0KewoJeyAiLiIsCQkJUVRESVIsCVFkaXIsCQkJMDUwMHxETURJUiB9 LAoJeyAiY29ucyIsCQlRVEZJTEUsCVFjb25zLAkJMDYwMCB9LAoJeyAidGltZSIsCQlRVEZJTEUs CVF0aW1lLAkJMDYwMCB9LAp9OwpzdGF0aWMgaW50CW5kaXIgPSBOUUlEOwoKc3RhdGljIGludAkJ c3J2ZmQ7CnN0YXRpYyBGaWQJCSpmaWRzW05oYXNoXTsKc3RhdGljIFFMb2NrCXJlYWRsb2NrOwpz dGF0aWMgUUxvY2sJcXVldWU7CnN0YXRpYyBpbnQJCW1lc3NhZ2VzaXplID0gODE5MitJT0hEUlNa OwkvKiBnb29kIHN0YXJ0ICovCnN0YXRpYyBpbnQgY2xvY2s7CgpzdGF0aWMgdm9pZAlmc3lzcHJv Yyh2b2lkKik7CnN0YXRpYyB2b2lkIGZzeXNyZXNwb25kKEZjYWxsKiwgdWNoYXIqLCBjaGFyKik7 CnN0YXRpYyBGaWQqCW5ld2ZpZChpbnQpOwoKc3RhdGljIEZjYWxsKiBmc3lzZmx1c2goRmNhbGwq LCB1Y2hhciosIEZpZCopOwpzdGF0aWMgRmNhbGwqIGZzeXN2ZXJzaW9uKEZjYWxsKiwgdWNoYXIq LCBGaWQqKTsKc3RhdGljIEZjYWxsKiBmc3lzYXV0aChGY2FsbCosIHVjaGFyKiwgRmlkKik7CnN0 YXRpYyBGY2FsbCogZnN5c2F0dGFjaChGY2FsbCosIHVjaGFyKiwgRmlkKik7CnN0YXRpYyBGY2Fs bCogZnN5c3dhbGsoRmNhbGwqLCB1Y2hhciosIEZpZCopOwpzdGF0aWMgRmNhbGwqIGZzeXNvcGVu KEZjYWxsKiwgdWNoYXIqLCBGaWQqKTsKc3RhdGljIEZjYWxsKiBmc3lzY3JlYXRlKEZjYWxsKiwg dWNoYXIqLCBGaWQqKTsKc3RhdGljIEZjYWxsKiBmc3lzcmVhZChGY2FsbCosIHVjaGFyKiwgRmlk Kik7CnN0YXRpYyBGY2FsbCogZnN5c3dyaXRlKEZjYWxsKiwgdWNoYXIqLCBGaWQqKTsKc3RhdGlj IEZjYWxsKiBmc3lzY2x1bmsoRmNhbGwqLCB1Y2hhciosIEZpZCopOwpzdGF0aWMgRmNhbGwqIGZz eXNyZW1vdmUoRmNhbGwqLCB1Y2hhciosIEZpZCopOwpzdGF0aWMgRmNhbGwqIGZzeXNzdGF0KEZj YWxsKiwgdWNoYXIqLCBGaWQqKTsKc3RhdGljIEZjYWxsKiBmc3lzd3N0YXQoRmNhbGwqLCB1Y2hh ciosIEZpZCopOwoKRmNhbGwqIAkoKmZjYWxsW1RtYXhdKShGY2FsbCosIHVjaGFyKiwgRmlkKik7 CgpzdGF0aWMgdm9pZAppbml0ZmNhbGwodm9pZCkKewoJZmNhbGxbVGZsdXNoXQk9IGZzeXNmbHVz aDsKCWZjYWxsW1R2ZXJzaW9uXQk9IGZzeXN2ZXJzaW9uOwoJZmNhbGxbVGF1dGhdCT0gZnN5c2F1 dGg7CglmY2FsbFtUYXR0YWNoXQk9IGZzeXNhdHRhY2g7CglmY2FsbFtUd2Fsa10JPSBmc3lzd2Fs azsKCWZjYWxsW1RvcGVuXQk9IGZzeXNvcGVuOwoJZmNhbGxbVGNyZWF0ZV0JPSBmc3lzY3JlYXRl OwoJZmNhbGxbVHJlYWRdCT0gZnN5c3JlYWQ7CglmY2FsbFtUd3JpdGVdCT0gZnN5c3dyaXRlOwoJ ZmNhbGxbVGNsdW5rXQk9IGZzeXNjbHVuazsKCWZjYWxsW1RyZW1vdmVdPSBmc3lzcmVtb3ZlOwoJ ZmNhbGxbVHN0YXRdCT0gZnN5c3N0YXQ7CglmY2FsbFtUd3N0YXRdCT0gZnN5c3dzdGF0Owp9Cgpj aGFyCUViYWRmY2FsbFtdID0JImJhZCBmY2FsbCB0eXBlIjsKY2hhcglFcGVybVtdID0gCSJwZXJt aXNzaW9uIGRlbmllZCI7CmNoYXIJRW5vbWVtW10gPQkibWFsbG9jIGZhaWxlZCBmb3IgYnVmZmVy IjsKY2hhcglFbm90ZGlyW10gPQkibm90IGEgZGlyZWN0b3J5IjsKY2hhcglFbm9leGlzdFtdID0J InBsdW1iIGZpbGUgZG9lcyBub3QgZXhpc3QiOwpjaGFyCUVpc2RpcltdID0JCSJmaWxlIGlzIGEg ZGlyZWN0b3J5IjsKY2hhcglFYmFkbXNnW10gPQkiYmFkIHBsdW1iIG1lc3NhZ2UgZm9ybWF0IjsK Y2hhciBFbm9zdWNocG9ydFtdID0ibm8gc3VjaCBwbHVtYiBwb3J0IjsKY2hhciBFbm9wb3J0W10g PQkiY291bGRuJ3QgZmluZCBkZXN0aW5hdGlvbiBmb3IgbWVzc2FnZSI7CmNoYXIJRWludXNlW10g PSAJImZpbGUgYWxyZWFkeSBvcGVuIjsKCnN0YXRpYyB1bG9uZwpnZXRjbG9jayh2b2lkKQp7Cgly ZXR1cm4gdGltZSgwKTsKfQoKdm9pZApzdGFydGZzeXModm9pZCkKewoJaW50IHBbMl07CgoJZm10 aW5zdGFsbCgnRicsIGZjYWxsZm10KTsKCWNsb2NrID0gZ2V0Y2xvY2soKTsKCWlmKHBpcGUocCkg PCAwKQoJCWVycm9yKCJjYW4ndCBjcmVhdGUgcGlwZTogJXIiKTsKCS8qIDAgd2lsbCBiZSBzZXJ2 ZXIgZW5kLCAxIHdpbGwgYmUgY2xpZW50IGVuZCAqLwoJc3J2ZmQgPSBwWzBdOwoJaWYocG9zdDlw c2VydmljZShwWzFdLCAiY29ucyIpIDwgMCkKCQlzeXNmYXRhbCgicG9zdDlwc2VydmljZSBjb25z OiAlciIpOwoJY2xvc2UocFsxXSk7Cgl0aHJlYWRjcmVhdGUoZnN5c3Byb2MsIG5pbCwgU3RhY2sp Owp9CgpzdGF0aWMgdm9pZApmc3lzcHJvYyh2b2lkICp2KQp7CglpbnQgbjsKCUZjYWxsICp0OwoJ RmlkICpmOwoJdWNoYXIgKmJ1ZjsKCglVU0VEKHYpOwoJaW5pdGZjYWxsKCk7Cgl0ID0gbmlsOwoJ Zm9yKDs7KXsKCQlidWYgPSBtYWxsb2MobWVzc2FnZXNpemUpOwkvKiBhdm9pZCBtZW1zZXQgb2Yg ZW1hbGxvYyAqLwoJCWlmKGJ1ZiA9PSBuaWwpCgkJCWVycm9yKCJtYWxsb2MgZmFpbGVkOiAlciIp OwoJCXFsb2NrKCZyZWFkbG9jayk7CgkJbiA9IHRocmVhZHJlYWQ5cG1zZyhzcnZmZCwgYnVmLCBt ZXNzYWdlc2l6ZSk7CgkJaWYobiA8PSAwKXsKCQkJaWYobiA8IDApCgkJCQllcnJvcigiaS9vIGVy cm9yIG9uIHNlcnZlciBjaGFubmVsIik7CgkJCXRocmVhZGV4aXRzYWxsKCJ1bm1vdW50ZWQiKTsK CQl9CgkJaWYocmVhZGxvY2suaGVhZCA9PSBuaWwpCS8qIG5vIG90aGVyIHByb2Nlc3NlcyB3YWl0 aW5nIHRvIHJlYWQ7IHN0YXJ0IG9uZSAqLwoJCQl0aHJlYWRjcmVhdGUoZnN5c3Byb2MsIG5pbCwg U3RhY2spOwoJCXF1bmxvY2soJnJlYWRsb2NrKTsKCQlpZih0ID09IG5pbCkKCQkJdCA9IGVtYWxs b2Moc2l6ZW9mKEZjYWxsKSk7CgkJaWYoY29udk0yUyhidWYsIG4sIHQpICE9IG4pCgkJCWVycm9y KCJjb252ZXJ0IGVycm9yIGluIGNvbnZNMlMiKTsKCQlpZihkZWJ1ZykKCQkJZnByaW50KDIsICI8 PSAlRlxuIiwgdCk7CgkJaWYoZmNhbGxbdC0+dHlwZV0gPT0gMCkKCQkJZnN5c3Jlc3BvbmQodCwg YnVmLCBFYmFkZmNhbGwpOwoJCWVsc2V7CgkJCWlmKHQtPnR5cGU9PVR2ZXJzaW9uIHx8IHQtPnR5 cGU9PVRhdXRoKQoJCQkJZiA9IG5pbDsKCQkJZWxzZQoJCQkJZiA9IG5ld2ZpZCh0LT5maWQpOwoJ CQl0ID0gKCpmY2FsbFt0LT50eXBlXSkodCwgYnVmLCBmKTsKCQl9Cgl9Cn0KCnN0YXRpYyB2b2lk CmZzeXNyZXNwb25kKEZjYWxsICp0LCB1Y2hhciAqYnVmLCBjaGFyICplcnIpCnsKCWludCBuOwoK CWlmKGVycil7CgkJdC0+dHlwZSA9IFJlcnJvcjsKCQl0LT5lbmFtZSA9IGVycjsKCX1lbHNlCgkJ dC0+dHlwZSsrOwoJaWYoYnVmID09IG5pbCkKCQlidWYgPSBlbWFsbG9jKG1lc3NhZ2VzaXplKTsK CW4gPSBjb252UzJNKHQsIGJ1ZiwgbWVzc2FnZXNpemUpOwoJaWYobiA8IDApCgkJZXJyb3IoImNv bnZlcnQgZXJyb3IgaW4gY29udlMyTSIpOwoJaWYod3JpdGUoc3J2ZmQsIGJ1ZiwgbikgIT0gbikK CQllcnJvcigid3JpdGUgZXJyb3IgaW4gcmVzcG9uZCIpOwoJaWYoZGVidWcpCgkJZnByaW50KDIs ICI9PiAlRlxuIiwgdCk7CglmcmVlKGJ1Zik7Cn0KCnN0YXRpYwpGaWQqCm5ld2ZpZChpbnQgZmlk KQp7CglGaWQgKmYsICpmZiwgKipmaDsKCglxbG9jaygmcXVldWUpOwoJZmYgPSBuaWw7CglmaCA9 ICZmaWRzW2ZpZCYoTmhhc2gtMSldOwoJZm9yKGY9KmZoOyBmOyBmPWYtPm5leHQpCgkJaWYoZi0+ ZmlkID09IGZpZCkKCQkJZ290byBSZXR1cm47CgkJZWxzZSBpZihmZj09bmlsICYmICFmLT5idXN5 KQoJCQlmZiA9IGY7CglpZihmZil7CgkJZmYtPmZpZCA9IGZpZDsKCQlmID0gZmY7CgkJZ290byBS ZXR1cm47Cgl9CglmID0gZW1hbGxvYyhzaXplb2YgKmYpOwoJZi0+ZmlkID0gZmlkOwoJZi0+bmV4 dCA9ICpmaDsKCSpmaCA9IGY7CiAgICBSZXR1cm46CglxdW5sb2NrKCZxdWV1ZSk7CglyZXR1cm4g ZjsKfQoKc3RhdGljIHVpbnQKZG9zdGF0KERpcnRhYiAqZGlyLCB1Y2hhciAqYnVmLCB1aW50IG5i dWYsIHVpbnQgY2xvY2spCnsKCURpciBkOwoKCWQucWlkLnR5cGUgPSBkaXItPnR5cGU7CglkLnFp ZC5wYXRoID0gZGlyLT5xaWQ7CglkLnFpZC52ZXJzID0gMDsKCWQubW9kZSA9IGRpci0+cGVybTsK CWQubGVuZ3RoID0gMDsJLyogd291bGQgYmUgbmljZSB0byBkbyBiZXR0ZXIgKi8KCWQubmFtZSA9 IGRpci0+bmFtZTsKCWQudWlkID0gdXNlcjsKCWQuZ2lkID0gdXNlcjsKCWQubXVpZCA9IHVzZXI7 CglkLmF0aW1lID0gY2xvY2s7CglkLm10aW1lID0gY2xvY2s7CglyZXR1cm4gY29udkQyTSgmZCwg YnVmLCBuYnVmKTsKfQoKc3RhdGljIEZjYWxsKgpmc3lzdmVyc2lvbihGY2FsbCAqdCwgdWNoYXIg KmJ1ZiwgRmlkICpmaWQpCnsKCVVTRUQoZmlkKTsKCglpZih0LT5tc2l6ZSA8IDI1Nil7CgkJZnN5 c3Jlc3BvbmQodCwgYnVmLCAidmVyc2lvbjogbWVzc2FnZSBzaXplIHRvbyBzbWFsbCIpOwoJCXJl dHVybiB0OwoJfQoJaWYodC0+bXNpemUgPCBtZXNzYWdlc2l6ZSkKCQltZXNzYWdlc2l6ZSA9IHQt Pm1zaXplOwoJdC0+bXNpemUgPSBtZXNzYWdlc2l6ZTsKCWlmKHN0cm5jbXAodC0+dmVyc2lvbiwg IjlQMjAwMCIsIDYpICE9IDApewoJCWZzeXNyZXNwb25kKHQsIGJ1ZiwgInVucmVjb2duaXplZCA5 UCB2ZXJzaW9uIik7CgkJcmV0dXJuIHQ7Cgl9Cgl0LT52ZXJzaW9uID0gIjlQMjAwMCI7Cglmc3lz cmVzcG9uZCh0LCBidWYsIG5pbCk7CglyZXR1cm4gdDsKfQoKc3RhdGljIEZjYWxsKgpmc3lzYXV0 aChGY2FsbCAqdCwgdWNoYXIgKmJ1ZiwgRmlkICpmaWQpCnsKCVVTRUQoZmlkKTsKCWZzeXNyZXNw b25kKHQsIGJ1ZiwgImNvbnM6IGF1dGhlbnRpY2F0aW9uIG5vdCByZXF1aXJlZCIpOwoJcmV0dXJu IHQ7Cn0KCnN0YXRpYyBGY2FsbCoKZnN5c2F0dGFjaChGY2FsbCAqdCwgdWNoYXIgKmJ1ZiwgRmlk ICpmKQp7CglGY2FsbCBvdXQ7CgoJaWYoc3RyY21wKHQtPnVuYW1lLCB1c2VyKSAhPSAwKXsKCQlm c3lzcmVzcG9uZCgmb3V0LCBidWYsIEVwZXJtKTsKCQlyZXR1cm4gdDsKCX0KCWYtPmJ1c3kgPSAx OwoJZi0+b3BlbiA9IDA7CglmLT5xaWQudHlwZSA9IFFURElSOwoJZi0+cWlkLnBhdGggPSBRZGly OwoJZi0+cWlkLnZlcnMgPSAwOwoJZi0+ZGlyID0gZGlyOwoJbWVtc2V0KCZvdXQsIDAsIHNpemVv ZihGY2FsbCkpOwoJb3V0LnR5cGUgPSB0LT50eXBlOwoJb3V0LnRhZyA9IHQtPnRhZzsKCW91dC5m aWQgPSBmLT5maWQ7CglvdXQucWlkID0gZi0+cWlkOwoJZnN5c3Jlc3BvbmQoJm91dCwgYnVmLCBu aWwpOwoJcmV0dXJuIHQ7Cn0KCnN0YXRpYyBGY2FsbCoKZnN5c2ZsdXNoKEZjYWxsICp0LCB1Y2hh ciAqYnVmLCBGaWQgKmZpZCkKewoJVVNFRChmaWQpOwoKCWZzeXNyZXNwb25kKHQsIGJ1Ziwgbmls KTsKCXJldHVybiB0Owp9CgpzdGF0aWMgRmNhbGwqCmZzeXN3YWxrKEZjYWxsICp0LCB1Y2hhciAq YnVmLCBGaWQgKmYpCnsKCUZjYWxsIG91dDsKCUZpZCAqbmY7Cgl1bG9uZyBwYXRoOwoJRGlydGFi ICpkLCAqZGlyOwoJUWlkIHE7CglpbnQgaTsKCXVjaGFyIHR5cGU7CgljaGFyICplcnI7CgoJaWYo Zi0+b3Blbil7CgkJZnN5c3Jlc3BvbmQodCwgYnVmLCAiY2xvbmUgb2YgYW4gb3BlbiBmaWQiKTsK CQlyZXR1cm4gdDsKCX0KCgluZiA9IG5pbDsKCWlmKHQtPmZpZCAgIT0gdC0+bmV3ZmlkKXsKCQlu ZiA9IG5ld2ZpZCh0LT5uZXdmaWQpOwoJCWlmKG5mLT5idXN5KXsKCQkJZnN5c3Jlc3BvbmQodCwg YnVmLCAiY2xvbmUgdG8gYSBidXN5IGZpZCIpOwoJCQlyZXR1cm4gdDsKCQl9CgkJbmYtPmJ1c3kg PSAxOwoJCW5mLT5vcGVuID0gMDsKCQluZi0+ZGlyID0gZi0+ZGlyOwoJCW5mLT5xaWQgPSBmLT5x aWQ7CgkJZiA9IG5mOwkvKiB3YWxrIGYgKi8KCX0KCglvdXQubndxaWQgPSAwOwoJZXJyID0gbmls OwoJZGlyID0gZi0+ZGlyOwoJcSA9IGYtPnFpZDsKCglpZih0LT5ud25hbWUgPiAwKXsKCQlmb3Io aT0wOyBpPHQtPm53bmFtZTsgaSsrKXsKCQkJaWYoKHEudHlwZSAmIFFURElSKSA9PSAwKXsKCQkJ CWVyciA9IEVub3RkaXI7CgkJCQlicmVhazsKCQkJfQoJCQlpZihzdHJjbXAodC0+d25hbWVbaV0s ICIuLiIpID09IDApewoJCQkJdHlwZSA9IFFURElSOwoJCQkJcGF0aCA9IFFkaXI7CglBY2NlcHQ6 CgkJCQlxLnR5cGUgPSB0eXBlOwoJCQkJcS52ZXJzID0gMDsKCQkJCXEucGF0aCA9IHBhdGg7CgkJ CQlvdXQud3FpZFtvdXQubndxaWQrK10gPSBxOwoJCQkJY29udGludWU7CgkJCX0KCQkJZCA9IGRp cjsKCQkJZCsrOwkvKiBza2lwICcuJyAqLwoJCQlmb3IoOyBkLT5uYW1lOyBkKyspCgkJCQlpZihz dHJjbXAodC0+d25hbWVbaV0sIGQtPm5hbWUpID09IDApewoJCQkJCXR5cGUgPSBkLT50eXBlOwoJ CQkJCXBhdGggPSBkLT5xaWQ7CgkJCQkJZGlyID0gZDsKCQkJCQlnb3RvIEFjY2VwdDsKCQkJCX0K CQkJZXJyID0gRW5vZXhpc3Q7CgkJCWJyZWFrOwoJCX0KCX0KCglvdXQudHlwZSA9IHQtPnR5cGU7 CglvdXQudGFnID0gdC0+dGFnOwoJaWYoZXJyIT1uaWwgfHwgb3V0Lm53cWlkPHQtPm53bmFtZSl7 CgkJaWYobmYpCgkJCW5mLT5idXN5ID0gMDsKCX1lbHNlIGlmKG91dC5ud3FpZCA9PSB0LT5ud25h bWUpewoJCWYtPnFpZCA9IHE7CgkJZi0+ZGlyID0gZGlyOwoJfQoKCWZzeXNyZXNwb25kKCZvdXQs IGJ1ZiwgZXJyKTsKCXJldHVybiB0Owp9CgpzdGF0aWMgRmNhbGwqCmZzeXNvcGVuKEZjYWxsICp0 LCB1Y2hhciAqYnVmLCBGaWQgKmYpCnsKCWludCBtLCBtb2RlOwoKCS8qIGNhbid0IHRydW5jYXRl IGFueXRoaW5nLCBzbyBqdXN0IGRpc3JlZ2FyZCAqLwoJbW9kZSA9IHQtPm1vZGUgJiB+KE9UUlVO Q3xPQ0VYRUMpOwoJLyogY2FuJ3QgZXhlY3V0ZSBvciByZW1vdmUgYW55dGhpbmcgKi8KCWlmKG1v ZGU9PU9FWEVDIHx8IChtb2RlJk9SQ0xPU0UpKQoJCWdvdG8gRGVueTsKCXN3aXRjaChtb2RlKXsK CWRlZmF1bHQ6CgkJZ290byBEZW55OwoJY2FzZSBPUkVBRDoKCQltID0gMDQwMDsKCQlicmVhazsK CWNhc2UgT1dSSVRFOgoJCW0gPSAwMjAwOwoJCWJyZWFrOwoJY2FzZSBPUkRXUjoKCQltID0gMDYw MDsKCQlicmVhazsKCX0KCWlmKCgoZi0+ZGlyLT5wZXJtJn4oRE1ESVJ8RE1BUFBFTkQpKSZtKSAh PSBtKQoJCWdvdG8gRGVueTsKCgl0LT5xaWQgPSBmLT5xaWQ7Cgl0LT5pb3VuaXQgPSAwOwoJcWxv Y2soJnF1ZXVlKTsKCWYtPm1vZGUgPSBtb2RlOwoJZi0+b3BlbiA9IDE7CglmLT5kaXItPm5vcGVu Kys7CglmLT5uZXh0b3BlbiA9IGYtPmRpci0+Zm9wZW47CglmLT5kaXItPmZvcGVuID0gZjsKCXF1 bmxvY2soJnF1ZXVlKTsKCWZzeXNyZXNwb25kKHQsIGJ1ZiwgbmlsKTsKCXJldHVybiB0OwoKICAg IERlbnk6CnByaW50ZigiV2Ugc2FpZCBmdWNrIG9mZlxuIik7Cglmc3lzcmVzcG9uZCh0LCBidWYs IEVwZXJtKTsKCXJldHVybiB0Owp9CgpzdGF0aWMgRmNhbGwqCmZzeXNjcmVhdGUoRmNhbGwgKnQs IHVjaGFyICpidWYsIEZpZCAqZmlkKQp7CglVU0VEKGZpZCk7Cglmc3lzcmVzcG9uZCh0LCBidWYs IEVwZXJtKTsKCXJldHVybiB0Owp9CgpzdGF0aWMgRmNhbGwqCmZzeXNyZWFkKEZjYWxsICp0LCB1 Y2hhciAqYnVmLCBGaWQgKmYpCnsKCXVjaGFyICpiOwoJaW50IGksIG4sIG8sIGU7Cgl1aW50IGxl bjsKCURpcnRhYiAqZDsKCXVpbnQgY2xvY2s7CgoJYiA9IG1hbGxvYyhtZXNzYWdlc2l6ZS1JT0hE UlNaKTsKCWlmKGIgPT0gbmlsKXsKCQlmc3lzcmVzcG9uZCh0LCBidWYsIEVub21lbSk7CgkJcmV0 dXJuIHQ7Cgl9CgljbG9jayA9IGdldGNsb2NrKCk7CgoJaWYoZi0+cWlkLnBhdGggIT0gUWRpcil7 CgkJc3dpdGNoKChpbnQpZi0+cWlkLnBhdGgpewoJCWNhc2UgUXRpbWU6CgkJCW4gPSBzcHJpbnQo YiwgIiVkXG4iLCBjbG9jayk7CgkJCWlmKHQtPm9mZnNldCA+IG4pIHsKCQkJCXQtPmNvdW50ID0g MDsKCQkJCXQtPmRhdGEgPSBuaWw7CgkJCX0gZWxzZSB7CgkJCQl0LT5kYXRhID0gKGNoYXIgKikg KGIgKyB0LT5vZmZzZXQpOwoJCQkJdC0+Y291bnQgPSBuLSh0LT5vZmZzZXQpOwoJCQl9CgkJCWZz eXNyZXNwb25kKHQsIGJ1ZiwgbmlsKTsKCQkJZnJlZShiKTsKCQkJcmV0dXJuIHQ7CgkJY2FzZSBR Y29uczoKCQkJaWYodC0+b2Zmc2V0ID4gMCkgewoJCQkJdC0+Y291bnQgPSAwOwoJCQkJdC0+ZGF0 YSA9IG5pbDsKCQkJfSBlbHNlIHsKCQkJCWdldHMoYik7CgkJCQluID0gc3RybGVuKGIpOwoJCQkJ dC0+ZGF0YSA9IChjaGFyICopIChiICsgdC0+b2Zmc2V0KTsKCQkJCXQtPmNvdW50ID0gbi0odC0+ b2Zmc2V0KTsKCQkJfQoJCQlmc3lzcmVzcG9uZCh0LCBidWYsIG5pbCk7CgkJCWZyZWUoYik7CgkJ CXJldHVybiB0OwoJCX0KCX0KCW8gPSB0LT5vZmZzZXQ7CgllID0gdC0+b2Zmc2V0K3QtPmNvdW50 OwoKCW4gPSAwOwoJZCA9IGRpcjsKCWQrKzsJLyogZmlyc3QgZW50cnkgaXMgJy4nICovCglmb3Io aT0wOyBkLT5uYW1lIT1uaWwgJiYgaTxlOyBpKz1sZW4pewoJCWxlbiA9IGRvc3RhdChkLCBiK24s IG1lc3NhZ2VzaXplLUlPSERSU1otbiwgY2xvY2spOwoJCWlmKGxlbiA8PSBCSVQxNlNaKQoJCQli cmVhazsKCQlpZihpID49IG8pCgkJCW4gKz0gbGVuOwoJCWQrKzsKCX0KCXQtPmRhdGEgPSAoY2hh ciopYjsKCXQtPmNvdW50ID0gbjsKCWZzeXNyZXNwb25kKHQsIGJ1ZiwgbmlsKTsKCWZyZWUoYik7 CglyZXR1cm4gdDsKfQoKc3RhdGljIEZjYWxsKgpmc3lzd3JpdGUoRmNhbGwgKnQsIHVjaGFyICpi dWYsIEZpZCAqZikKewoJc3dpdGNoKChpbnQpZi0+cWlkLnBhdGgpewoJY2FzZSBRZGlyOgoJCWZz eXNyZXNwb25kKHQsIGJ1ZiwgRWlzZGlyKTsKCQlyZXR1cm4gdDsKCWNhc2UgUXRpbWU6CgkJZnN5 c3Jlc3BvbmQodCwgYnVmLCBFcGVybSk7CgkJcmV0dXJuIHQ7CgljYXNlIFFjb25zOgoJCXQtPmRh dGFbdC0+Y291bnRdPTA7CgkJcHJpbnRmKCIlcyIsdC0+ZGF0YSk7CgkJZnN5c3Jlc3BvbmQodCwg YnVmLCBuaWwpOwoJCXJldHVybiB0OwoJfQoJZnN5c3Jlc3BvbmQodCwgYnVmLCAiaW50ZXJuYWwg ZXJyb3I6IHdyaXRlIHRvIHVua25vd24gZmlsZSIpOwoJcmV0dXJuIHQ7Cn0KCnN0YXRpYyBGY2Fs bCoKZnN5c3N0YXQoRmNhbGwgKnQsIHVjaGFyICpidWYsIEZpZCAqZikKewoJdC0+c3RhdCA9IGVt YWxsb2MobWVzc2FnZXNpemUtSU9IRFJTWik7Cgl0LT5uc3RhdCA9IGRvc3RhdChmLT5kaXIsIHQt PnN0YXQsIG1lc3NhZ2VzaXplLUlPSERSU1osIGNsb2NrKTsKCWZzeXNyZXNwb25kKHQsIGJ1Ziwg bmlsKTsKCWZyZWUodC0+c3RhdCk7Cgl0LT5zdGF0ID0gbmlsOwoJcmV0dXJuIHQ7Cn0KCnN0YXRp YyBGY2FsbCoKZnN5c3dzdGF0KEZjYWxsICp0LCB1Y2hhciAqYnVmLCBGaWQgKmZpZCkKewoJVVNF RChmaWQpOwoJZnN5c3Jlc3BvbmQodCwgYnVmLCBFcGVybSk7CglyZXR1cm4gdDsKfQoKc3RhdGlj IEZjYWxsKgpmc3lzcmVtb3ZlKEZjYWxsICp0LCB1Y2hhciAqYnVmLCBGaWQgKmZpZCkKewoJVVNF RChmaWQpOwoJZnN5c3Jlc3BvbmQodCwgYnVmLCBFcGVybSk7CglyZXR1cm4gdDsKfQoKc3RhdGlj IEZjYWxsKgpmc3lzY2x1bmsoRmNhbGwgKnQsIHVjaGFyICpidWYsIEZpZCAqZikKewoJRmlkICpw cmV2OwoJRGlydGFiICpkOwoKCXFsb2NrKCZxdWV1ZSk7CglpZihmLT5vcGVuKXsKCQlkID0gZi0+ ZGlyOwoJCWQtPm5vcGVuLS07CgoJCXByZXYgPSBuaWw7Cgl9CglmLT5idXN5ID0gMDsKCWYtPm9w ZW4gPSAwOwoJZi0+b2Zmc2V0ID0gMDsKCWlmKGYtPndyaXRlYnVmICE9IG5pbCl7CgkJZnJlZShm LT53cml0ZWJ1Zik7CgkJZi0+d3JpdGVidWYgPSBuaWw7Cgl9CglxdW5sb2NrKCZxdWV1ZSk7Cglm c3lzcmVzcG9uZCh0LCBidWYsIG5pbCk7CglyZXR1cm4gdDsKfQoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABta2ZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAyMTYzADAwMDAwMDAAMDAwMDAwMDAyNTEAMTAyMjEx NDU1MzEAMDExMjUwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyICAAZXJpY3ZoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByb290AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwkUExBTjkvc3JjL21raGRyCgpUQVJHPWRldmNv bnMKU0hPUlRMSUI9ZnMgbXV4IHRocmVhZCByZWdleHA5IGJpbyA5Cgo8JFBMQU45L3NyYy9ta21h bnkKCkRFVkNPTlM9ZGV2Y29ucy4kTyBmc3lzLiRPCgokREVWQ09OUzoJJEhGSUxFUyBkZXZjb25z LmgKCiRPLmRldmNvbnM6CSRERVZDT05TCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAA= ------=_Part_14257_19846105.1116939183908--