From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from dns.primenet.com.au (dns.primenet.com.au [203.24.36.40]) by coral.primenet.com.au (8.7.5/8.7.3) with ESMTP id NAA00297 for ; Thu, 22 Aug 1996 13:41:20 +1000 (EST) Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by dns.primenet.com.au (8.7.5/8.7.3) with ESMTP id IAA00849 for ; Thu, 22 Aug 1996 08:18:07 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id RAA08760; Wed, 21 Aug 1996 17:56:02 -0400 (EDT) Resent-Date: Wed, 21 Aug 1996 17:56:02 -0400 (EDT) Date: Wed, 21 Aug 1996 17:52:47 -0400 (EDT) From: "Greg J. Badros" To: Zoltan Hidvegi Cc: zsh-workers@math.gatech.edu Subject: Patches for New Features In-Reply-To: <199608211835.UAA08558@bolyai.cs.elte.hu> Message-Id: Mime-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-851401618-840664367=:23539" Resent-Message-ID: <"L8UCM2.0.l82.nNu6o"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2044 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---559023410-851401618-840664367=:23539 Content-Type: TEXT/PLAIN; charset=US-ASCII I have spent some time over the last several days delving into zshell (I had jury duty! :-) ) and have made some exciting (to me, anyway) improvements that I'd like to get some feedback on, and would love to see in a future version of Zshell. The patches are attached. The enhancements they provide have been tested both on Linux-2.0.12 (RedHat 3.0.3 w/ upgraded kernel) and on Sun Solaris 2.4 (where I need a -ltermcap to build properly-- configure problem??) Briefly, the enhancements are post-prompt printing, partial word "CamelCaps" movement and deletion in zle, rudimentary dynamic abbreviation (like emacs), and color-ls like colorized filename completion listings. Detailed descriptions follow. Please note! ALL USUAL DISCLAIMERS APPLY! I am not responsible for any problems that this causes you, I hope that it is useful but make no claims whatsoever about its functioning or correctness. You may redistribute unmodified, modify it for personal use (please send me a copy). I'd be happy to see the patches become part of version 3.1. =============================================== o A postprompt mechanism which allows the user to customize a "prompt" string (print -P format) to be output to the terminal after the most recent foreground process has been executing for a given number of seconds. (An improvement over a similar patch with limited distribution for zsh-2.5.03). My main goal for this feature is to make Zshell output an xterm control sequence to change the window/icon name based on the current foreground process, totally automatically. For example: part of my .zshrc ---------------------- ... # InteractiveComments are nice to add an extra note to a command line setopt interactivecomments setopt promptsubst # The escape sequences only work in xterm or color_xterm's, so # guard for them if [ "$TERM" == "xterm" -o "$TERM" == "color_xterm" ]; then # Output an initial string to set the window title to the hostname # followed by a # if you're root print -nP '%{\e]0;%m%(#.#.)\C-g%}' # %H is a new prompt character meaning the last zle line # I use cmd substitution w/ print here so that # my escape characters are cut & pastable POSTPROMPT=`print -n '%{\e]0;%m%(#.#.) %H\C-g%}'` # We only commands that run for >= 4 seconds will output the postprompt # This eliminates trivial commands like "ls", etc. PPTMOUT=4 fi ----------------------- As you can see above, the new mechanism is controlled by: $POSTPROMPT variable, set to the prompt to print $PPTMOUT variable, set to the number of seconds to wait before outputting the post-prompt. Or set to 0 for no post-prompt (the default) or set to -1 for no waiting (output it right away). %H as a new prompt substitution character, to mean the last zle line. Try this feature out with "sleep 6", or just man zshall, then wait four seconds-- your window title should change, making that xterm with the man page easier to find in your window manager's window list (I use FVWM2, and this works great!) =============================================== o Simple new ZLE functions, {for,back}ward-word-part and {for,back}ward-delete-word-part. These move through CamelCaps occurring in the zle line. I have these bound like so: bindkey "\eOD" backward-word-part bindkey "\eOC" forward-word-part bindkey "^\\" backward-delete-word-part Where my .Xdefaults overrides the C-S-H keystroke to give \eOD, and the C-S-L keystroke to give \eOC. They should work with numeric args, etc. and may not be useful to everyone, but they give some added flexibility, and make zle capabilities more like emacs. =============================================== o Rudimentary (read "poor") dabbrev-complete ZLE function. I'd love to see someone who knows about zsh's completion mechanism do this right. ****It is a feature of tcsh that zsh lacks******! Currently it doesn't complete back on the currently line, and doesn't cycle choices properly, but since I know I'm doing this wrong I didn't want to spend more time on it. By default, bound to M-/, but must compile with -DSIMPLE_DABBREV_GJB to enable it. (See bindkey -me and your terminal settings to see if your meta key will work). =============================================== and last but certainly not least! o Color-ls like colorized filename completion listings. Analogous to the LIST_TYPES option, my new LIST_COLORS option turns this feature on. It uses ZLS_COLORS, ZLS_COLOURS, LS_COLORS, LS_COLOURS [first found, in that order] to set the colors options. See dircolors(1) from the color-ls patch, available on sunsite and elsewhere. If you don't have dircolors and the color-ls patch to ls, get them, but here is my LS_COLORS setting so you can use it with zsh: export LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:\ bd=40;33;01:cd=40;33;01:or=01;05;31;40:ex=32;40:\ *.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:\ *.tar=00;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:\ *.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.rpm=34:*.jpg=01;35:\ *.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:" Be sure to only set the listcolors option when running color_xterm, or another terminal type that supports ansi color sequences (linux console is fine, too). Otherwise you'll get some bizarre escape sequences showing up. I use: unsetopt MENU_COMPLETE setopt AUTO_LIST setopt AUTO_MENU setenv LISTMAX 0 Try ls / or just ls then type the beginning of a directory name, complete it, and hit again to list that directory. ================================================== Please give me feedback about what you like and what you don't like. Also, if anyone is going to pick up the dabbrevcomplete function, I'd love to drop it from my patches. Alternatively, hints and/or pointers are appreciated. Attached are separate patches, one for the post prompt feature, and a second for everything else. I know these work when applied in that order. Please let me know if something doesn't work for you, with the usual detailed description. I can't promise to fix it, but I will when it's important and time permits. You may also be able to find these patches on my web site, http://www.cs.duke.edu/~gjb, in a couple days. Greg J. Badros gjb@cs.duke.edu http://www.cs.duke.edu/~gjb ---559023410-851401618-840664367=:23539 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="zsh-3.0.0-postprompt-gjb.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: PostPrompt Patch KioqIGdsb2JhbHMuaAkxOTk2LzA4LzE5IDAyOjA2OjUzCTEuMQ0KLS0tIGds b2JhbHMuaAkxOTk2LzA4LzIwIDAxOjAzOjMwCTEuMg0KKioqKioqKioqKioq KioqDQoqKiogMzMxLDMzNiAqKioqDQotLS0gMzMxLDMzNyAtLS0tDQogIEVY VEVSTiBjaGFyICpwcm9tcHQ0Ow0KICBFWFRFUk4gY2hhciAqcnByb21wdDsJ CS8qICRSUFJPTVBUICAgICovDQogIEVYVEVSTiBjaGFyICpzcHJvbXB0Ow0K KyBFWFRFUk4gY2hhciAqcG9zdHByb21wdDsNCiAgDQogIEVYVEVSTiBjaGFy ICp3b3JkY2hhcnM7DQogIEVYVEVSTiBjaGFyICpyc3RyaW5nLCAqUnN0cmlu ZzsNCioqKiBoYXNodGFibGUuaAkxOTk2LzA4LzE5IDIzOjQ5OjEzCTEuMQ0K LS0tIGhhc2h0YWJsZS5oCTE5OTYvMDgvMjAgMDE6MDI6MTUJMS4yDQoqKioq KioqKioqKioqKioNCioqKiAxNTYsMTYxICoqKioNCi0tLSAxNTYsMTYyIC0t LS0NCiAgSVBERUY3KCJQUzQiLCAmcHJvbXB0NCksDQogIElQREVGNygiUlBT MSIsICZycHJvbXB0KSwNCiAgSVBERUY3KCJTUFJPTVBUIiwgJnNwcm9tcHQp LA0KKyBJUERFRjcoIlBPU1RQUk9NUFQiLCAmcG9zdHByb21wdCksDQogIElQ REVGNygiMCIsICZhcmd6ZXJvKSwNCiAgDQogICNkZWZpbmUgSVBERUY4KEEs QixDKSB7TlVMTCxBLFBNX1NDQUxBUnxQTV9TUEVDSUFMLE5VTEwsSUZOKGNv bG9uYXJyc2V0Zm4pLElGTihjb2xvbmFycmdldGZuKSwwLCh2b2lkICopQixO VUxMLEMsTlVMTCwwfQ0KKioqIGluaXQuYwkxOTk2LzA4LzE4IDIwOjI3OjE0 CTEuMQ0KLS0tIGluaXQuYwkxOTk2LzA4LzIwIDAxOjAzOjQ1CTEuMg0KKioq KioqKioqKioqKioqDQoqKiogNTE1LDUyMCAqKioqDQotLS0gNTE1LDUyMSAt LS0tDQogIAlwcm9tcHQzID0genRyZHVwKCIiKTsNCiAgCXByb21wdDQgPSB6 dHJkdXAoIiIpOw0KICAgICAgfQ0KKyAgICAgcG9zdHByb21wdCA9IHp0cmR1 cCgiIik7DQogICAgICBzcHJvbXB0ID0genRyZHVwKCJ6c2g6IGNvcnJlY3Qg JyVSJyB0byAnJXInIFtueWFlXT8gIik7DQogIA0KICAgICAgaWYgKCEodHR5 c3RybmFtZSA9IHp0cmR1cCh0dHluYW1lKFNIVFRZKSkpKQ0KKioqIHNpZ25h bHMuYwkxOTk2LzA4LzE4IDIwOjMzOjUyCTEuMQ0KLS0tIHNpZ25hbHMuYwkx OTk2LzA4LzIwIDAxOjAxOjU1CTEuMg0KKioqKioqKioqKioqKioqDQoqKiog MzA5LDMxNCAqKioqDQotLS0gMzA5LDMxNSAtLS0tDQogIA0KICAgICAgc2ln ZmlsbHNldCgmc2V0KTsNCiAgICAgIHNpZ2RlbHNldCgmc2V0LCBzaWcpOw0K KyAgICAgc2lnZGVsc2V0KCZzZXQsIFNJR0FMUk0pOw0KICAgICAgc2lnZGVs c2V0KCZzZXQsIFNJR0hVUCk7ICAvKiBzdGlsbCBkb24ndCBrbm93IHdoeSB3 ZSBhZGQgdGhpcz8gKi8NCiAgICAgIGlmIChzaWcyKQ0KICAgICAgICAgIHNp Z2RlbHNldCgmc2V0LCBzaWcyKTsNCioqKioqKioqKioqKioqKg0KKioqIDMx OSwzMjQgKioqKg0KLS0tIDMyMCwzMjYgLS0tLQ0KICANCiAgICAgIHNpZ2Zp bGxzZXQoJnNldCk7DQogICAgICBzaWdkZWxzZXQoJnNldCwgc2lnKTsNCisg ICAgIHNpZ2RlbHNldCgmc2V0LCBTSUdBTFJNKTsNCiAgICAgIGlmIChzaWcy KQ0KICAgICAgICBzaWdkZWxzZXQoJnNldCwgc2lnMik7DQogICAgICByZXQg PSBzaWdwYXVzZShzZXQpOw0KKioqKioqKioqKioqKioqDQoqKiogNTM4LDU0 OSAqKioqDQogICAgICAgICAgYnJlYWs7DQogIA0KICAgICAgY2FzZSBTSUdB TFJNOg0KISAgICAgICAgIGlmIChzaWd0cmFwcGVkW1NJR0FMUk1dKSB7DQog IAkgICAgaW50IHRtb3V0Ow0KISAgICAgICAgICAgICBkb3RyYXAoU0lHQUxS TSk7DQohICAgICAgICAgICAgIGlmICgodG1vdXQgPSBnZXRpcGFyYW0oIlRN T1VUIikpKQ0KISAgICAgICAgICAgICAgICAgYWxhcm0odG1vdXQpOyAgICAg ICAgICAgLyogcmVzZXQgdGhlIGFsYXJtICovDQohICAgICAgICAgfSBlbHNl IHsNCiAgCSAgICBpbnQgaWRsZSA9IHR0eWlkbGVnZXRmbihOVUxMKTsNCiAg CSAgICBpbnQgdG1vdXQgPSBnZXRpcGFyYW0oIlRNT1VUIik7DQogIAkgICAg aWYgKGlkbGUgPj0gMCAmJiBpZGxlIDwgdG1vdXQpDQotLS0gNTQwLDU1OSAt LS0tDQogICAgICAgICAgYnJlYWs7DQogIA0KICAgICAgY2FzZSBTSUdBTFJN Og0KISAJaWYgKCF6bGVhY3RpdmUpIHsNCiEgCSAgICAvKiBPbmUgcG9zc2li aWxpdHkgaXMgdG8gZG8gdGhlIFRSQVBBTFJNIGZuIC0tIGhvd2V2ZXIsDQoh IAkgICAgICAgSSBjaG9vc2UgdG8gc2F2ZSB0aGF0IGZvciB0aGUgVE1PVVQg bWVjaGFuaXNtLS0gYSBuZXcgcHJvbXB0DQohIAkgICAgICAgaXMgYWxsIHdl IHJlYWxseSBuZWVkLCBtZXRoaW5rcyAqLw0KISAJICAgIC8qZG90cmFwKFNJ R0FMUk0pOyovDQohIAkgICAgcHV0cG9zdHByb21wdCgpOw0KISAJICAgIGFs YXJtKDApOw0KISAJICAgIH0NCiEgCWVsc2UgaWYgKHNpZ3RyYXBwZWRbU0lH QUxSTV0pIHsNCiAgCSAgICBpbnQgdG1vdXQ7DQohIAkgICAgZG90cmFwKFNJ R0FMUk0pOw0KISAJICAgIGlmICgodG1vdXQgPSBnZXRpcGFyYW0oIlRNT1VU IikpKQ0KISAJCWFsYXJtKHRtb3V0KTsJCS8qIHJlc2V0IHRoZSBhbGFybSAq Lw0KISAJfSBlbHNlIHsNCiAgCSAgICBpbnQgaWRsZSA9IHR0eWlkbGVnZXRm bihOVUxMKTsNCiAgCSAgICBpbnQgdG1vdXQgPSBnZXRpcGFyYW0oIlRNT1VU Iik7DQogIAkgICAgaWYgKGlkbGUgPj0gMCAmJiBpZGxlIDwgdG1vdXQpDQoq KiogdmVyc2lvbi5oCTE5OTYvMDgvMTggMjA6NDI6MDEJMS4xDQotLS0gdmVy c2lvbi5oCTE5OTYvMDgvMjAgMDE6MDQ6MDYJMS4yDQoqKioqKioqKioqKioq KioNCioqKiAxICoqKioNCiEgI2RlZmluZSBaU0hfVkVSU0lPTiAiMy4wLjAi DQotLS0gMSAtLS0tDQohICNkZWZpbmUgWlNIX1ZFUlNJT04gIjMuMC4wLWdq YiINCioqKiB6bGVfbWFpbi5jCTE5OTYvMDgvMTggMTk6NTc6MjQJMS4xDQot LS0gemxlX21haW4uYwkxOTk2LzA4LzIwIDAwOjU5OjQ4CTEuMg0KKioqKioq KioqKioqKioqDQoqKiogMzQyLDM0NyAqKioqDQotLS0gMzQyLDM2MyAtLS0t DQogIA0KICAvKiBSZWFkIGEgbGluZS4gIEl0IGlzIHJldHVybmVkIG1ldGFm aWVkLiAqLw0KICANCisgI2RlZmluZSBjY2hNYXhJblpsZUxpbmUgNjQNCisg Y2hhciBzekxhc3RabGVMaW5lW2NjaE1heEluWmxlTGluZV07DQorIA0KKyAv KiovDQorIHZvaWQNCisgcHV0cG9zdHByb21wdCh2b2lkKQ0KKyB7DQorICAg ICBpbnQgcGxlbiA9IDA7DQorICAgICBjaGFyICpzelBvc3RQcm9tcHQgPSBw dXRwcm9tcHQocG9zdHByb21wdCwmcGxlbixOVUxMLDApOw0KKyAgICAgLyog ICAgZnByaW50ZihzdGRlcnIsIlNJR0FMUk0gY2FzZS4gc3pQb3N0UHJvbXB0 ID0gJXNuIixzelBvc3RQcm9tcHQpOyANCisgICAgIGZmbHVzaChzdGRlcnIp OyAqLw0KKyAgICAgZndyaXRlKHN6UG9zdFByb21wdCxzaXplb2YoY2hhciks cGxlbixzdGRlcnIpOw0KKyAgICAgZmZsdXNoKHN0ZGVycik7DQorICAgICBm cmVlKHN6UG9zdFByb21wdCk7DQorIH0NCisgDQogIC8qKi8NCiAgdW5zaWdu ZWQgY2hhciAqDQogIHpsZXJlYWQoY2hhciAqbHAsIGNoYXIgKnJwKQ0KKioq KioqKioqKioqKioqDQoqKiogNDE3LDQyNCAqKioqDQogIAlpbml0dW5kbygp Ow0KICAJaWYgKGlzc2V0KFBST01QVENSKSkNCiAgCSAgICBwdXRjKCdccics IHNob3V0KTsNCiEgCWlmICh0bW91dCkNCiEgCSAgICBhbGFybSh0bW91dCk7 DQogIAlnZW5wcm9tcHRzKCk7DQogIAl6bGVhY3RpdmUgPSAxOw0KICAJcmVz ZXRuZWVkZWQgPSAxOw0KLS0tIDQzMyw0MzkgLS0tLQ0KICAJaW5pdHVuZG8o KTsNCiAgCWlmIChpc3NldChQUk9NUFRDUikpDQogIAkgICAgcHV0YygnXHIn LCBzaG91dCk7DQohIAlhbGFybSh0bW91dCk7DQogIAlnZW5wcm9tcHRzKCk7 DQogIAl6bGVhY3RpdmUgPSAxOw0KICAJcmVzZXRuZWVkZWQgPSAxOw0KKioq KioqKioqKioqKioqDQoqKiogNDg5LDQ5NiAqKioqDQogIAlzdGF0dXNsaW5l ID0gTlVMTDsNCiAgCWludmFsaWRhdGVsaXN0KCk7DQogIAl0cmFzaHpsZSgp Ow0KICAJemxlYWN0aXZlID0gMDsNCiEgCWFsYXJtKDApOw0KICAgICAgfSBM QVNUQUxMT0M7DQogICAgICB6c2ZyZWUoY3VyaGlzdGxpbmUpOw0KICAgICAg ZnJlZShsYXN0bGluZSk7CQkvKiBmcmVldW5kbyAqLw0KLS0tIDUwNCw1MTUg LS0tLQ0KICAJc3RhdHVzbGluZSA9IE5VTEw7DQogIAlpbnZhbGlkYXRlbGlz dCgpOw0KICAJdHJhc2h6bGUoKTsNCisgCXN0cm5jcHkoc3pMYXN0WmxlTGlu ZSwgbGluZSwgY2NoTWF4SW5abGVMaW5lKTsNCiAgCXpsZWFjdGl2ZSA9IDA7 DQohIAlpZiAoKHRtb3V0ID0gZ2V0aXBhcmFtKCJQUFRNT1VUIikpIDwgMCkN CiEgCSAgICBwdXRwb3N0cHJvbXB0KCk7DQohIAllbHNlIC8qIGlmIHRtb3V0 ID09IDAsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBhbGFybSwgc28ganVzdCBj YWxsIGFsYXJtICovDQohIAkgICAgYWxhcm0odG1vdXQpOw0KICAgICAgfSBM QVNUQUxMT0M7DQogICAgICB6c2ZyZWUoY3VyaGlzdGxpbmUpOw0KICAgICAg ZnJlZShsYXN0bGluZSk7CQkvKiBmcmVldW5kbyAqLw0KKioqIHpsZV9taXNj LmMJMTk5Ni8wOC8xOSAwMjowNDozOAkxLjENCi0tLSB6bGVfbWlzYy5jCTE5 OTYvMDgvMjAgMDE6MDA6MzIJMS4yDQoqKioqKioqKioqKioqKioNCioqKiA4 MDUsODEwICoqKioNCi0tLSA4MDUsODEyIC0tLS0NCiAgc3RhdGljIGNoYXIg KmJ1ZiwgKmJwMSwgKmJsMCwgKmZtLCAqcG1wdDsNCiAgc3RhdGljIGludCBi cmFjZXBvcywgYnVmc3BjOw0KICANCisgZXh0ZXJuIGNoYXIgc3pMYXN0Wmxl TGluZVtdOw0KKyANCiAgLyoqLw0KICBjaGFyICoNCiAgcHV0cHJvbXB0KGNo YXIgKmZtaW4sIGludCAqbGVucCwgaW50ICp3cCwgaW50IGNudCkNCioqKioq KioqKioqKioqKg0KKioqIDEwMzgsMTA0MyAqKioqDQotLS0gMTA0MCwxMDQ4 IC0tLS0NCiAgCQlicmVhazsNCiAgCSAgICBjYXNlICdNJzoNCiAgCQlzdHJh ZGQoaG9zdG5hbSk7DQorIAkJYnJlYWs7DQorIAkgICAgY2FzZSAnSCc6DQor IAkJc3RyYWRkKHN6TGFzdFpsZUxpbmUpOw0KICAJCWJyZWFrOw0KICAJICAg IGNhc2UgJ20nOg0KICAJCWlmICghYXJnKQ0K ---559023410-851401618-840664367=:23539 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="zsh-3.0.0-color-dabbrev-gjb.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Color Listing and ZLE Patch KioqIGdsb2JhbHMuaAkxOTk2LzA4LzIwIDAxOjAzOjMwCTEuMg0KLS0tIGds b2JhbHMuaAkxOTk2LzA4LzIxIDE5OjI0OjAwCTEuMw0KKioqKioqKioqKioq KioqDQoqKiogNzMyLDczNyAqKioqDQotLS0gNzMyLDczOCAtLS0tDQogICAg ICB7Imxpc3RhbWJpZ3VvdXMiLCAJCTAsICAgIDAsICAgIDB9LA0KICAgICAg eyJsaXN0YmVlcCIsIAkJMCwgICAgMCwgICAgT1BUX0FMTH0sDQogICAgICB7 Imxpc3R0eXBlcyIsIAkJJ1gnLCAgMCwgICAgT1BUX0NTSH0sDQorICAgICB7 Imxpc3Rjb2xvcnMiLCAJCTAsICAgIDAsICAgIDB9LA0KICAgICAgeyJsb2Nh bG9wdGlvbnMiLCAJCTAsICAgIDAsICAgIE9QVF9FTVVMQVRFfE9QVF9LU0h9 LA0KICAgICAgeyJsb2dpbiIsIAkJCSdsJywgICdsJywgIE9QVF9TUEVDSUFM fSwNCiAgICAgIHsibG9uZ2xpc3Rqb2JzIiwgCQknUicsICAwLCAgICAwfSwN CioqKiB6bGVfdHJpY2t5LmMJMTk5Ni8wOC8yMCAxMzo1OTo1NAkxLjENCi0t LSB6bGVfdHJpY2t5LmMJMTk5Ni8wOC8yMSAyMDowNzo0OAkxLjMNCioqKioq KioqKioqKioqKg0KKioqIDIxMSwyMTkgKioqKg0KICAjZGVmaW5lIENPTVBf Q09NUExFVEUgMA0KICAjZGVmaW5lIENPTVBfTElTVF9DT01QTEVURSAxDQog ICNkZWZpbmUgQ09NUF9TUEVMTCAyDQohICNkZWZpbmUgQ09NUF9FWFBBTkQg Mw0KISAjZGVmaW5lIENPTVBfRVhQQU5EX0NPTVBMRVRFIDQNCiEgI2RlZmlu ZSBDT01QX0xJU1RfRVhQQU5EIDUNCiAgI2RlZmluZSBDT01QX0lTRVhQQU5E KFgpICgoWCkgPj0gQ09NUF9FWFBBTkQpDQogIA0KICAvKiovDQotLS0gMjEx LDIyMCAtLS0tDQogICNkZWZpbmUgQ09NUF9DT01QTEVURSAwDQogICNkZWZp bmUgQ09NUF9MSVNUX0NPTVBMRVRFIDENCiAgI2RlZmluZSBDT01QX1NQRUxM IDINCiEgI2RlZmluZSBDT01QX0RBQkJSRVYgMw0KISAjZGVmaW5lIENPTVBf RVhQQU5EIDQNCiEgI2RlZmluZSBDT01QX0VYUEFORF9DT01QTEVURSA1DQoh ICNkZWZpbmUgQ09NUF9MSVNUX0VYUEFORCA2DQogICNkZWZpbmUgQ09NUF9J U0VYUEFORChYKSAoKFgpID49IENPTVBfRVhQQU5EKQ0KICANCiAgLyoqLw0K KioqKioqKioqKioqKioqDQoqKiogMjU3LDI2MiAqKioqDQotLS0gMjU4LDM2 NCAtLS0tDQogICAgICBkb2NvbXBsZXRlKENPTVBfU1BFTEwpOw0KICB9DQog IA0KKyAjaWZkZWYgU0lNUExFX0RBQkJSRVZfR0pCDQorIC8qIEZJWDogVGhp cyBzaG91bGQgcmVhbGx5IHVzZSBzb21lIG9mIHRoZSBjb21wbGV0aW9uIHN0 dWZmIHByb3ZpZGVkDQorICAgIGVsc2V3aGVyZSAqLw0KKyAvKiovDQorIHZv aWQNCisgZGFiYnJldmNvbXBsZXRlKHZvaWQpDQorIHsNCisgICAgIGNoYXIg KnBjaFN0YXJ0V29yZCA9IGxpbmUrY3M7DQorICAgICBpbnQgaWNoID0gY3M7 DQorICAgICBpbnQgY2NoV29yZCA9IDA7DQorICAgICBpbnQgaWhpc3RTZWFy Y2ggPSBjdXJoaXN0Ow0KKyAgICAgQ29tcCBjb21wYyA9IE5VTEw7DQorICAg ICBjaGFyICplOw0KKyAgICAgY2hhciAqaDsNCisgICAgIGNoYXIgaHBhdHNh djsNCisgICAgIEhpc3RlbnQgaGU7DQorICAgICBzdGF0aWMgaW50IGloaXN0 TGFzdFdoZW5Db21wbGV0aW5nID0gLTE7DQorICAgICBzdGF0aWMgaW50IGlo aXN0TGFzdFNlYXJjaGVkID0gLTE7DQorICAgICBzdGF0aWMgY2hhciAqcGNo U3RhcnRXb3JkTGFzdCA9IE5VTEw7DQorICAgICBzdGF0aWMgY2hhciBjY2hJ bnNlcnRlZCA9IDA7DQorIA0KKyAgICAgaWYgKGljaCA+IDApDQorIAl7DQor IAlpY2gtLTsNCisgCXBjaFN0YXJ0V29yZC0tOw0KKyAJfQ0KKyAgICAgd2hp bGUgKGljaCAmJiAhaXNzcGFjZSgqcGNoU3RhcnRXb3JkKSkNCisgCXsNCisg CWljaC0tOw0KKyAJcGNoU3RhcnRXb3JkLS07DQorIAl9DQorICAgICBpZiAo aXNzcGFjZSgqcGNoU3RhcnRXb3JkKSkgew0KKyAJaWNoKys7DQorIAlwY2hT dGFydFdvcmQrKzsNCisgICAgIH0NCisgICAgIGNjaFdvcmQgPSBjcy1pY2g7 DQorICAgICANCisgICAgIC8qIENoZWNrIGlmIHRoaXMgaXMgb3VyIHNlY29u ZCBjb25zZWN1dGl2ZSBwcmVzcywgdG8gY29udGludWUgb2xkIHNlYXJjaCAq Lw0KKyAgICAgaWYgKGloaXN0TGFzdFdoZW5Db21wbGV0aW5nID09IGN1cmhp c3QgJiYgcGNoU3RhcnRXb3JkTGFzdCA9PSBwY2hTdGFydFdvcmQNCisgCSYm IChsYXN0Y21kICYgWkxFX01FTlVDTVApKSB7DQorIAkvKiBjb250aW51ZSBv bGQgc2VhcmNoICovDQorIAliYWNrZGVsKGNjaEluc2VydGVkKTsNCisgCWNj aEluc2VydGVkID0gMDsNCisgCWloaXN0U2VhcmNoID0gaWhpc3RMYXN0U2Vh cmNoZWQgLSAxOw0KKyAJaWYgKGloaXN0U2VhcmNoIDwgMCkgew0KKyAJICAg IGloaXN0U2VhcmNoID0gY3VyaGlzdDsNCisgCX0NCisgICAgIH0NCisgDQor ICAgICBwY2hTdGFydFdvcmRMYXN0ID0gcGNoU3RhcnRXb3JkOw0KKyANCisg ICAgIHdoaWxlICgxKSB7DQorIAkvKiBQYXJzZSB0aGUgcGF0dGVybiwgaWYg aXQgaXNuJ3QgdGhlIG51bGwgc3RyaW5nLiAqLw0KKyAJaWYgKCpwY2hTdGFy dFdvcmQpIHsNCisgCSAgICBjaGFyICp0aHBhdCA9IGR1cHN0cmluZyhwY2hT dGFydFdvcmQpOw0KKyAJICAgIHRocGF0W2NjaFdvcmRdID0gJyonOw0KKyAJ ICAgIHRocGF0W2NjaFdvcmQrMV0gPSAwOw0KKyAJICAgIHRva2VuaXplKHRo cGF0KTsNCisgCSAgICBjb21wYyA9IHBhcnNlcmVnKHRocGF0KTsNCisgCX0N CisgDQorIAkvKiBGSVg6IEZpcnN0IGNoZWNrIGVhcmxpZXIgb24gdGhlIGN1 cnJlbnQgbGluZSAoaW4gImxpbmUiKSAqLw0KKyANCisgCS8qIE5vdyBzZWFy Y2ggdGhlIGhpc3RvcnkuICovDQorIAl3aGlsZSAoKGhlID0gcXVpZXRnZXRo aXN0KGloaXN0U2VhcmNoLS0pKSkgew0KKyAJICAgIGludCBpd29yZHM7DQor IAkgICAgZm9yIChpd29yZHMgPSAwOyBpd29yZHMgPCBoZS0+bndvcmRzOyBp d29yZHMrKykgew0KKyAJCWggPSBoZS0+dGV4dCArIGhlLT53b3Jkc1tpd29y ZHMqMl07DQorIAkJZSA9IGhlLT50ZXh0ICsgaGUtPndvcmRzW2l3b3Jkcyoy KzFdOw0KKyAJCWhwYXRzYXYgPSAqZTsNCisgCQkqZSA9ICdcMCc7DQorIAkJ LyogV2Ugbm93IGhhdmUgYSB3b3JkIGZyb20gdGhlIGhpc3RvcnksIGlnbm9y ZSBpdCAqDQorIAkJICogaWYgaXQgYmVnaW5zIHdpdGggYSBxdW90ZSBvciBg JCcuICAgICAgICAgICAgICAqLw0KKyAJCWlmICgqaCAhPSAnXCcnICYmICpo ICE9ICciJyAmJiAqaCAhPSAnYCcgJiYgKmggIT0gJyQnICYmDQorIAkJICAg ICghY29tcGMgfHwgZG9tYXRjaChoLCBjb21wYywgMCkpKSB7DQorIAkJICAg IGNjaEluc2VydGVkID0gc3RybGVuKGgpIC0gY2NoV29yZDsNCisgCQkgICAg LyogT3RoZXJ3aXNlIGFkZCBpdCBpZiBpdCB3YXMgbWF0Y2hlZC4gKi8NCisg CQkgICAgaW5zdHN0cmxlbihoK2NjaFdvcmQsMSwtMSk7DQorIAkJICAgIGdv dG8gY29udDsNCisgCQl9DQorIAkJaWYgKGhwYXRzYXYpDQorIAkJICAgICpl ID0gaHBhdHNhdjsNCisgCSAgICB9DQorIAl9DQorIAkvKiBGSVg6IHBlcmhh cHMgZ2l2ZSBpdCBhIHByZWZpeCBvZiAnKicgYW5kIHJldHJ5ICovDQorIAli cmVhazsNCisgICAgIH0NCisgY29udDoNCisgICAgIGloaXN0TGFzdFNlYXJj aGVkID0gaWhpc3RTZWFyY2g7DQorICAgICBpaGlzdExhc3RXaGVuQ29tcGxl dGluZyA9IGN1cmhpc3Q7DQorIH0NCisgI2Vsc2UgLyogISBTSU1QTEVfREFC QlJFVl9HSkIgKi8NCisgLyoqLw0KKyB2b2lkDQorIGRhYmJyZXZjb21wbGV0 ZSh2b2lkKQ0KKyB7DQorICAgICB1c2VtZW51ID0gdXNlZ2xvYiA9IDA7DQor ICAgICBkb2NvbXBsZXRlKENPTVBfREFCQlJFVik7DQorIH0NCisgI2VuZGlm IC8qIFNJTVBMRV9EQUJCUkVWX0dKQiAqLw0KKyANCiAgLyoqLw0KICB2b2lk DQogIGRlbGV0ZWNoYXJvcmxpc3Qodm9pZCkNCioqKioqKioqKioqKioqKg0K KioqIDY4Niw2OTIgKioqKg0KICAJICAgIC8qIGNhbGwgdGhlIHJlYWwgc3Bl bGwgY2hlY2tlciwgYXNoQGFhaWkub3ouenUgKi8NCiAgCSAgICBzcGNrd29y ZCh4LCAwLCBsaW5jbWQsIDApOw0KICAJICAgIGluc3RzdHIoKngpOw0KISAJ fSBlbHNlIGlmIChDT01QX0lTRVhQQU5EKGxzdCkpIHsNCiAgCSAgICAvKiBE byBleHBhbnNpb24uICovDQogIAkgICAgY2hhciAqb2wgPSAob2xzdCA9PSBD T01QX0VYUEFORF9DT01QTEVURSkgPw0KICAJCWR1cHN0cmluZygoY2hhciAq KWxpbmUpIDogKGNoYXIgKilsaW5lOw0KLS0tIDc4OCw4MDAgLS0tLQ0KICAJ ICAgIC8qIGNhbGwgdGhlIHJlYWwgc3BlbGwgY2hlY2tlciwgYXNoQGFhaWku b3ouenUgKi8NCiAgCSAgICBzcGNrd29yZCh4LCAwLCBsaW5jbWQsIDApOw0K ICAJICAgIGluc3RzdHIoKngpOw0KISAJfSANCiEgI2lmbmRlZiBTSU1QTEVf REFCQlJFVl9HSkINCiEgCWVsc2UgaWYgKGxzdCA9PSBDT01QX0RBQkJSRVYp IHsNCiEgCSAgICAvKiBGSVg6IFdoYXQgdG8gZG8/Pz8gKi8NCiEgCX0NCiEg I2VuZGlmDQohIAllbHNlIGlmIChDT01QX0lTRVhQQU5EKGxzdCkpIHsNCiAg CSAgICAvKiBEbyBleHBhbnNpb24uICovDQogIAkgICAgY2hhciAqb2wgPSAo b2xzdCA9PSBDT01QX0VYUEFORF9DT01QTEVURSkgPw0KICAJCWR1cHN0cmlu ZygoY2hhciAqKWxpbmUpIDogKGNoYXIgKilsaW5lOw0KKioqKioqKioqKioq KioqDQoqKiogMzQ4MCwzNDg1ICoqKioNCi0tLSAzNTg4LDQwODUgLS0tLQ0K ICAgICAgcmV0dXJuIGwgKyAoY2MgLyBDT0xVTU5TKTsNCiAgfQ0KICANCisg LyogR3JlZyBKLiBCYWRyb3MncyBjb2xvciBtYXRjaGluZyBmZWF0dXJlIGFk YXB0ZWQgZnJvbSBjb2xvci1scyBwYXRjaCwgdG8gZmlsZXV0aWxzLTMuMTIN CisgICAgKGNvbG9yLWxzIGJ5IERlbm5pcyBGbGFoZXJ0eSA8ZGVubmlzZkBk ZW5peC5lbGsubWlsZXMuY29tPg0KKyAgICBhbmQgUGV0ZXIgQW52aW4gPFBl dGVyLkFudmluQGxpbnV4Lm9yZz4gYmFzZWQgb24gb3JpZ2luYWwgcGF0Y2hl cyBieSBHcmVnIExlZQ0KKyAgICA8bGVlQHVodW5peC51aGNjLmhhd2FpaS5l ZHU+KSAqLw0KKyANCisgLyogVGhlc2UgZGVmbidzIHdlcmUgc2VsZWN0aXZl bHkgbGlmdGVkIGZyb20gdGhlIGNvbG9yLWxzIHBhdGNoICovDQorICANCisg LyogTm9uemVybyBtZWFucyB1c2UgY29sb3JzIHRvIG1hcmsgdHlwZXMuICBB bHNvIGRlZmluZSB0aGUgZGlmZmVyZW50DQorICAgIGNvbG9ycyBhcyB3ZWxs IGFzIHRoZSBzdHVmZiBmb3IgdGhlIExTX0NPTE9SUyBlbnZpcm9ubWVudCB2 YXJpYWJsZS4NCisgICAgVGhlIExTX0NPTE9SUyB2YXJpYWJsZSBpcyBub3cg aW4gYSB0ZXJtY2FwLWxpa2UgZm9ybWF0LiAgLW8gKi8NCisgDQorIC8qIFNl bWFudGljcyBjaGFuZ2VkIGJ5IEdKQi0tIGlzc2V0KExJU1RDT0xPUlMpIHRl c3RzIHdoZXRoZXIgdXNlciB3YW50cw0KKyAgICBjb2xvciBsaXN0aW5nLCB0 aGlzIHNheXMgd2hldGhlciB0aGUgKFopTFNfQ09MTyhVKVJTIHZhcnMgd2Vy ZSBwYXJzZWQNCisgICAgc28gc2hlIGNhbiBoYXZlIGl0ICovDQorIGludCBw cmludF93aXRoX2NvbG9yOw0KKyANCisgLyogTm90ZSB0aGF0IGNvbG9yX25v IGFuZCBjb2xvcl95ZXMgZXF1YWxzIGJvb2xlYW4gdmFsdWVzOyB0aGV5IHdp bGwNCisgICAgYmUgYXNzaWduZWQgdG8gcHJpbnRfd2l0aF9jb2xvciB3aGlj aCBpcyBhIGJvb2xlYW4gdmFyaWFibGUgKi8NCisgDQorIGVudW0gaW5kaWNh dG9yX25vDQorIHsgQ19MRUZULCBDX1JJR0hULCBDX0VORCwgQ19OT1JNLCBD X0ZJTEUsIENfRElSLCBDX0xJTkssIENfRklGTywgQ19TT0NLLCANCisgICBD X0JMSywgQ19DSFIsIENfTUlTU0lORywgQ19PUlBIQU4sIENfRVhFQyB9Ow0K KyANCisgY2hhciAqaW5kaWNhdG9yX25hbWVbXT0NCisgew0KKyAgICJsYyIs InJjIiwiZWMiLCJubyIsImZpIiwiZGkiLCJsbiIsInBpIiwic28iLCJiZCIs ImNkIiwibWkiLCJvciIsImV4IiwwDQorIH07DQorIA0KKyAvKiBOdWxsIGlz IGEgdmFsaWQgY2hhcmFjdGVyIGluIGEgY29sb3IgaW5kaWNhdG9yICh0aGlu ayBhYm91dCBFcHNvbg0KKyAgICBwcmludGVycywgZm9yIGV4YW1wbGUpIHNv IHdlIGhhdmUgdG8gdXNlIGEgbGVuZ3RoL2J1ZmZlciBzdHJpbmcNCisgICAg dHlwZS4gKi8NCisgDQorIHN0cnVjdCBiaW5fc3RyDQorIHsNCisgICB1bnNp Z25lZCBpbnQgbGVuOwkJLyogTnVtYmVyIG9mIGJ5dGVzICovDQorICAgY2hh ciAqc3RyaW5nOwkJCS8qIFBvaW50ZXIgdG8gdGhlIHNhbWUgKi8NCisgfTsN CisgDQorIHN0cnVjdCBiaW5fc3RyIGNvbG9yX2luZGljYXRvcltdID0NCisg ew0KKyAgIHsgMiwgIlwwMzNbIiB9LAkJLyogbGM6IExlZnQgb2YgY29sb3Ig c2VxdWVuY2UgKi8NCisgICB7IDEsICJtIiB9LAkJCS8qIHJjOiBSaWdodCBv ZiBjb2xvciBzZXF1ZW5jZSAqLw0KKyAgIHsgMCwgTlVMTCB9LAkJCS8qIGVj OiBFbmQgY29sb3IgKHJlcGxhY2VzIGxjK25vK3JjKSAqLw0KKyAgIHsgMSwg IjAiIH0sCQkJLyogbm86IE5vcm1hbCAqLw0KKyAgIHsgMSwgIjAiIH0sCQkJ LyogZmk6IEZpbGU6IGRlZmF1bHQgKi8NCisgICB7IDIsICIzMiIgfSwJCQkv KiBkaTogRGlyZWN0b3J5OiBncmVlbiAqLw0KKyAgIHsgMiwgIjM2IiB9LAkJ CS8qIGxuOiBTeW1saW5rOiBjeWFuICovDQorICAgeyAyLCAiMzEiIH0sCQkJ LyogcGk6IFBpcGU6IHJlZCAqLw0KKyAgIHsgMiwgIjMzIiB9LAkJCS8qIHNv OiBTb2NrZXQ6IHllbGxvdy9icm93biAqLw0KKyAgIHsgNSwgIjQ0OzM3IiB9 LAkJLyogYmQ6IEJsb2NrIGRldmljZTogd2hpdGUgb24gYmx1ZSAqLw0KKyAg IHsgNSwgIjQ0OzM3IiB9LAkJLyogY2Q6IENoYXIgZGV2aWNlOiB3aGl0ZSBv biBibHVlICovDQorICAgeyAwLCBOVUxMIH0sCQkJLyogbWk6IE1pc3Npbmcg ZmlsZTogdW5kZWZpbmVkICovDQorICAgeyAwLCBOVUxMIH0sCQkJLyogb3I6 IE9ycGhhbm5lZCBzeW1saW5rOiB1bmRlZmluZWQgKi8NCisgICB7IDIsICIz NSIgfQkJCS8qIGV4OiBFeGVjdXRhYmxlOiBwdXJwbGUgKi8NCisgfTsNCisg DQorIHN0cnVjdCBjb2xfZXh0X3R5cGUNCisgew0KKyAgIHN0cnVjdCBiaW5f c3RyIGV4dDsJCS8qIFRoZSBleHRlbnNpb24gd2UncmUgbG9va2luZyBmb3Ig Ki8NCisgICBzdHJ1Y3QgYmluX3N0ciBzZXE7CQkvKiBUaGUgc2VxdWVuY2Ug dG8gb3V0cHV0IHdoZW4gd2UgZG8gKi8NCisgICBzdHJ1Y3QgY29sX2V4dF90 eXBlICpuZXh0OwkvKiBOZXh0IGluIGxpc3QgKi8NCisgfTsNCisgDQorIHN0 cnVjdCBjb2xfZXh0X3R5cGUgKmNvbF9leHRfbGlzdCA9IE5VTEw7DQorIGNo YXIgKmNvbG9yX2J1ZjsJCS8qIEJ1ZmZlciBmb3IgY29sb3Igc2VxdWVuY2Vz ICovDQorIA0KKyAvKiBwcm90b3R5cGVzIGZvciBjb2xvciBsaXN0LW1hdGNo aW5nIGZucywgYWRkZWQgYnkgR0pCICovDQorIHN0YXRpYyB2b2lkIHBhcnNl X2xzX2NvbG9yICgpOw0KKyBzdGF0aWMgaW50IGdldF9mdW5reV9zdHJpbmcg KGNoYXIgKipkZXN0LCBjaGFyICoqc3JjLCBpbnQgZXF1YWxzX2VuZCk7DQor IHN0YXRpYyB2b2lkIHByaW50X2NvbG9yX2luZGljYXRvciAoRklMRSAqc3Ry ZWFtLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbW9kZSwgaW50IGxpbmtv ayk7DQorIHN0YXRpYyB2b2lkIHB1dF9pbmRpY2F0b3IoRklMRSAqc3RyZWFt LCBzdHJ1Y3QgYmluX3N0ciAqaW5kKTsNCisgDQorIC8qIFBhcnNlIHRoZSAo WilMU19DT0xPUlMvKFopTFNfQ09MT1VSUyB2YXJpYWJsZSAqLw0KKyANCisg LyogRnVuY3Rpb24gcGFyc2VfbHNfY29sb3IgZnJvbSBjb2xvci1scyBwYXRj aCwgbm93IHVzZXMgZ2V0c3BhcmFtIGluc3RlYWQNCisgICAgb2YgZ2V0ZW52 LCBhbmQgY2hlY2tzIGZvciBaTFNfQ09MT1JTIGFuZCBaTFNfQ09MT1VSUyBi ZWZvcmUgdGhlIG5hbWVzIHcvbyBaICovDQorIA0KKyBzdGF0aWMgdm9pZA0K KyBwYXJzZV9sc19jb2xvciAoKQ0KKyB7DQorICAgY2hhciAqcDsJCQkvKiBQ b2ludGVyIHRvIGNoYXJhY3RlciBiZWluZyBwYXJzZWQgKi8NCisgICBjaGFy ICp3aGljaHZhcjsJCS8qIExTX0NPTE9SUyBvciBMU19DT0xPVVJTPyAqLw0K KyAgIGNoYXIgKmJ1ZjsJCQkvKiBjb2xvcl9idWYgYnVmZmVyIHBvaW50ZXIg Ki8NCisgICBpbnQgc3RhdGU7CQkJLyogU3RhdGUgb2YgcGFyc2VyICovDQor ICAgaW50IGluZF9ubzsJCQkvKiBJbmRpY2F0b3IgbnVtYmVyICovDQorICAg Y2hhciBsYWJlbFszXSA9ICI/PyI7CQkvKiBJbmRpY2F0b3IgbGFiZWwgKi8N CisgICBzdHJ1Y3QgY29sX2V4dF90eXBlICpleHQgPSAwOwkvKiBFeHRlbnNp b24gd2UgYXJlIHdvcmtpbmcgb24gKi8NCisgICBzdHJ1Y3QgY29sX2V4dF90 eXBlICpleHQyID0gMDsvKiBFeHRyYSBwb2ludGVyICovDQorIA0KKyAgIC8q IExldCBaTFNfQ09MTyhVKVJTIHRha2UgcHJlY2VkZW5jZSBvZiBMU19DT0xP KFUpUlMgaW4gY2FzZQ0KKyAgICAgIHRoZSB1c2VyIHdhbnRzIGRpZmZlcmVu dCBjb2xvcnMgZm9yIHpzaCBjb21wbGV0aW9uIGxpc3RpbmcgYW5kIGNvbG9y LWxzICovDQorICAgaWYgKCAocCA9IGdldHNwYXJhbSh3aGljaHZhciA9ICJa TFNfQ09MT1JTIikpIHx8DQorICAgICAgICAocCA9IGdldHNwYXJhbSh3aGlj aHZhciA9ICJaTFNfQ09MT1VSUyIpKSB8fA0KKyAgICAgICAgKHAgPSBnZXRz cGFyYW0od2hpY2h2YXIgPSAiTFNfQ09MT1JTIikpIHx8DQorICAgICAgICAo cCA9IGdldHNwYXJhbSh3aGljaHZhciA9ICJMU19DT0xPVVJTIikpICkgew0K KyAgICAgICAvKiBwcmludF93aXRoX2NvbG9yJ3Mgc2VtYW50aWNzIGhhdmUg Y2hhbmdlZCBmcm9tIGNvbG9yX2xzIC0tDQorIAkgaXNzZXQoTElTVENPTE9S UykgaXMgdXNlZCB0byB0ZWxsIGlmIHRoZSB1c2VyICp3YW50cyogY29sb3Is DQorIAkgd2hpbGUgcHJpbnRfd2l0aF9jb2xvciBpcyBzZXQgdHJ1ZSBpZiB3 ZSBwYXJzZWQgYSBjb2xvciB2YXJpYWJsZSBvaw0KKyAJIHNvIHNoZSBtYXkg c2VlIHRoZSBjb2xvciAqLw0KKyAgICAgICBwcmludF93aXRoX2NvbG9yID0g MTsNCisgICAgICAgYnVmID0gY29sb3JfYnVmID0gKGNoYXIgKikgemFsbG9j KHN0cmxlbihwKSk7DQorICAgICAgIC8qIFRoaXMgaXMgYW4gb3Zlcmx5IGNv bnNlcnZhdGl2ZSBlc3RpbWF0ZSwgYnV0IGFueSBwb3NzaWJsZQ0KKyAgICAg ICAgICBMU19DT0xPUlMgc3RyaW5nIHdpbGwgKm5vdCogZ2VuZXJhdGUgYSBj b2xvcl9idWYgbG9uZ2VyIHRoYW4NCisgCSBpdHNlbGYsIHNvIGl0IGlzIGEg c2FmZSB3YXkgb2YgYWxsb2NhdGluZyBhIGJ1ZmZlciBpbg0KKyAJIGFkdmFu Y2UuICovDQorICAgICAgIA0KKyAgICAgICBzdGF0ZSA9IDE7DQorICAgICAg IHdoaWxlICggc3RhdGUgPiAwICkgDQorIAl7DQorIAkgIHN3aXRjaChzdGF0 ZSkNCisgCSAgICB7DQorIAkgICAgY2FzZSAxOgkJLyogRmlyc3QgbGFiZWwg Y2hhcmFjdGVyICovDQorIAkgICAgICBzd2l0Y2ggKCAqcCApDQorIAkJew0K KyAJCWNhc2UgJzonOg0KKyAJCSAgcCsrOw0KKyAJCSAgYnJlYWs7DQorIAkJ ICANCisgCQljYXNlICcqJzoNCisgCQkgIC8qIEFsbG9jYXRlIG5ldyBleHRl bnNpb24gYmxvY2sgYW5kIGFkZCB0byBoZWFkDQorIAkJICAgICBvZiBsaW5r ZWQgbGlzdCAodGhpcyB3YXkgYSBsYXRlciBkZWZpbml0aW9uIHdpbGwNCisg CQkgICAgIG92ZXJyaWRlIGFuIGVhcmxpZXIgb25lLCB3aGljaCBjYW4gYmUg dXNlZnVsIGZvcg0KKyAJCSAgICAgaGF2aW5nIHRlcm1pbmFsLXNwZWNpZmlj IGRlZnMgb3ZlcnJpZGUgZ2xvYmFsKSAqLw0KKyAJCSAgDQorIAkJICBleHQg PSAoc3RydWN0IGNvbF9leHRfdHlwZSAqKQ0KKyAJCSAgICB6YWxsb2Moc2l6 ZW9mKHN0cnVjdCBjb2xfZXh0X3R5cGUpKTsNCisgCQkgIGV4dC0+bmV4dCA9 IGNvbF9leHRfbGlzdDsNCisgCQkgIGNvbF9leHRfbGlzdCA9IGV4dDsNCisg DQorIAkJICBwKys7DQorIAkJICBleHQtPmV4dC5zdHJpbmcgPSBidWY7DQor IAkJICANCisgCQkgIHN0YXRlID0gKGV4dC0+ZXh0LmxlbiA9DQorIAkJCSAg IGdldF9mdW5reV9zdHJpbmcoJmJ1ZiwmcCwxKSkgPCAwID8gLTEgOiA0Ow0K KyAJCSAgYnJlYWs7DQorIAkJICANCisgCQljYXNlICdcMCc6DQorIAkJICBz dGF0ZSA9IDA7CS8qIERvbmUhICovDQorIAkJICBicmVhazsNCisgCQkgIA0K KyAJCWRlZmF1bHQ6CS8qIEFzc3VtZSBpdCBpcyBmaWxlIHR5cGUgbGFiZWwg Ki8NCisgCQkgIGxhYmVsWzBdID0gKihwKyspOw0KKyAJCSAgc3RhdGUgPSAy Ow0KKyAJCSAgYnJlYWs7DQorIAkJfQ0KKyAJICAgICAgYnJlYWs7DQorIAkg ICAgICANCisgCSAgICBjYXNlIDI6CQkvKiBTZWNvbmQgbGFiZWwgY2hhcmFj dGVyICovDQorIAkgICAgICBpZiAoICpwICkNCisgCQl7DQorIAkJICBsYWJl bFsxXSA9ICoocCsrKTsNCisgCQkgIHN0YXRlID0gMzsNCisgCQl9DQorIAkg ICAgICBlbHNlDQorIAkJc3RhdGUgPSAtMTsJLyogRXJyb3IgKi8NCisgCSAg ICAgIGJyZWFrOw0KKyANCisgCSAgICBjYXNlIDM6CQkvKiBFcXVhbCBzaWdu IGFmdGVyIGluZGljYXRvciBsYWJlbCAqLw0KKyAJICAgICAgc3RhdGUgPSAt MTsJLyogQXNzdW1lIGZhaWx1cmUuLi4gKi8NCisgCSAgICAgIGlmICggKihw KyspID09ICc9JyApCS8qIEl0ICpzaG91bGQqIGJlLi4uICovDQorIAkJew0K KyAJCSAgZm9yICggaW5kX25vID0gMCA7IGluZGljYXRvcl9uYW1lW2luZF9u b10gIT0gTlVMTCA7DQorIAkJICAgICAgIGluZF9ubysrICkNCisgCQkgICAg ew0KKyAJCSAgICAgIGlmICggc3RyY21wKGxhYmVsLGluZGljYXRvcl9uYW1l W2luZF9ub10pID09IDAgKQ0KKyAJCQl7DQorIAkJCSAgY29sb3JfaW5kaWNh dG9yW2luZF9ub10uc3RyaW5nID0gYnVmOw0KKyAJCQkgIHN0YXRlID0gKGNv bG9yX2luZGljYXRvcltpbmRfbm9dLmxlbiA9DQorIAkJCQkgICBnZXRfZnVu a3lfc3RyaW5nKCZidWYsJnAsMCkpIDwgMCA/DQorIAkJCQkgICAgIC0xIDog MTsNCisgCQkJICBicmVhazsNCisgCQkJfQ0KKyAJCSAgICB9DQorIAkJICBp ZiAoIHN0YXRlID09IC0xICkNCisgCQkgICAgZnByaW50ZihzdGRlcnIsICJV bmtub3duIHByZWZpeDogJXNcbiIsIGxhYmVsKTsNCisgCQl9DQorIAkgICAg ICBicmVhazsNCisgDQorIAkgICAgY2FzZSA0OgkJLyogRXF1YWwgc2lnbiBh ZnRlciAqLmV4dCAqLw0KKyAJICAgICAgaWYgKCAqKHArKykgPT0gJz0nICkN CisgCQl7DQorIAkJICBleHQtPnNlcS5zdHJpbmcgPSBidWY7DQorIAkJICBz dGF0ZSA9IChleHQtPnNlcS5sZW4gPQ0KKyAJCQkgICBnZXRfZnVua3lfc3Ry aW5nKCZidWYsJnAsMCkpIDwgMCA/DQorIAkJCSAgICAgLTEgOiAxOw0KKyAJ CX0NCisgCSAgICAgIGVsc2UNCisgCQlzdGF0ZSA9IC0xOw0KKyAJICAgICAg YnJlYWs7DQorIAkgICAgfQ0KKyAJfQ0KKyANCisgICAgICAgaWYgKCBzdGF0 ZSA8IDAgKQ0KKyAJew0KKyAJICBmcHJpbnRmKHN0ZGVyciwgIkJhZCAlcyB2 YXJpYWJsZVxuIiwgd2hpY2h2YXIpOw0KKyAJICBmcmVlKGNvbG9yX2J1Zik7 DQorIAkgIGZvciAoIGV4dCA9IGNvbF9leHRfbGlzdCA7IGV4dCAhPSBOVUxM IDsgKQ0KKyAJICAgIHsNCisgCSAgICAgIGV4dDIgPSBleHQ7DQorIAkgICAg ICBleHQgPSBleHQtPm5leHQ7DQorIAkgICAgICBmcmVlIChleHQyKTsNCisg CSAgICB9DQorIAkgIHByaW50X3dpdGhfY29sb3IgPSAwOw0KKyAJfQ0KKyAg ICAgfQ0KKyB9DQorIA0KKyAvKiBGdW5jdGlvbiBnZXRfZnVua3lfc3RyaW5n IGRpcmVjdGx5IGZyb20gY29sb3ItbHMgcGF0Y2gsDQorICBjb2Rpbmcgc3R5 bGUgY2hhbmdlZCB0byBtYXRjaCB6c2gncyAqLw0KKyANCisgLyogUGFyc2Ug YSBzdHJpbmcgYXMgcGFydCBvZiB0aGUgTFNfQ09MTyhVKVJTIHZhcmlhYmxl OyB0aGlzIG1heSBpbnZvbHZlDQorICAgIGRlY29kaW5nIGFsbCBraW5kcyBv ZiBlc2NhcGUgY2hhcmFjdGVycy4gIElmIGVxdWFsc19lbmQgaXMgc2V0IGFu DQorICAgIHVuZXNjYXBlZCBlcXVhbCBzaWduIGVuZHMgdGhlIHN0cmluZywg b3RoZXJ3aXNlIG9ubHkgYSA6IG9yIFwwDQorICAgIGRvZXMuICBSZXR1cm5z IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvdXRwdXQsIG9yIC0xIG9uIGZh aWx1cmUuDQorIA0KKyAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyAqbm90 KiBudWxsLXRlcm1pbmF0ZWQsIGJ1dCBtYXkgY29udGFpbg0KKyAgICBlbWJl ZGRlZCBudWxscy4NCisgDQorICAgIE5vdGUgdGhhdCBib3RoIGRlc3QgYW5k IHNyYyBhcmUgY2hhciAqKjsgb24gcmV0dXJuIHRoZXkgcG9pbnQgdG8NCisg ICAgdGhlIGZpcnN0IGZyZWUgYnl0ZSBhZnRlciB0aGUgYXJyYXkgYW5kIHRo ZSBjaGFyYWN0ZXIgdGhhdCBlbmRlZA0KKyAgICB0aGUgaW5wdXQgc3RyaW5n LCByZXNwZWN0aXZlbHkuICovDQorIA0KKyBzdGF0aWMgaW50DQorIGdldF9m dW5reV9zdHJpbmcgKGNoYXIgKipkZXN0LCBjaGFyICoqc3JjLCBpbnQgZXF1 YWxzX2VuZCkNCisgew0KKyAgICAgaW50IG51bSA9IDA7CQkvKiBGb3IgbnVt ZXJpY2FsIGNvZGVzICovDQorICAgICBpbnQgY291bnQ7CQkJLyogU29tZXRo aW5nIHRvIGNvdW50IHdpdGggKi8NCisgICAgIGVudW0geyBzdF9nbmQsIHN0 X2JhY2tzbGFzaCwgc3Rfb2N0YWwsIHN0X2hleCwgc3RfY2FyZXQsDQorIAkg ICBzdF9lbmQsIHN0X2Vycm9yIH0gDQorICAgICBzdGF0ZTsNCisgICAgIGNo YXIgKnAsICpxOw0KKyANCisgICAgIHAgPSAqc3JjOyAgcSA9ICpkZXN0OwkJ LyogV2UgZG9uJ3Qgd2FudCB0byBkb3VibGUtaW5kaXJlY3QNCisgCQkJCQkg ICB0aGUgd2hvbGUgZGFybiB0aW1lICovDQorICAgICANCisgICAgIGNvdW50 ID0gMDsJCQkvKiBObyBjaGFyYWN0ZXJzIGNvdW50ZWQgaW4geWV0ICovDQor IA0KKyAgICAgc3RhdGUgPSBzdF9nbmQ7CQkvKiBTdGFydCBpbiBncm91bmQg c3RhdGUgKi8NCisgICAgIHdoaWxlICggc3RhdGUgPCBzdF9lbmQgKSB7DQor IAlzd2l0Y2ggKCBzdGF0ZSApIHsNCisgCWNhc2Ugc3RfZ25kOgkJLyogR3Jv dW5kIHN0YXRlIChubyBlc2NhcGVzKSAqLw0KKyAJICAgIHN3aXRjaCAoICpw ICkNCisgCQl7DQorIAkJY2FzZSAnOic6DQorIAkJY2FzZSAnXDAnOg0KKyAJ CSAgICBzdGF0ZSA9IHN0X2VuZDsJLyogRW5kIG9mIHN0cmluZyAqLw0KKyAJ CSAgICBicmVhazsNCisgCQljYXNlICdcXCc6DQorIAkJICAgIHN0YXRlID0g c3RfYmFja3NsYXNoOyAvKiBCYWNrc2xhc2ggc2NhcGUgc2VxdWVuY2UgKi8N CisgCQkgICAgcCsrOw0KKyAJCSAgICBicmVhazsNCisgCQljYXNlICdeJzoN CisgCQkgICAgc3RhdGUgPSBzdF9jYXJldDsJLyogQ2FyZXQgZXNjYXBlICov DQorIAkJICAgIHArKzsNCisgCQkgICAgYnJlYWs7DQorIAkJY2FzZSAnPSc6 DQorIAkJICAgIGlmICggZXF1YWxzX2VuZCApDQorIAkJCXsNCisgCQkJICAg IHN0YXRlID0gc3RfZW5kOyAvKiBFbmQgKi8NCisgCQkJICAgIGJyZWFrOw0K KyAJCQl9DQorIAkJICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovDQorIAkJ ZGVmYXVsdDoNCisgCQkgICAgKihxKyspID0gKihwKyspOw0KKyAJCSAgICBj b3VudCsrOw0KKyAJCSAgICBicmVhazsNCisgCQl9DQorIAkgICAgYnJlYWs7 DQorIA0KKyAJY2FzZSBzdF9iYWNrc2xhc2g6CS8qIEJhY2tzbGFzaCBlc2Nh cGVkIGNoYXJhY3RlciAqLw0KKyAJICAgIHN3aXRjaCAoICpwICkgew0KKyAJ ICAgIGNhc2UgJzAnOg0KKyAJICAgIGNhc2UgJzEnOg0KKyAJICAgIGNhc2Ug JzInOg0KKyAJICAgIGNhc2UgJzMnOg0KKyAJICAgIGNhc2UgJzQnOg0KKyAJ ICAgIGNhc2UgJzUnOg0KKyAJICAgIGNhc2UgJzYnOg0KKyAJICAgIGNhc2Ug JzcnOg0KKyAJCXN0YXRlID0gc3Rfb2N0YWw7CS8qIE9jdGFsIHNlcXVlbmNl ICovDQorIAkJbnVtID0gKnAgLSAnMCc7DQorIAkJYnJlYWs7DQorIAkgICAg Y2FzZSAneCc6DQorIAkgICAgY2FzZSAnWCc6DQorIAkJc3RhdGUgPSBzdF9o ZXg7CS8qIEhleCBzZXF1ZW5jZSAqLw0KKyAJCW51bSA9IDA7DQorIAkJYnJl YWs7DQorIAkgICAgY2FzZSAnYSc6CQkvKiBCZWxsICovDQorIAkJbnVtID0g NzsJCS8qIE5vdCBhbGwgQyBjb21waWxlcnMga25vdyB3aGF0IFxhIG1lYW5z ICovDQorIAkJYnJlYWs7DQorIAkgICAgY2FzZSAnYic6CQkvKiBCYWNrc3Bh Y2UgKi8NCisgCQludW0gPSAnXGInOw0KKyAJCWJyZWFrOw0KKyAJICAgIGNh c2UgJ2UnOgkJLyogRXNjYXBlICovDQorIAkJbnVtID0gMjc7DQorIAkJYnJl YWs7DQorIAkgICAgY2FzZSAnZic6CQkvKiBGb3JtIGZlZWQgKi8NCisgCQlu dW0gPSAnXGYnOw0KKyAJCWJyZWFrOw0KKyAJICAgIGNhc2UgJ24nOgkJLyog TmV3bGluZSAqLw0KKyAJCW51bSA9ICdcbic7DQorIAkJYnJlYWs7DQorIAkg ICAgY2FzZSAncic6CQkvKiBDYXJyaWFnZSByZXR1cm4gKi8NCisgCQludW0g PSAnXHInOw0KKyAJCWJyZWFrOw0KKyAJICAgIGNhc2UgJ3QnOgkJLyogVGFi ICovDQorIAkJbnVtID0gJ1x0JzsNCisgCQlicmVhazsNCisgCSAgICBjYXNl ICd2JzoJCS8qIFZ0YWIgKi8NCisgCQludW0gPSAnXHYnOw0KKyAJCWJyZWFr Ow0KKyAJICAgIGNhc2UgJz8nOgkJLyogRGVsZXRlICovDQorIAkJbnVtID0g MTI3Ow0KKyAJCWJyZWFrOw0KKyAJICAgIGNhc2UgJ18nOgkJLyogU3BhY2Ug Ki8NCisgCQludW0gPSAnICc7DQorIAkJYnJlYWs7DQorIAkgICAgY2FzZSAn XDAnOgkJLyogRW5kIG9mIHN0cmluZyAqLw0KKyAJCXN0YXRlID0gc3RfZXJy b3I7CS8qIEVycm9yISAqLw0KKyAJCWJyZWFrOw0KKyAJICAgIGRlZmF1bHQ6 CQkvKiBFc2NhcGVkIGNoYXJhY3RlciBsaWtlIFwgXiA6ID0gKi8NCisgCQlu dW0gPSAqcDsNCisgCQlicmVhazsNCisgCSAgICB9DQorIAkgICAgaWYgKCBz dGF0ZSA9PSBzdF9iYWNrc2xhc2ggKSB7DQorIAkJKihxKyspID0gbnVtOw0K KyAJCWNvdW50Kys7DQorIAkJc3RhdGUgPSBzdF9nbmQ7DQorIAkgICAgfQ0K KyAJICAgIHArKzsNCisgCSAgICBicmVhazsNCisgDQorIAljYXNlIHN0X29j dGFsOgkJLyogT2N0YWwgc2VxdWVuY2UgKi8NCisgCSAgICBpZiAoICpwIDwg JzAnIHx8ICpwID4gJzcnICkgew0KKyAJCSoocSsrKSA9IG51bTsNCisgCQlj b3VudCsrOw0KKyAJCXN0YXRlID0gc3RfZ25kOw0KKyAJICAgIH0NCisgCSAg ICBlbHNlDQorIAkJbnVtID0gKCBudW0gPDwgMyApICsgKCAqKHArKykgLSAn MCcgKTsNCisgCSAgICBicmVhazsNCisgDQorIAljYXNlIHN0X2hleDoJCS8q IEhleCBzZXF1ZW5jZSAqLw0KKyAJICAgIHN3aXRjaCAoICpwICkgew0KKyAJ ICAgIGNhc2UgJzAnOg0KKyAJICAgIGNhc2UgJzEnOg0KKyAJICAgIGNhc2Ug JzInOg0KKyAJICAgIGNhc2UgJzMnOg0KKyAJICAgIGNhc2UgJzQnOg0KKyAJ ICAgIGNhc2UgJzUnOg0KKyAJICAgIGNhc2UgJzYnOg0KKyAJICAgIGNhc2Ug JzcnOg0KKyAJICAgIGNhc2UgJzgnOg0KKyAJICAgIGNhc2UgJzknOg0KKyAJ CW51bSA9ICggbnVtIDw8IDQgKSArICggKihwKyspIC0gJzAnICk7DQorIAkJ YnJlYWs7DQorIAkgICAgY2FzZSAnYSc6DQorIAkgICAgY2FzZSAnYic6DQor IAkgICAgY2FzZSAnYyc6DQorIAkgICAgY2FzZSAnZCc6DQorIAkgICAgY2Fz ZSAnZSc6DQorIAkgICAgY2FzZSAnZic6DQorIAkJbnVtID0gKCBudW0gPDwg NCApICsgKCAqKHArKykgLSAnYScgKSArIDEwOw0KKyAJCWJyZWFrOw0KKyAJ ICAgIGNhc2UgJ0EnOg0KKyAJICAgIGNhc2UgJ0InOg0KKyAJICAgIGNhc2Ug J0MnOg0KKyAJICAgIGNhc2UgJ0QnOg0KKyAJICAgIGNhc2UgJ0UnOg0KKyAJ ICAgIGNhc2UgJ0YnOg0KKyAJCW51bSA9ICggbnVtIDw8IDQgKSArICggKihw KyspIC0gJ0EnICkgKyAxMDsNCisgCQlicmVhazsNCisgCSAgICBkZWZhdWx0 Og0KKyAJCSoocSsrKSA9IG51bTsNCisgCQljb3VudCsrOw0KKyAJCXN0YXRl ID0gc3RfZ25kOw0KKyAJCWJyZWFrOw0KKyAJICAgIH0NCisgCSAgICBicmVh azsNCisgDQorIAljYXNlIHN0X2NhcmV0OgkJLyogQ2FyZXQgZXNjYXBlICov DQorIAkgICAgc3RhdGUgPSBzdF9nbmQ7CS8qIFNob3VsZCBiZSB0aGUgbmV4 dCBzdGF0ZS4uLiAqLw0KKyAJICAgIGlmICggKnAgPj0gJ0AnICYmICpwIDw9 ICd+JyApIHsNCisgCQkqKHErKykgPSAqKHArKykgJiAwMzc7DQorIAkJY291 bnQrKzsNCisgCSAgICB9DQorIAkgICAgZWxzZSBpZiAoICpwID09ICc/JyAp IHsNCisgCQkqKHErKykgPSAxMjc7DQorIAkJY291bnQrKzsNCisgCSAgICB9 DQorIAkgICAgZWxzZQ0KKyAJCXN0YXRlID0gc3RfZXJyb3I7DQorIAkgICAg YnJlYWs7DQorIAlkZWZhdWx0Og0KKyAJICAgIGJyZWFrOw0KKyAJfQ0KKyAg ICAgfQ0KKyANCisgICAgICpkZXN0ID0gcTsgICpzcmMgPSBwOw0KKyANCisg ICAgIHJldHVybiAoIHN0YXRlID09IHN0X2Vycm9yICkgPyAtMSA6IGNvdW50 Ow0KKyB9DQorIA0KKyAvKiBHSkIgbW9kaWZpZWQgdGhpcyBmbiBmcm9tIGNv bG9yLWxzIHBhdGNoIHRvIHVzZSB6c2gncyBmaWxlX3R5cGUgZm4NCisgICAg aW5zdGVhZCBvZiB0aGUgbWFjcm9zIHRoYXQgY29sb3ItbHMgdXNlZC4gIEFs c28gYSBsZWFkaW5nIHN0cmVhbSBhcmd1bWVudA0KKyAgICBpcyBuZWVkZWQg c2luY2UgenNoIHVzZXMgc2hvdXQgZm9yIGl0cyBvdXRwdXQgc3RyZWFtICov DQorIA0KKyBzdGF0aWMgdm9pZA0KKyBwcmludF9jb2xvcl9pbmRpY2F0b3Ig KEZJTEUgKnN0cmVhbSwgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG1vZGUs IGludCBsaW5rb2spDQorIHsNCisgICAgIGludCB0eXBlID0gQ19GSUxFOw0K KyAgICAgc3RydWN0IGNvbF9leHRfdHlwZSAqZXh0OwkvKiBDb2xvciBleHRl bnNpb24gKi8NCisgICAgIGludCBsZW47CQkJLyogTGVuZ3RoIG9mIG5hbWUg Ki8NCisgICAgIA0KKyAgICAgLyogSXMgdGhpcyBhIG5vbmV4aXN0ZW50IGZp bGU/ICBJZiBzbywgbGlua29rID09IC0xICovDQorIA0KKyAgICAgaWYgKCBs aW5rb2sgPT0gLTEgJiYgY29sb3JfaW5kaWNhdG9yW0NfTUlTU0lOR10uc3Ry aW5nICkgew0KKyAJZXh0ID0gTlVMTDsNCisgCXR5cGUgPSBDX01JU1NJTkc7 DQorICAgICB9DQorICAgICBlbHNlIHsNCisgCS8qIFRlc3QgaWYgaXMgaXMg YSByZWNvZ25pemVkIGV4dGVuc2lvbiAqLw0KKyAJbGVuID0gc3RybGVuKG5h bWUpOw0KKyAJbmFtZSArPSBsZW47CQkJLyogUG9pbnRlciB0byBmaW5hbCBc MCAqLw0KKyAJZm9yICggZXh0ID0gY29sX2V4dF9saXN0IDsgZXh0ICE9IE5V TEwgOyBleHQgPSBleHQtPm5leHQgKSB7DQorIAkgICAgaWYgKCBleHQtPmV4 dC5sZW4gPD0gbGVuICYmDQorIAkJIHN0cm5jbXAobmFtZS1leHQtPmV4dC5s ZW4sZXh0LT5leHQuc3RyaW5nLGV4dC0+ZXh0LmxlbikgID09IDAgKQ0KKyAJ CWJyZWFrOw0KKyAJfQ0KKyAgICAgICANCisgCS8qIGdqYiB1c2VzIGdsb2Iu YydzIGZpbGVfdHlwZSB0byByZXBsYWNlIHNpbWlsYXIgaGFuZGxpbmcgaW4g Y29sb3JfbHMgKi8NCisgCWlmICggIWV4dCApIHsNCisgCSAgICBjaGFyIGNo RmlsZVR5cGUgPSBmaWxlX3R5cGUobW9kZSk7DQorIAkgICAgDQorIAkgICAg aWYgKGNoRmlsZVR5cGUgPT0gJy8nKQ0KKyAJCXR5cGUgPSBDX0RJUjsNCisg CSAgICBlbHNlIGlmIChjaEZpbGVUeXBlID09ICdAJykNCisgCQl0eXBlID0g KCFsaW5rb2sgJiYgY29sb3JfaW5kaWNhdG9yW0NfT1JQSEFOXS5zdHJpbmcp ID8NCisgCQkgICAgQ19PUlBIQU4gOiBDX0xJTks7DQorIAkgICAgZWxzZSBp ZiAoY2hGaWxlVHlwZSA9PSAnfCcpDQorIAkJdHlwZSA9IENfRklGTzsNCisg CSAgICBlbHNlIGlmIChjaEZpbGVUeXBlID09ICc9JykNCisgCQl0eXBlID0g Q19TT0NLOw0KKyAJICAgIGVsc2UgaWYgKGNoRmlsZVR5cGUgPT0gJyMnKQ0K KyAJCXR5cGUgPSBDX0JMSzsNCisgCSAgICBlbHNlIGlmIChjaEZpbGVUeXBl ID09ICclJykNCisgCQl0eXBlID0gQ19DSFI7DQorIAkgICAgZWxzZSBpZiAo IGNoRmlsZVR5cGUgPT0gJyonICkNCisgCQl0eXBlID0gQ19FWEVDOw0KKyAJ fQ0KKyAgICAgfQ0KKyANCisgICBwdXRfaW5kaWNhdG9yKHN0cmVhbSwmY29s b3JfaW5kaWNhdG9yW0NfTEVGVF0pOw0KKyAgIHB1dF9pbmRpY2F0b3Ioc3Ry ZWFtLGV4dCA/ICYoZXh0LT5zZXEpIDogJmNvbG9yX2luZGljYXRvclt0eXBl XSk7DQorICAgcHV0X2luZGljYXRvcihzdHJlYW0sJmNvbG9yX2luZGljYXRv cltDX1JJR0hUXSk7DQorIH0NCisgDQorIA0KKyAvKiBHSkI6IGFkZGVkIGEg bGVhZGluZyBzdHJlYW0gYXJndW1lbnQsIHNpbmNlIHpzaCBuZWVkcyB0byBv dXRwdXQgdG8gc2hvdXQgDQorICAgIGZuIHB1dF9pbmRpY2F0b3IgaXMgb3Ro ZXJ3aXNlIGZyb20gY29sb3JfbHMgcGF0Y2ggKi8NCisgDQorIC8qIE91dHB1 dCBhIGNvbG9yIGluZGljYXRvciAod2hpY2ggbWF5IGNvbnRhaW4gbnVsbHMp ICovDQorIHN0YXRpYyB2b2lkDQorIHB1dF9pbmRpY2F0b3IoRklMRSAqc3Ry ZWFtLCBzdHJ1Y3QgYmluX3N0ciAqaW5kKQ0KKyB7DQorICAgcmVnaXN0ZXIg aW50IGk7DQorICAgcmVnaXN0ZXIgY2hhciAqcDsNCisgDQorICAgcCA9IGlu ZC0+c3RyaW5nOw0KKyANCisgICBmb3IgKCBpID0gaW5kLT5sZW4gOyBpIDsg aS0tICkNCisgICAgIGlmIChmcHV0YygqKHArKyksc3RyZWFtKSA8IDApDQor ICAgICAgICBicmVhazsNCisgfQ0KKyANCisgDQorIC8qIEZJWDogbmVlZCB0 byB3cml0ZSBmU3ltTGlua09rLCBvciByZXBsYWNlIHRoZSBjYWxsIGZ1cnRo ZXIgZG93biBpZiB0aGlzDQorICAgIGZ1bmN0aW9uYWxpdHkgZXhpc3RzIGVs c2V3aGVyZSAqLw0KKyAvKiBSZXR1cm4gdHJ1ZSAobm9uLXplcm8pIGlmZiBz elBhdGhuYW1lJ3Mgc3ltbGluayBleGlzdHMNCisgIChpLmUuIGl0IGlzIG5v dCBhbiBvcnBoYW5lZCBzeW1saW5rICovDQorIA0KKyAvKiovDQorIGludA0K KyBmU3ltTGlua09rKGNoYXIgKnN6UGF0aG5hbWUpDQorIHsNCisgICAgIC8q IEN1cnJlbnRseSwgdGhpcyBiZWhhdmlvdXIgbGV0cyBzeW1saW5rJ3MgY29s b3JzIGJlIGRlY2lkZWQNCisgICAgICAgIGJ5IHRoZSBmaWxlIHRoYXQgdGhl eSBwb2ludCB0by0tIHRoaXMgaXMgbmljZSB3L0xJU1RUWVBFUywgc2luY2Ug YSBzeW1saW5rDQorICAgICAgICB0byBhIGRpcmVjdG9yeSBtaWdodCBsb29r IGxpa2UgInN5bXRvZGlyQCIgaW4gYmx1ZSwgYSByZWd1bGFyDQorICAgICAg ICBkaXJlY3RvcnkgbWlnaHQgbG9vayBsaWtlICJyZWdkaXIvIiBpbiBibHVl ICovDQorICAgICByZXR1cm4gIShhY2Nlc3Moc3pQYXRobmFtZSwgRl9PSykg PT0gLTEpOw0KKyB9DQorIA0KICAvKiBMaXN0IHRoZSBtYXRjaGVzLiAgTm90 ZSB0aGF0IHRoZSBsaXN0IGVudHJpZXMgYXJlIG1ldGFmaWVkLiAqLw0KICAN CiAgLyoqLw0KKioqKioqKioqKioqKioqDQoqKiogMzQ5MywzNDk4ICoqKioN Ci0tLSA0MDkzLDQxMDQgLS0tLQ0KICAgICAgaW50IG5mcGwsIG5mc2wsIG5s cGwsIG5sc2w7DQogICAgICBpbnQgbGlzdG1heCA9IGdldGlwYXJhbSgiTElT VE1BWCIpOw0KICANCisgICAgIGlmIChpc3NldChMSVNUQ09MT1JTKSkgew0K KyAJLyogRklYOiBTaG91bGQgdHJhY2sgd2hlbiAoWilMU19DT0xPKFUpUlMg dmFyaWFibGUgY2hhbmdlcyBhbmQgb25seQ0KKyAJICAgcGFyc2UgdGhlIHZh cmlhYmxlIHRoZW4sIG9yIHdoZW4gTElTVENPTE9SUyBvcHRpb24gZ2V0cyBz ZXQgKi8NCisgCXBhcnNlX2xzX2NvbG9yKCk7DQorICAgICB9DQorIA0KICAj aWZkZWYgREVCVUcNCiAgICAgIC8qIFNhbml0eSBjaGVjayAqLw0KICAgICAg aWYoIXZhbGlkbGlzdCkgew0KKioqKioqKioqKioqKioqDQoqKiogMzYwOCwz NjE1ICoqKioNCiAgCQlpbnQgdDI7DQogIAkJY2hhciAqcGI7DQogIAkJc3Ry dWN0IHN0YXQgYnVmOw0KICANCiEgCQkvKiBCdWlsZCB0aGUgcGF0aCBuYW1l IGZvciB0aGUgc3RhdC4gKi8NCiAgCQlpZiAoaXNwYXR0ZXJuKSB7DQogIAkJ ICAgIGludCBjdXQgPSBzdHJsZW4oKmFwKSAtIGJvZmY7DQogIA0KLS0tIDQy MTQsNDIyNCAtLS0tDQogIAkJaW50IHQyOw0KICAJCWNoYXIgKnBiOw0KICAJ CXN0cnVjdCBzdGF0IGJ1ZjsNCisgCQlpbnQgenRhdF9yZXR1cm47DQogIA0K ISAJCS8qIEJ1aWxkIHRoZSBwYXRoIG5hbWUgZm9yIHRoZSBzdGF0LiAgR0pC OiBQcmludCBpdCBmdXJ0aGVyIGRvd24NCiEgCQkgc2luY2Ugd2UgbmVlZCB0 byB6dGF0IChzdGF0KSB0aGUgZmlsZSBiZWZvcmUgY2FsbGluZyBwcmludF9j b2xvcl9pbmRpY2F0b3INCiEgCQkgYW5kIHRoYXQgbmVlZHMgdG8gYmUgb3V0 cHV0IGJlZm9yZSB0aGUgZmlsZSBuYW1lICovDQogIAkJaWYgKGlzcGF0dGVy bikgew0KICAJCSAgICBpbnQgY3V0ID0gc3RybGVuKCphcCkgLSBib2ZmOw0K ICANCioqKioqKioqKioqKioqKg0KKioqIDM2MjAsMzYzOSAqKioqDQogIAkJ ICAgIGFwWzBdW2N1dF0gPSBzYXY7DQogIAkJICAgIHBiID0gKmFwOw0KICAJ CX0gZWxzZSB7DQotIAkJICAgIG5pY2V6cHV0cyhmcHJlLCBzaG91dCk7DQot IAkJICAgIG5pY2V6cHV0cygqYXAsIHNob3V0KTsNCi0gCQkgICAgbmljZXpw dXRzKGZzdWYsIHNob3V0KTsNCiAgCQkgICAgdDIgPSBuZnBsICsgbmljZXp0 cmxlbigqYXApICsgbmZzbDsNCiAgCQkgICAgcGIgPSAoY2hhciAqKSBuY2Fs bG9jKChwcnByZSA/IHN0cmxlbihwcnByZSkgOiAwKSArIDMgKw0KICAJCQkJ CSAgc3RybGVuKGZwcmUpICsgc3RybGVuKCphcCkgKyBzdHJsZW4oZnN1Zikp Ow0KICAJCSAgICBzcHJpbnRmKHBiLCAiJXMlcyVzJXMiLA0KICAJCQkgICAg KHBycHJlICYmICpwcnByZSkgPyBwcnByZSA6ICIuLyIsIGZwcmUsICphcCwg ZnN1Zik7DQogIAkJfQ0KISAJCWlmICh6dGF0KHBiLCAmYnVmLCAxKSkNCiAg CQkgICAgcHV0YygnICcsIHNob3V0KTsNCiAgCQllbHNlDQogIAkJICAgIC8q IFByaW50IHRoZSBmaWxlIHR5cGUgY2hhcmFjdGVyLiAqLw0KICAJCSAgICBw dXRjKGZpbGVfdHlwZShidWYuc3RfbW9kZSksIHNob3V0KTsNCiAgCQlmb3Ig KHQwID0gY29sc3o7IHQwICYmICphcDsgdDAtLSwgYXArKyk7DQogIAkJaWYg KCphcCkNCiAgCQkgICAgLyogQW5kIGFkZCBzcGFjZXMgdG8gbWFrZSB0aGUg Y29sdW1ucyBhbGlnbmVkLiAqLw0KLS0tIDQyMjksNDI4MCAtLS0tDQogIAkJ ICAgIGFwWzBdW2N1dF0gPSBzYXY7DQogIAkJICAgIHBiID0gKmFwOw0KICAJ CX0gZWxzZSB7DQogIAkJICAgIHQyID0gbmZwbCArIG5pY2V6dHJsZW4oKmFw KSArIG5mc2w7DQogIAkJICAgIHBiID0gKGNoYXIgKikgbmNhbGxvYygocHJw cmUgPyBzdHJsZW4ocHJwcmUpIDogMCkgKyAzICsNCiAgCQkJCQkgIHN0cmxl bihmcHJlKSArIHN0cmxlbigqYXApICsgc3RybGVuKGZzdWYpKTsNCiAgCQkg ICAgc3ByaW50ZihwYiwgIiVzJXMlcyVzIiwNCiAgCQkJICAgIChwcnByZSAm JiAqcHJwcmUpID8gcHJwcmUgOiAiLi8iLCBmcHJlLCAqYXAsIGZzdWYpOw0K ICAJCX0NCiEgDQohIAkJLyogR0pCOiBkbyB0aGUgc3RhdCAqLw0KISAJCXp0 YXRfcmV0dXJuID0genRhdChwYiwmYnVmLDEpOw0KISANCiEgCQkvKiBHSkI6 IG5vdyBwcmludCB0aGUgY29sb3IgZXNjYXBlIHNlcXVlbmNlLCBpZiBvcHRp b25zIHNheSB0byAqLw0KISAJCWlmIChpc3NldChMSVNUQ09MT1JTKSAmJiBw cmludF93aXRoX2NvbG9yKSB7DQohIAkJICAgIHByaW50X2NvbG9yX2luZGlj YXRvcihzaG91dCwqYXAsYnVmLnN0X21vZGUsZlN5bUxpbmtPayhwYikpOw0K ISAJCX0NCiEgDQohIAkJLyogR0pCOiBub3cgcHJpbnQgdGhlIG5hbWUtLSB0 aGlzIGNvZGUgd2FzIGluIHRoZSBhbmFsb2dvdXMgYmxvY2sgYWJvdmUNCiEg CQkgICB3aGljaCBub3cganVzdCBidWlsZHMgdGhlIHBhdGggbmFtZS4gIEl0 IG5lZWRlZCB0byBiZSBwcmludGVkICphZnRlcioNCiEgCQkgICB0aGUgY29s b3IgZXNjYXBlIHNlcXVlbmNlICovDQohIA0KISAJCWlmIChpc3BhdHRlcm4p IHsNCiEgCQkgICAgbmljZXpwdXRzKCphcCArIG9mZiwgc2hvdXQpOw0KISAJ CX0NCiEgCQllbHNlIHsNCiEgCQkgICAgbmljZXpwdXRzKGZwcmUsIHNob3V0 KTsNCiEgCQkgICAgbmljZXpwdXRzKCphcCwgc2hvdXQpOw0KISAJCSAgICBu aWNlenB1dHMoZnN1Ziwgc2hvdXQpOw0KISAJCX0NCiEgDQohIAkJLyogR0pC OiBOb3cgdHVybiBvZmYgdGhlIGNvbG9yIGNoYW5nZSBbaWYgYW55XSBiZWZv cmUgZG9pbmcgc3BhY2UgYWxpZ25tZW50ICovDQohIAkJaWYgKGlzc2V0KExJ U1RDT0xPUlMpICYmIHByaW50X3dpdGhfY29sb3IpIHsNCiEgCQkgICAgaWYg KCBjb2xvcl9pbmRpY2F0b3JbQ19FTkRdLnN0cmluZyApIHsNCiEgCQkJcHV0 X2luZGljYXRvcihzaG91dCwmY29sb3JfaW5kaWNhdG9yW0NfRU5EXSk7DQoh IAkJICAgIH0NCiEgCQkgICAgZWxzZSB7DQohIAkJCXB1dF9pbmRpY2F0b3Io c2hvdXQsJmNvbG9yX2luZGljYXRvcltDX0xFRlRdKTsNCiEgCQkJcHV0X2lu ZGljYXRvcihzaG91dCwmY29sb3JfaW5kaWNhdG9yW0NfTk9STV0pOw0KISAJ CQlwdXRfaW5kaWNhdG9yKHNob3V0LCZjb2xvcl9pbmRpY2F0b3JbQ19SSUdI VF0pOw0KISAJCSAgICB9DQohIAkJfQ0KISANCiEgCQlpZiAoenRhdF9yZXR1 cm4pDQogIAkJICAgIHB1dGMoJyAnLCBzaG91dCk7DQogIAkJZWxzZQ0KICAJ CSAgICAvKiBQcmludCB0aGUgZmlsZSB0eXBlIGNoYXJhY3Rlci4gKi8NCiAg CQkgICAgcHV0YyhmaWxlX3R5cGUoYnVmLnN0X21vZGUpLCBzaG91dCk7DQor IA0KICAJCWZvciAodDAgPSBjb2xzejsgdDAgJiYgKmFwOyB0MC0tLCBhcCsr KTsNCiAgCQlpZiAoKmFwKQ0KICAJCSAgICAvKiBBbmQgYWRkIHNwYWNlcyB0 byBtYWtlIHRoZSBjb2x1bW5zIGFsaWduZWQuICovDQoqKioqKioqKioqKioq KioNCioqKiAzNjc5LDM2ODQgKioqKg0KLS0tIDQzMjAsNDMzNyAtLS0tDQog IAkgICAgc2hvd2luZ2xpc3QgPSAtMTsNCiAgCX0gZWxzZQ0KICAJICAgIGNs ZWFyZmxhZyA9IDAsIHB1dGMoJ1xuJywgc2hvdXQpOw0KKyAgICAgLyogRklY OiBEbyB0aGlzIG9ubHkgd2hlbiBsaXN0Y29sb3Igb3B0aW9uIGdldHMgdW5z ZXQsIGFzc3VtaW5nIHRoZSBwYXJzaW5nDQorICAgICAgaXMgZG9uZSBvbmNl IHdoZW4gb3B0aW9uIGlzIHNldCBvciB3aGVuIHZhcmlhYmxlIGNoYW5nZXMs IGFzIGRlc2NyaWJlZCBpbg0KKyAgICAgIG90aGVyIGZpeCBjb21tZW50IGFi b3ZlICovDQorICAgICBpZiAocHJpbnRfd2l0aF9jb2xvcikgew0KKyAJc3Ry dWN0IGNvbF9leHRfdHlwZSAqZXh0Ow0KKyAJZnJlZShjb2xvcl9idWYpOw0K KyAJd2hpbGUgKCBjb2xfZXh0X2xpc3QgKSB7DQorIAkgICAgZXh0ID0gY29s X2V4dF9saXN0Ow0KKyAJICAgIGNvbF9leHRfbGlzdCA9IGNvbF9leHRfbGlz dC0+bmV4dDsNCisgCSAgICBmcmVlKGV4dCk7DQorIAl9DQorICAgICB9DQog IH0NCiAgDQogIC8qIFRoaXMgaXMgdXNlZCB0byBwcmludCBleHBhbnNpb25z LiAqLw0KKioqIHpsZV93b3JkLmMJMTk5Ni8wOC8yMCAxMzo1Mzo1MwkxLjEN Ci0tLSB6bGVfd29yZC5jCTE5OTYvMDgvMjEgMTk6MjU6MzIJMS4yDQoqKioq KioqKioqKioqKioNCioqKiA1Myw1OCAqKioqDQotLS0gNTMsMTExIC0tLS0N CiAgDQogIC8qKi8NCiAgdm9pZA0KKyBmb3J3YXJkd29yZHBhcnQodm9pZCkN Cisgew0KKyAgICAgaWYgKHptdWx0IDwgMCkgew0KKyAJem11bHQgPSAtem11 bHQ7DQorIAliYWNrd2FyZHdvcmRwYXJ0KCk7DQorIAlyZXR1cm47DQorICAg ICB9DQorICAgICB3aGlsZSAoem11bHQtLSkgew0KKyAJLyogc2tpcCB0byBu ZXh0IHVwcGVyY2FzZSBjaGFyYWN0ZXIgYWZ0ZXIgY3VycmVudCBjaGFyYWN0 ZXIgKi8NCisgCWlmIChjcyAhPSBsbCkNCisgCSAgICBjcysrOw0KKyAJd2hp bGUgKGNzICE9IGxsICYmICFpd29yZChsaW5lW2NzXSkpDQorIAkgICAgY3Mr KzsNCisgCXdoaWxlIChjcyAhPSBsbCAmJiBpd29yZChsaW5lW2NzXSkgJiYg IWlzdXBwZXIobGluZVtjc10pKQ0KKyAJICAgIGNzKys7DQorIAlpZiAod29y ZGZsYWcgJiYgIXptdWx0KSB7DQorIAkgICAgcmV0dXJuOw0KKyAJfQ0KKyAJ d2hpbGUgKGNzICE9IGxsICYmICFpd29yZChsaW5lW2NzXSkpDQorIAkgICAg Y3MrKzsNCisgICAgIH0NCisgfQ0KKyANCisgLyoqLw0KKyB2b2lkDQorIGZv cndhcmRkZWxldGV3b3JkcGFydCh2b2lkKQ0KKyB7DQorICAgICBpbnQgeCA9 IGNzOw0KKyANCisgICAgIGlmICh6bXVsdCA8IDApIHsNCisgCXptdWx0ID0g LXptdWx0Ow0KKyAJYmFja3dhcmRkZWxldGV3b3JkcGFydCgpOw0KKyAJcmV0 dXJuOw0KKyAgICAgfQ0KKyAgICAgd2hpbGUgKHptdWx0LS0pIHsNCisgCS8q IGRlbGV0ZSB0byBuZXh0IHVwcGVyY2FzZSBjaGFyYWN0ZXIgYWZ0ZXIgY3Vy cmVudCBjaGFyYWN0ZXIgKi8NCisgCWlmICh4ICE9IGxsKQ0KKyAJICAgIHgr KzsNCisgCXdoaWxlICh4ICE9IGxsICYmICFpd29yZChsaW5lW3hdKSkNCisg CSAgICB4Kys7DQorIAl3aGlsZSAoeCAhPSBsbCAmJiBpd29yZChsaW5lW3hd KSAmJiAhaXN1cHBlcihsaW5lW3hdKSkNCisgCSAgICB4Kys7DQorIAlpZiAo d29yZGZsYWcgJiYgIXptdWx0KSB7DQorIAkgICAgYnJlYWs7DQorIAl9DQor IAl3aGlsZSAoeCAhPSBsbCAmJiAhaXdvcmQobGluZVtjc10pKQ0KKyAJICAg IHgrKzsNCisgICAgIH0NCisgICAgIGZvcmVkZWwoeC1jcyk7DQorIH0NCisg DQorIC8qKi8NCisgdm9pZA0KICB2aWZvcndhcmR3b3JkKHZvaWQpDQogIHsN CiAgICAgIGlmICh6bXVsdCA8IDApIHsNCioqKioqKioqKioqKioqKg0KKioq IDE2NywxNzIgKioqKg0KLS0tIDIyMCwyODAgLS0tLQ0KICAJd2hpbGUgKGNz ICYmIGl3b3JkKGxpbmVbY3MgLSAxXSkpDQogIAkgICAgY3MtLTsNCiAgICAg IH0NCisgfQ0KKyANCisgLyoqLw0KKyB2b2lkDQorIGJhY2t3YXJkd29yZHBh cnQodm9pZCkNCisgew0KKyAgICAgaWYgKHptdWx0IDwgMCkgew0KKyAJem11 bHQgPSAtem11bHQ7DQorIAlmb3J3YXJkd29yZHBhcnQoKTsNCisgCXJldHVy bjsNCisgICAgIH0NCisgICAgIHdoaWxlICh6bXVsdC0tKSB7DQorIAkvKiBz a2lwIHRvIGNoYXIgYWZ0ZXIgZmlyc3QgbG93ZXJjYXNlIGFmdGVyIGFueSB1 cHBlcmNhc2UgY2hhcmFjdGVyDQorIAkgICAoZG8gKm5vdCogbG9vayBhdCBj dXJyZW50IGNoYXIpICovDQorIAlpZiAoY3MgPiAwKQ0KKyAJICAgIGNzLS07 DQorIAl3aGlsZSAoY3MgJiYgIWl3b3JkKGxpbmVbY3NdKSkNCisgCSAgICBj cy0tOw0KKyAJd2hpbGUgKGNzICYmIGl3b3JkKGxpbmVbY3NdKSAmJiAhaXN1 cHBlcihsaW5lW2NzXSkpDQorIAkgICAgY3MtLTsNCisgCWlmICh3b3JkZmxh ZyAmJiAhem11bHQpIHsNCisgCSAgICByZXR1cm47DQorIAl9DQorIAlpZiAo Y3MgJiYgIWl3b3JkKGxpbmVbY3NdKSkNCisgCSAgICBjcy0tOw0KKyAgICAg fSANCisgfQ0KKyANCisgLyoqLw0KKyB2b2lkDQorIGJhY2t3YXJkZGVsZXRl d29yZHBhcnQodm9pZCkNCisgew0KKyAgICAgaW50IHggPSBjczsNCisgDQor ICAgICBpZiAoem11bHQgPCAwKSB7DQorIAl6bXVsdCA9IC16bXVsdDsNCisg CWZvcndhcmRkZWxldGV3b3JkcGFydCgpOw0KKyAJcmV0dXJuOw0KKyAgICAg fQ0KKyAgICAgd2hpbGUgKHptdWx0LS0pIHsNCisgCS8qIHNraXAgdG8gY2hh ciBhZnRlciBmaXJzdCBsb3dlcmNhc2UgYWZ0ZXIgYW55IHVwcGVyY2FzZSBj aGFyYWN0ZXINCisgCSAgIChkbyAqbm90KiBsb29rIGF0IGN1cnJlbnQgY2hh cikgKi8NCisgCWlmICh4ID4gMCkNCisgCSAgICB4LS07DQorIAl3aGlsZSAo eCAmJiAhaXdvcmQobGluZVt4XSkpDQorIAkgICAgeC0tOw0KKyAJd2hpbGUg KHggJiYgaXdvcmQobGluZVt4XSkgJiYgIWlzdXBwZXIobGluZVt4XSkpDQor IAkgICAgeC0tOw0KKyAJaWYgKHdvcmRmbGFnICYmICF6bXVsdCkgew0KKyAJ ICAgIGJyZWFrOw0KKyAJfQ0KKyAJaWYgKHggJiYgIWl3b3JkKGxpbmVbeF0p KQ0KKyAJICAgIHgtLTsNCisgICAgIH0NCisgICAgIGJhY2tkZWwoY3MteCk7 DQogIH0NCiAgDQogIC8qKi8NCioqKiB6bGVfYmluZGluZ3MuYwkxOTk2LzA4 LzIwIDAxOjE3OjU0CTEuMQ0KLS0tIHpsZV9iaW5kaW5ncy5jCTE5OTYvMDgv MjEgMTk6Mjc6NDcJMS4yDQoqKioqKioqKioqKioqKioNCioqKiA0Miw1MCAq KioqDQotLS0gNDIsNTIgLS0tLQ0KICAgICAgeyJiYWNrd2FyZC1jaGFyIiwg YmFja3dhcmRjaGFyLCBaTEVfTU9WRU1FTlR9LA0KICAgICAgeyJiYWNrd2Fy ZC1kZWxldGUtY2hhciIsIGJhY2t3YXJkZGVsZXRlY2hhciwgWkxFX0RFTEVU RX0sDQogICAgICB7ImJhY2t3YXJkLWRlbGV0ZS13b3JkIiwgYmFja3dhcmRk ZWxldGV3b3JkLCBaTEVfREVMRVRFfSwNCisgICAgIHsiYmFja3dhcmQtZGVs ZXRlLXdvcmQtcGFydCIsIGJhY2t3YXJkZGVsZXRld29yZHBhcnQsIFpMRV9E RUxFVEV9LA0KICAgICAgeyJiYWNrd2FyZC1raWxsLWxpbmUiLCBiYWNrd2Fy ZGtpbGxsaW5lLCBaTEVfS0lMTH0sDQogICAgICB7ImJhY2t3YXJkLWtpbGwt d29yZCIsIGJhY2t3YXJka2lsbHdvcmQsIFpMRV9LSUxMIHwgWkxFX0RFTEVU RX0sDQogICAgICB7ImJhY2t3YXJkLXdvcmQiLCBiYWNrd2FyZHdvcmQsIFpM RV9NT1ZFTUVOVH0sDQorICAgICB7ImJhY2t3YXJkLXdvcmQtcGFydCIsIGJh Y2t3YXJkd29yZHBhcnQsIFpMRV9NT1ZFTUVOVH0sDQogICAgICB7ImJlZ2lu bmluZy1vZi1idWZmZXItb3ItaGlzdG9yeSIsIGJlZ2lubmluZ29mYnVmZmVy b3JoaXN0b3J5LCBaTEVfTU9WRU1FTlR9LA0KICAgICAgeyJiZWdpbm5pbmct b2YtaGlzdG9yeSIsIGJlZ2lubmluZ29maGlzdG9yeSwgMH0sDQogICAgICB7 ImJlZ2lubmluZy1vZi1saW5lIiwgYmVnaW5uaW5nb2ZsaW5lLCBaTEVfTU9W RU1FTlR9LA0KKioqKioqKioqKioqKioqDQoqKiogNTQsNTkgKioqKg0KLS0t IDU2LDYyIC0tLS0NCiAgICAgIHsiY29tcGxldGUtd29yZCIsIGNvbXBsZXRl d29yZCwgWkxFX01FTlVDTVB9LA0KICAgICAgeyJjb3B5LXByZXYtd29yZCIs IGNvcHlwcmV2d29yZCwgMH0sDQogICAgICB7ImNvcHktcmVnaW9uLWFzLWtp bGwiLCBjb3B5cmVnaW9uYXNraWxsLCBaTEVfS0lMTH0sDQorICAgICB7ImRh YmJyZXYtY29tcGxldGUiLCBkYWJicmV2Y29tcGxldGUsIFpMRV9NRU5VQ01Q fSwNCiAgICAgIHsiZGVsZXRlLWNoYXIiLCBkZWxldGVjaGFyLCBaTEVfREVM RVRFfSwNCiAgICAgIHsiZGVsZXRlLWNoYXItb3ItbGlzdCIsIGRlbGV0ZWNo YXJvcmxpc3QsIFpMRV9NRU5VQ01QfSwNCiAgICAgIHsiZGVsZXRlLXdvcmQi LCBkZWxldGV3b3JkLCBaTEVfREVMRVRFfSwNCioqKioqKioqKioqKioqKg0K KioqIDc5LDg0ICoqKioNCi0tLSA4Miw4OSAtLS0tDQogICAgICB7ImV4cGFu ZC13b3JkIiwgZXhwYW5kd29yZCwgMH0sDQogICAgICB7ImZvcndhcmQtY2hh ciIsIGZvcndhcmRjaGFyLCBaTEVfTU9WRU1FTlR9LA0KICAgICAgeyJmb3J3 YXJkLXdvcmQiLCBmb3J3YXJkd29yZCwgWkxFX01PVkVNRU5UfSwNCisgICAg IHsiZm9yd2FyZC13b3JkLXBhcnQiLCBmb3J3YXJkd29yZHBhcnQsIFpMRV9N T1ZFTUVOVH0sDQorICAgICB7ImZvcndhcmQtZGVsZXRlLXdvcmQtcGFydCIs IGZvcndhcmRkZWxldGV3b3JkcGFydCwgWkxFX0RFTEVURX0sDQogICAgICB7 ImdldC1saW5lIiwgZ2V0bGluZSwgMH0sDQogICAgICB7Imdvc21hY3MtdHJh bnNwb3NlLWNoYXJzIiwgZ29zbWFjc3RyYW5zcG9zZWNoYXJzLCAwfSwNCiAg ICAgIHsiaGlzdG9yeS1iZWdpbm5pbmctc2VhcmNoLWJhY2t3YXJkIiwgaGlz dG9yeWJlZ2lubmluZ3NlYXJjaGJhY2t3YXJkLCBaTEVfSElTVFNFQVJDSH0s DQoqKioqKioqKioqKioqKioNCioqKiAyMjksMjM1ICoqKioNCiAgICAgIC8q IF5ZICovIHpfeWFuaywNCiAgICAgIC8qIF5aICovIHpfdW5kZWZpbmVka2V5 LA0KICAgICAgLyogXlsgKi8gel9wcmVmaXgsDQohICAgICAvKiBeXCAqLyB6 X3VuZGVmaW5lZGtleSwNCiAgICAgIC8qIF5dICovIHpfdW5kZWZpbmVka2V5 LA0KICAgICAgLyogXl4gKi8gel91bmRlZmluZWRrZXksDQogICAgICAvKiBe XyAqLyB6X3VuZG8sDQotLS0gMjM0LDI0MCAtLS0tDQogICAgICAvKiBeWSAq LyB6X3lhbmssDQogICAgICAvKiBeWiAqLyB6X3VuZGVmaW5lZGtleSwNCiAg ICAgIC8qIF5bICovIHpfcHJlZml4LA0KISAgICAgLyogXlwgKi8gel9iYWNr d2FyZGRlbGV0ZXdvcmRwYXJ0LA0KICAgICAgLyogXl0gKi8gel91bmRlZmlu ZWRrZXksDQogICAgICAvKiBeXiAqLyB6X3VuZGVmaW5lZGtleSwNCiAgICAg IC8qIF5fICovIHpfdW5kbywNCioqKioqKioqKioqKioqKg0KKioqIDM3Niwz ODIgKioqKg0KICAgICAgLyogTS0sICovIHpfdW5kZWZpbmVka2V5LA0KICAg ICAgLyogTS0tICovIHpfbmVnYXJndW1lbnQsDQogICAgICAvKiBNLS4gKi8g el9pbnNlcnRsYXN0d29yZCwNCiEgICAgIC8qIE0tLyAqLyB6X3VuZGVmaW5l ZGtleSwNCiAgICAgIC8qIE0tMCAqLyB6X2RpZ2l0YXJndW1lbnQsDQogICAg ICAvKiBNLTEgKi8gel9kaWdpdGFyZ3VtZW50LA0KICAgICAgLyogTS0yICov IHpfZGlnaXRhcmd1bWVudCwNCi0tLSAzODEsMzg3IC0tLS0NCiAgICAgIC8q IE0tLCAqLyB6X3VuZGVmaW5lZGtleSwNCiAgICAgIC8qIE0tLSAqLyB6X25l Z2FyZ3VtZW50LA0KICAgICAgLyogTS0uICovIHpfaW5zZXJ0bGFzdHdvcmQs DQohICAgICAvKiBNLS8gKi8gel9kYWJicmV2Y29tcGxldGUsDQogICAgICAv KiBNLTAgKi8gel9kaWdpdGFyZ3VtZW50LA0KICAgICAgLyogTS0xICovIHpf ZGlnaXRhcmd1bWVudCwNCiAgICAgIC8qIE0tMiAqLyB6X2RpZ2l0YXJndW1l bnQsDQoqKiogemxlLmgJMTk5Ni8wOC8yMCAyMzo0NTo0NgkxLjENCi0tLSB6 bGUuaAkxOTk2LzA4LzIxIDE5OjI3OjI2CTEuMg0KKioqKioqKioqKioqKioq DQoqKiogMjc5LDI4NyAqKioqDQotLS0gMjc5LDI4OSAtLS0tDQogICAgICB6 X2JhY2t3YXJkY2hhciwNCiAgICAgIHpfYmFja3dhcmRkZWxldGVjaGFyLA0K ICAgICAgel9iYWNrd2FyZGRlbGV0ZXdvcmQsDQorICAgICB6X2JhY2t3YXJk ZGVsZXRld29yZHBhcnQsDQogICAgICB6X2JhY2t3YXJka2lsbGxpbmUsDQog ICAgICB6X2JhY2t3YXJka2lsbHdvcmQsDQogICAgICB6X2JhY2t3YXJkd29y ZCwNCisgICAgIHpfYmFja3dhcmR3b3JkcGFydCwNCiAgICAgIHpfYmVnaW5u aW5nb2ZidWZmZXJvcmhpc3RvcnksDQogICAgICB6X2JlZ2lubmluZ29maGlz dG9yeSwNCiAgICAgIHpfYmVnaW5uaW5nb2ZsaW5lLA0KKioqKioqKioqKioq KioqDQoqKiogMjkxLDI5NiAqKioqDQotLS0gMjkzLDI5OSAtLS0tDQogICAg ICB6X2NvbXBsZXRld29yZCwNCiAgICAgIHpfY29weXByZXZ3b3JkLA0KICAg ICAgel9jb3B5cmVnaW9uYXNraWxsLA0KKyAgICAgel9kYWJicmV2Y29tcGxl dGUsDQogICAgICB6X2RlbGV0ZWNoYXIsDQogICAgICB6X2RlbGV0ZWNoYXJv cmxpc3QsDQogICAgICB6X2RlbGV0ZXdvcmQsDQoqKioqKioqKioqKioqKioN CioqKiAzMTYsMzIxICoqKioNCi0tLSAzMTksMzI2IC0tLS0NCiAgICAgIHpf ZXhwYW5kd29yZCwNCiAgICAgIHpfZm9yd2FyZGNoYXIsDQogICAgICB6X2Zv cndhcmR3b3JkLA0KKyAgICAgel9mb3J3YXJkZGVsZXRld29yZHBhcnQsDQor ICAgICB6X2ZvcndhcmR3b3JkcGFydCwNCiAgICAgIHpfZ2V0bGluZSwNCiAg ICAgIHpfZ29zbWFjc3RyYW5zcG9zZWNoYXJzLA0KICAgICAgel9oaXN0b3J5 YmVnaW5uaW5nc2VhcmNoYmFja3dhcmQsDQoqKiogenNoLmgJMTk5Ni8wOC8y MSAyMDozNzowMQkxLjENCi0tLSB6c2guaAkxOTk2LzA4LzIxIDIwOjM4OjA1 CTEuMg0KKioqKioqKioqKioqKioqDQoqKiogMTExNCwxMTE5ICoqKioNCi0t LSAxMTE0LDExMjAgLS0tLQ0KICAgICAgTElTVEFNQklHVU9VUywNCiAgICAg IExJU1RCRUVQLA0KICAgICAgTElTVFRZUEVTLA0KKyAgICAgTElTVENPTE9S UywNCiAgICAgIExPQ0FMT1BUSU9OUywNCiAgICAgIExPR0lOU0hFTEwsDQog ICAgICBMT05HTElTVEpPQlMsDQo= ---559023410-851401618-840664367=:23539--