From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,HTML_MESSAGE,MAILING_LIST_MULTI autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 1425 invoked from network); 4 Mar 2023 14:50:26 -0000 Received: from minnie.tuhs.org (2600:3c01:e000:146::1) by inbox.vuxu.org with ESMTPUTF8; 4 Mar 2023 14:50:26 -0000 Received: from minnie.tuhs.org (localhost [IPv6:::1]) by minnie.tuhs.org (Postfix) with ESMTP id 39270412C2; Sun, 5 Mar 2023 00:50:21 +1000 (AEST) Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by minnie.tuhs.org (Postfix) with ESMTPS id 76E0D412C1 for ; Sun, 5 Mar 2023 00:50:12 +1000 (AEST) Received: by mail-pl1-x632.google.com with SMTP id n6so5716475plf.5 for ; Sat, 04 Mar 2023 06:50:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1677941411; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=44BgCxtLLhQJ6+0N3Pe2D4D3amWqmwAutk9yAq8lgcE=; b=Ol0ziFC41IrAQB8JgAg4ohlVVJiIglBj5gn0AxZL5R5Obzxd+FNHzS4guKnseEJMLt yCCjBnL81hBWGGhlpN+VHuwhdhpbY+108DWjtyA3bEvR+7SNyCQGAbsx1g9RrA7TnWlO 2+YpRl6R28XT1LfLLhbPj1pIWmPrQLePC4J7/13+7i6HJtsd0UhGCklT7uiyXVwdbBPc 1krHEfWl90xEbC/ex+EirauxRmQTBTJo5FO40qeOQeBxpMZrxF6huXAYUG2YMnsiN3HN Bn3qN0hr/T0stl4EVjbm40/WFIdR6Zr4zhapvGDq8jNiCwwtE4D+0w4QRhkykauAqZzP djCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677941411; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=44BgCxtLLhQJ6+0N3Pe2D4D3amWqmwAutk9yAq8lgcE=; b=NdWEpfP2QOUJoXpN9wLj/I1mqVEBbPmL3jj34VqXn5USzIbVg/FRWGp96WIOtwvq4d rQa+D6dN0Yr0ReVr7P/CaE5igUoPFUAXl/8AgU9cUC1UoLo9VKef74uyaB6/rvStyJsW eaUZAWDnnfcBI+YjMx2V2+BtC+6EdUWuojIrhcFNJe2WCEjpCFFYLFErUQpty891dvXV clYdqZQplD+aLLANkqA84OPb6+UNbGgTZvrIBpW0KGXDPBET+wCwDyg4lRP5nLYiVJO7 u9SfG/pkcTiAeJrIWYxVKFhowDGXr+Dj8HMLUXITj0hHw5Zvh21DP6uSdj+Qa3Z314ni 83dQ== X-Gm-Message-State: AO0yUKVNuMDSnqKmREw/NPrVujqLC/a0lbtSU6MswHBJzPKlyJPJyJAi 5RBmxdDA/OCn2RwX7Kmm0Rvh6EvOQFFEfd6beEDl9rBs X-Google-Smtp-Source: AK7set/oumeZiwZIWBwVFr5g3cf2CFYA2qjufPAkW3EccK0im2Awzaie/zLKiIUJqEVjQG+v7Qvn1D4v/x/cbeuHNsU= X-Received: by 2002:a17:902:6807:b0:19c:d14b:ee20 with SMTP id h7-20020a170902680700b0019cd14bee20mr2019779plk.8.1677941411512; Sat, 04 Mar 2023 06:50:11 -0800 (PST) MIME-Version: 1.0 References: <20230304144134.A3AFD18C091@mercury.lcs.mit.edu> In-Reply-To: <20230304144134.A3AFD18C091@mercury.lcs.mit.edu> From: KenUnix Date: Sat, 4 Mar 2023 09:49:54 -0500 Message-ID: To: Noel Chiappa Content-Type: multipart/mixed; boundary="000000000000c9c6da05f6142d53" Message-ID-Hash: SOJM2SJBUWSCXGIG5YR3GG7JJFRUTPQV X-Message-ID-Hash: SOJM2SJBUWSCXGIG5YR3GG7JJFRUTPQV X-MailFrom: ken.unix.guy@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: tuhs@tuhs.org X-Mailman-Version: 3.3.6b1 Precedence: list Subject: [TUHS] Re: Unix v7 icheck dup problem List-Id: The Unix Heritage Society mailing list Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --000000000000c9c6da05f6142d53 Content-Type: multipart/alternative; boundary="000000000000c9c6d705f6142d51" --000000000000c9c6d705f6142d51 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Attached is the one I have been toying with. Ignore the 'v7' part I added. Ken On Sat, Mar 4, 2023 at 9:41=E2=80=AFAM Noel Chiappa wrote: > > From: Clem Cole wrote: > > > It had more colorful name originally - fsck (pronounced as fisk BTW= ) > > was finished. I suspect the fcheck name was a USG idea. > > I dunno. I don't think we at MIT wold have gratuitously changed the name = to > 'fcheck'; I rather think that was its original name - and we pretty > definitely got it from CMU. 'fsck' was definitely descended from 'fcheck' > (below). > > > > From: Jonathan Gray > > >> (are 'fsck' and 'fcheck' the same program?) > > > https://www.tuhs.org/cgi-bin/utree.pl?file=3DV7addenda/fsck > > Having looked the the source to both, it's quite clear that 'fcheck' is a > distant ancestor of 'fsck' (see below for thoughts on the connection(s)). > The > latter has been _very_ extensively modified, but there are still some > traces > of 'fcheck' left. > > A lot of the changes are to increase the portability, and also to come in= to > compliance with the latest 'C' (e.g. function prototypes); others are jus= t > to > get rid of oddities in the original coding style. E.g.: > > unsigned > dsize, > fmin, > fmax > ; > > Perfectly legal C, but nobody uses that style. > > > > From: Jonathan Gray > > > fcheck is from Hal Pierson at Bell according to > > https://www.tuhs.org/Archive/Distributions/USDL/CB_Unix/readme.txt > > Hmm. "the major features that were added to UNIX by CB/UNIX ... Hal Perso= n > (or Pierson?) also rewrote the original check disk command into something > that was useful by someone other than researchers." > > I poked around in CB/UNIX, and found 'check(1M)': > > > https://www.tuhs.org/Archive/Distributions/USDL/CB_Unix/cbunix_man1_01.pd= f > > (dated November 1979). Alas, the source isn't there, but it's clearly in > the > fheck/fsck family. (CB/UNIX also has chkold(1M), which looks to me like > it's > 'icheck'.) > > So now we have a question about the ancestry of 'check' and 'fcheck' - is > one > an ancestor of the other, and if so, which - or are they independent > creations? Without the source, it's hard to be definitive, bur from the > messages (as given in the manual), they do seem related. > > Clem's message of 3 Mar, 14:35 seems to indicate the the original was fro= m > CMU, authored by Ted Kowalski; he also: > > https://wiki.tuhs.org/doku.php?id=3Danecdotes:clem_cole_student > > says "Ted Kowalski shows up for his OYOC year in the EE dept after his > summer > at Bell Labs ... He also brought his cool (but unfinished) program he had > started to write originally at U Mich - fsck". So maybe the CB/UNIX > 'check' is > descended from a version that Ted left behind at Bell Labs? > > Is anyone in touch with Hal Pierson? He could surely clear up these > questions. > > Noel > --=20 End of line JOB TERMINATED --000000000000c9c6d705f6142d51 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

Attached is the one I have been toying= with. Ignore the 'v7' part I added.

Ken

On Sat, Mar 4, 2023 at 9:41=E2=80=AFAM Noel Chiappa <jnc@mercury.lcs.mit.edu> wrote:
<= /div>
=C2=A0 =C2=A0 > F= rom: Clem Cole wrote:

=C2=A0 =C2=A0 > It had more colorful name originally - fsck (pronounced = as fisk BTW)
=C2=A0 =C2=A0 > was finished. I suspect the fcheck name was a USG idea. =

I dunno. I don't think we at MIT wold have gratuitously changed the nam= e to
'fcheck'; I rather think that was its original name - and we pretty=
definitely got it from CMU. 'fsck' was definitely descended from &#= 39;fcheck'
(below).


=C2=A0 =C2=A0 > From: Jonathan Gray

=C2=A0 =C2=A0 >> (are 'fsck' and 'fcheck' the same pr= ogram?)

=C2=A0 =C2=A0 > https://www.tuhs.org/c= gi-bin/utree.pl?file=3DV7addenda/fsck

Having looked the the source to both, it's quite clear that 'fcheck= ' is a
distant ancestor of 'fsck' (see below for thoughts on the connectio= n(s)). The
latter has been _very_ extensively modified, but there are still some trace= s
of 'fcheck' left.

A lot of the changes are to increase the portability, and also to come into=
compliance with the latest 'C' (e.g. function prototypes); others a= re just to
get rid of oddities in the original coding style. E.g.:

=C2=A0 unsigned
=C2=A0 =C2=A0 =C2=A0 =C2=A0 dsize,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 fmin,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 fmax
=C2=A0 ;

Perfectly legal C, but nobody uses that style.


=C2=A0 =C2=A0 > From: Jonathan Gray

=C2=A0 =C2=A0 > fcheck is from Hal Pierson at Bell according to
=C2=A0 =C2=A0 > https://www.tuh= s.org/Archive/Distributions/USDL/CB_Unix/readme.txt

Hmm. "the major features that were added to UNIX by CB/UNIX ... Hal Pe= rson
(or Pierson?) also rewrote the original check disk command into something that was useful by someone other than researchers."

I poked around in CB/UNIX, and found 'check(1M)':

=C2=A0 https://www.tuhs.or= g/Archive/Distributions/USDL/CB_Unix/cbunix_man1_01.pdf

(dated November 1979). Alas, the source isn't there, but it's clear= ly in the
fheck/fsck family. (CB/UNIX also has chkold(1M), which looks to me like it&= #39;s
'icheck'.)

So now we have a question about the ancestry of 'check' and 'fc= heck' - is one
an ancestor of the other, and if so, which - or are they independent
creations? Without the source, it's hard to be definitive, bur from the=
messages (as given in the manual), they do seem related.

Clem's message of 3 Mar, 14:35 seems to indicate the the original was f= rom
CMU, authored by Ted Kowalski; he also:

=C2=A0 https://wiki.tuhs.org/doku.php= ?id=3Danecdotes:clem_cole_student

says "Ted Kowalski shows up for his OYOC year in the EE dept after his= summer
at Bell Labs ... He also brought his cool (but unfinished) program he had started to write originally at U Mich - fsck". So maybe the CB/UNIX &#= 39;check' is
descended from a version that Ted left behind at Bell Labs?

Is anyone in touch with Hal Pierson? He could surely clear up these questio= ns.

=C2=A0 =C2=A0 =C2=A0 =C2=A0 Noel


--
End of line
JOB TERMINATED


=
--000000000000c9c6d705f6142d51-- --000000000000c9c6da05f6142d53 Content-Type: text/x-csrc; charset="US-ASCII"; name="v7fsck.c" Content-Disposition: attachment; filename="v7fsck.c" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_leu2y0hc0 I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3BhcmFt Lmg+CiNpbmNsdWRlIDxzeXMvZmlsc3lzLmg+CiNpbmNsdWRlIDxzeXMvZGlyLmg+CiNpbmNsdWRl IDxzeXMvZmJsay5oPgojaW5jbHVkZSA8c3lzL2luby5oPgojaW5jbHVkZSA8c3lzL2lub2RlLmg+ CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgoKdHlwZWRlZglpbnQJKCpTSUdfVFlQKSgpOwoKI2RlZmlu ZSBORElSRUNUCShCU0laRS9zaXplb2Yoc3RydWN0IGRpcmVjdCkpCiNkZWZpbmUgU1BFUkIJKEJT SVpFL3NpemVvZihzaG9ydCkpCgojZGVmaW5lIE5PCTAKI2RlZmluZSBZRVMJMQoKI2RlZmluZQlN QVhEVVAJMTAJCS8qIGxpbWl0IG9uIGR1cCBibGtzIChwZXIgaW5vZGUpICovCiNkZWZpbmUJTUFY QkFECTEwCQkvKiBsaW1pdCBvbiBiYWQgYmxrcyAocGVyIGlub2RlKSAqLwoKI2RlZmluZSBTVEVQ U0laRQk5CS8qIGRlZmF1bHQgc3RlcCBmb3IgZnJlZWxpc3Qgc3BhY2luZyAqLwojZGVmaW5lIENZ TFNJWkUJCTQwMAkvKiBkZWZhdWx0IGN5bCBzaXplIGZvciBzcGFjaW5nICovCiNkZWZpbmUgTUFY Q1lMCQk1MDAJLyogbWF4aW11bSBjeWxpbmRlciBzaXplICovCgojZGVmaW5lIEJJVFNQQgk4CQkv KiBudW1iZXIgYml0cyBwZXIgYnl0ZSAqLwojZGVmaW5lIEJJVFNISUZUCTMJLyogbG9nMihCSVRT UEIpICovCiNkZWZpbmUgQklUTUFTSwkwNwkJLyogQklUU1BCLTEgKi8KI2RlZmluZSBMU1RBVEUJ MgkJLyogYml0cyBwZXIgaW5vZGUgc3RhdGUgKi8KI2RlZmluZSBTVEFURVBCCShCSVRTUEIvTFNU QVRFKQkvKiBpbm9kZSBzdGF0ZXMgcGVyIGJ5dGUgKi8KI2RlZmluZSBVU1RBVEUJMAkJLyogaW5v ZGUgbm90IGFsbG9jYXRlZCAqLwojZGVmaW5lIEZTVEFURQkwMQkJLyogaW5vZGUgaXMgZmlsZSAq LwojZGVmaW5lIERTVEFURQkwMgkJLyogaW5vZGUgaXMgZGlyZWN0b3J5ICovCiNkZWZpbmUgQ0xF QVIJMDMJCS8qIGlub2RlIGlzIHRvIGJlIGNsZWFyZWQgKi8KI2RlZmluZSBTTUFTSwkwMwkJLyog bWFzayBmb3IgaW5vZGUgc3RhdGUgKi8KCnR5cGVkZWYgc3RydWN0IGRpbm9kZQlESU5PREU7CnR5 cGVkZWYgc3RydWN0IGRpcmVjdAlESVJFQ1Q7CgojZGVmaW5lIEFMTE9DCSgoZHAtPmRpX21vZGUg JiBJRk1UKSAhPSAwKQojZGVmaW5lIERJUgkoKGRwLT5kaV9tb2RlICYgSUZNVCkgPT0gSUZESVIp CiNkZWZpbmUgUkVHCSgoZHAtPmRpX21vZGUgJiBJRk1UKSA9PSBJRlJFRykKI2RlZmluZSBCTEsJ KChkcC0+ZGlfbW9kZSAmIElGTVQpID09IElGQkxLKQojZGVmaW5lIENIUgkoKGRwLT5kaV9tb2Rl ICYgSUZNVCkgPT0gSUZDSFIpCiNkZWZpbmUgTVBDCSgoZHAtPmRpX21vZGUgJiBJRk1UKSA9PSBJ Rk1QQykKI2RlZmluZSBNUEIJKChkcC0+ZGlfbW9kZSAmIElGTVQpID09IElGTVBCKQojZGVmaW5l IFNQRUNJQUwJKEJMSyB8fCBDSFIgfHwgTVBDIHx8IE1QQikKCiNkZWZpbmUgTklOT0JMSwkxMQkJ LyogbnVtIGJsa3MgZm9yIHJhdyByZWFkaW5nICovCiNkZWZpbmUgTUFYUkFXCTExMAkJLyogbGFy Z2VzdCByYXcgcmVhZCAoaW4gYmxrcykgKi8KZGFkZHJfdAlzdGFydGliOwkJLyogYmxrIG51bSBv ZiBmaXJzdCBpbiByYXcgYXJlYSAqLwp1bnNpZ25lZCBuaWJsazsJCQkvKiBudW0gb2YgYmxrcyBp biByYXcgYXJlYSAqLwoKc3RydWN0IGJ1ZmFyZWEgewoJc3RydWN0IGJ1ZmFyZWEJKmJfbmV4dDsJ CS8qIG11c3QgYmUgZmlyc3QgKi8KCWRhZGRyX3QJYl9ibm87Cgl1bmlvbiB7CgkJY2hhcgliX2J1 ZltCU0laRV07CQkvKiBidWZmZXIgc3BhY2UgKi8KCQlzaG9ydAliX2xua3NbU1BFUkJdOwkJLyog bGluayBjb3VudHMgKi8KCQlkYWRkcl90CWJfaW5kaXJbTklORElSXTsJLyogaW5kaXJlY3QgYmxv Y2sgKi8KCQlzdHJ1Y3QgZmlsc3lzIGJfZnM7CQkvKiBzdXBlciBibG9jayAqLwoJCXN0cnVjdCBm YmxrIGJfZmI7CQkvKiBmcmVlIGJsb2NrICovCgkJc3RydWN0IGRpbm9kZSBiX2Rpbm9kZVtJTk9Q Ql07CS8qIGlub2RlIGJsb2NrICovCgkJRElSRUNUIGJfZGlyW05ESVJFQ1RdOwkJLyogZGlyZWN0 b3J5ICovCgl9IGJfdW47CgljaGFyCWJfZGlydHk7Cn07Cgp0eXBlZGVmIHN0cnVjdCBidWZhcmVh IEJVRkFSRUE7CgpCVUZBUkVBCWlub2JsazsJCQkvKiBpbm9kZSBibG9ja3MgKi8KQlVGQVJFQQlm aWxlYmxrOwkJLyogb3RoZXIgYmxrcyBpbiBmaWxlc3lzICovCkJVRkFSRUEJc2JsazsJCQkvKiBm aWxlIHN5c3RlbSBzdXBlcmJsb2NrICovCkJVRkFSRUEJKnBvb2xoZWFkOwkJLyogcHRyIHRvIGZp cnN0IGJ1ZmZlciBpbiBwb29sICovCgojZGVmaW5lIGluaXRiYXJlYSh4KQkoeCktPmJfZGlydHkg PSAwOyh4KS0+Yl9ibm8gPSAoZGFkZHJfdCktMQojZGVmaW5lIGRpcnR5KHgpCSh4KS0+Yl9kaXJ0 eSA9IDEKI2RlZmluZSBpbm9kaXJ0eSgpCWlub2Jsay5iX2RpcnR5ID0gMQojZGVmaW5lIGZiZGly dHkoKQlmaWxlYmxrLmJfZGlydHkgPSAxCiNkZWZpbmUgc2JkaXJ0eSgpCXNibGsuYl9kaXJ0eSA9 IDEKCiNkZWZpbmUgZnJlZWJsawkJZmlsZWJsay5iX3VuLmJfZmIKI2RlZmluZSBkaXJibGsJCWZp bGVibGsuYl91bgojZGVmaW5lIHN1cGVyYmxrCXNibGsuYl91bi5iX2ZzCgpzdHJ1Y3QgZmlsZWNu dGwgewoJaW50CXJmZGVzOwoJaW50CXdmZGVzOwoJaW50CW1vZDsKfTsKCnN0cnVjdCBmaWxlY250 bAlkZmlsZTsJCS8qIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGZpbGVzeXMgKi8Kc3RydWN0IGZpbGVj bnRsCXNmaWxlOwkJLyogZmlsZSBkZXNjcmlwdG9ycyBmb3Igc2NyYXRjaCBmaWxlICovCgp0eXBl ZGVmIHVuc2lnbmVkIE1FTVNJWkU7CgpNRU1TSVpFCW1lbXNpemU7CQkvKiBhbXQgb2YgbWVtb3J5 IHdlIGdvdCAqLwojaWZkZWYgcGRwMTEKI2RlZmluZSBNQVhEQVRBCSgoTUVNU0laRSk1NCoxMDI0 KQojZW5kaWYKI2lmIHZheAojZGVmaW5lCU1BWERBVEEgKChNRU1TSVpFKTQwMCoxMDI0KQojZW5k aWYKI2lmIGludGVyZGF0YQojZGVmaW5lCU1BWERBVEEgKChNRU1TSVpFKTQwMCoxMDI0KQojZW5k aWYKCiNkZWZpbmUJRFVQVEJMU0laRQkxMDAJLyogbnVtIG9mIGR1cCBibG9ja3MgdG8gcmVtZW1i ZXIgKi8KZGFkZHJfdAlkdXBsaXN0W0RVUFRCTFNJWkVdOwkvKiBkdXAgYmxvY2sgdGFibGUgKi8K ZGFkZHJfdAkqZW5kZHVwOwkJLyogbmV4dCBlbnRyeSBpbiBkdXAgdGFibGUgKi8KZGFkZHJfdAkq bXVsZHVwOwkJLyogbXVsdGlwbGUgZHVwcyBwYXJ0IG9mIHRhYmxlICovCgojZGVmaW5lIE1BWExO Q05UCTIwCS8qIG51bSB6ZXJvIGxpbmsgY250cyB0byByZW1lbWJlciAqLwppbm9fdAliYWRsbmNu dFtNQVhMTkNOVF07CS8qIHRhYmxlIG9mIGlub3Mgd2l0aCB6ZXJvIGxpbmsgY250cyAqLwppbm9f dAkqYmFkbG5wOwkJLyogbmV4dCBlbnRyeSBpbiB0YWJsZSAqLwoKY2hhcglzZmxhZzsJCQkvKiBz YWx2YWdlIGZyZWUgYmxvY2sgbGlzdCAqLwpjaGFyCWNzZmxhZzsJCQkvKiBzYWx2YWdlIGZyZWUg YmxvY2sgbGlzdCAoY29uZGl0aW9uYWwpICovCmNoYXIJbmZsYWc7CQkJLyogYXNzdW1lIGEgbm8g cmVzcG9uc2UgKi8KY2hhcgl5ZmxhZzsJCQkvKiBhc3N1bWUgYSB5ZXMgcmVzcG9uc2UgKi8KY2hh cgl0ZmxhZzsJCQkvKiBzY3JhdGNoIGZpbGUgc3BlY2lmaWVkICovCmNoYXIJcnBseWZsYWc7CQkv KiBhbnkgcXVlc3Rpb25zIGFza2VkPyAqLwpjaGFyCWhvdHJvb3Q7CQkvKiBjaGVja2luZyByb290 IGRldmljZSAqLwpjaGFyCXJhd2ZsZzsJCQkvKiByZWFkIHJhdyBkZXZpY2UgKi8KY2hhcglybXNj cjsJCQkvKiByZW1vdmUgc2NyYXRjaCBmaWxlIHdoZW4gZG9uZSAqLwpjaGFyCWZpeGZyZWU7CQkv KiBjb3JydXB0ZWQgZnJlZSBsaXN0ICovCmNoYXIJKm1lbWJhc2U7CQkvKiBiYXNlIG9mIG1lbW9y eSB3ZSBnZXQgKi8KY2hhcgkqYmxrbWFwOwkJLyogcHRyIHRvIHByaW1hcnkgYmxrIGFsbG9jYXRp b24gbWFwICovCmNoYXIJKmZyZWVtYXA7CQkvKiBwdHIgdG8gc2Vjb25kYXJ5IGJsayBhbGxvY2F0 aW9uIG1hcCAqLwpjaGFyCSpzdGF0ZW1hcDsJCS8qIHB0ciB0byBpbm9kZSBzdGF0ZSB0YWJsZSAq LwpjaGFyCSpwYXRocDsJCQkvKiBwb2ludGVyIHRvIHBhdGhuYW1lIHBvc2l0aW9uICovCmNoYXIJ KnRoaXNuYW1lOwkJLyogcHRyIHRvIGN1cnJlbnQgcGF0aG5hbWUgY29tcG9uZW50ICovCmNoYXIJ KnNyY2huYW1lOwkJLyogbmFtZSBiZWluZyBzZWFyY2hlZCBmb3IgaW4gZGlyICovCmNoYXIJcGF0 aG5hbWVbMjAwXTsKY2hhcglzY3JmaWxlWzgwXTsKY2hhcgkqbGZuYW1lID0JImxvc3QrZm91bmQi OwpjaGFyCSpjaGVja2xpc3QgPQkiL2V0Yy9jaGVja2xpc3QiOwoKc2hvcnQJKmxuY250cDsJCS8q IHB0ciB0byBsaW5rIGNvdW50IHRhYmxlICovCgppbnQJY3lsc2l6ZTsJCS8qIG51bSBibG9ja3Mg cGVyIGN5bGluZGVyICovCmludAlzdGVwc2l6ZTsJCS8qIG51bSBibG9ja3MgZm9yIHNwYWNpbmcg cHVycG9zZXMgKi8KaW50CWJhZGJsazsJCQkvKiBudW0gb2YgYmFkIGJsa3Mgc2VlbiAocGVyIGlu b2RlKSAqLwppbnQJZHVwYmxrOwkJCS8qIG51bSBvZiBkdXAgYmxrcyBzZWVuIChwZXIgaW5vZGUp ICovCmludAkoKnBmdW5jKSgpOwkJLyogZnVuY3Rpb24gdG8gY2FsbCB0byBjaGsgYmxrICovCgpp bm9fdAlpbnVtOwkJCS8qIGlub2RlIHdlIGFyZSBjdXJyZW50bHkgd29ya2luZyBvbiAqLwppbm9f dAlpbWF4OwkJCS8qIG51bWJlciBvZiBpbm9kZXMgKi8KaW5vX3QJcGFyZW50ZGlyOwkJLyogaSBu dW1iZXIgb2YgcGFyZW50IGRpcmVjdG9yeSAqLwppbm9fdAlsYXN0aW5vOwkJLyogaGl3YXRlciBt YXJrIG9mIGlub2RlcyAqLwppbm9fdAlsZmRpcjsJCQkvKiBsb3N0ICYgZm91bmQgZGlyZWN0b3J5 ICovCmlub190CW9ycGhhbjsJCQkvKiBvcnBoYW5lZCBpbm9kZSAqLwoKb2ZmX3QJZmlsc2l6ZTsJ CS8qIG51bSBibGtzIHNlZW4gaW4gZmlsZSAqLwpvZmZfdAltYXhibGs7CQkJLyogbGFyZ2VzdCBs b2dpY2FsIGJsayBpbiBmaWxlICovCm9mZl90CWJtYXBzejsJCQkvKiBudW0gY2hhcnMgaW4gYmxr bWFwICovCgpkYWRkcl90CXNtYXBibGs7CQkvKiBzdGFydGluZyBibGsgb2Ygc3RhdGUgbWFwICov CmRhZGRyX3QJbG5jbnRibGs7CQkvKiBzdGFydGluZyBibGsgb2YgbGluayBjbnQgdGFibGUgKi8K ZGFkZHJfdAlmbWFwYmxrOwkJLyogc3RhcnRpbmcgYmxrIG9mIGZyZWUgbWFwICovCmRhZGRyX3QJ bl9mcmVlOwkJCS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqLwpkYWRkcl90CW5fYmxrczsJCQkv KiBudW1iZXIgb2YgYmxvY2tzIHVzZWQgKi8KZGFkZHJfdAluX2ZpbGVzOwkJLyogbnVtYmVyIG9m IGZpbGVzIHNlZW4gKi8KZGFkZHJfdAlmbWluOwkJCS8qIGJsb2NrIG51bWJlciBvZiB0aGUgZmly c3QgZGF0YSBibG9jayAqLwpkYWRkcl90CWZtYXg7CQkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiB0 aGUgdm9sdW1lICovCgojZGVmaW5lIGhvd21hbnkoeCx5KQkoKCh4KSsoKHkpLTEpKS8oeSkpCiNk ZWZpbmUgcm91bmR1cCh4LHkpCSgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKI2RlZmluZSBvdXRy YW5nZSh4KQkoeCA8IGZtaW4gfHwgeCA+PSBmbWF4KQojZGVmaW5lIHphcGlubyh4KQljbGVhcigo Y2hhciAqKSh4KSxzaXplb2YoRElOT0RFKSkKCiNkZWZpbmUgc2V0bG5jbnQoeCkJZG9sbmNudCh4 LDApCiNkZWZpbmUgZ2V0bG5jbnQoKQlkb2xuY250KDAsMSkKI2RlZmluZSBkZWNsbmNudCgpCWRv bG5jbnQoMCwyKQoKI2RlZmluZSBzZXRibWFwKHgpCWRvbWFwKHgsMCkKI2RlZmluZSBnZXRibWFw KHgpCWRvbWFwKHgsMSkKI2RlZmluZSBjbHJibWFwKHgpCWRvbWFwKHgsMikKCiNkZWZpbmUgc2V0 Zm1hcCh4KQlkb21hcCh4LDArNCkKI2RlZmluZSBnZXRmbWFwKHgpCWRvbWFwKHgsMSs0KQojZGVm aW5lIGNscmZtYXAoeCkJZG9tYXAoeCwyKzQpCgojZGVmaW5lIHNldHN0YXRlKHgpCWRvc3RhdGUo eCwwKQojZGVmaW5lIGdldHN0YXRlKCkJZG9zdGF0ZSgwLDEpCgojZGVmaW5lIERBVEEJMQojZGVm aW5lIEFERFIJMAojZGVmaW5lIEFMVEVSRAkwMTAKI2RlZmluZSBLRUVQT04JMDQKI2RlZmluZSBT S0lQCTAyCiNkZWZpbmUgU1RPUAkwMQoKaW50CSgqc2lnbmFsKCkpKCk7CmxvbmcJbHNlZWsoKTsK bG9uZwl0aW1lKCk7CkRJTk9ERQkqZ2lub2RlKCk7CkJVRkFSRUEJKmdldGJsaygpOwpCVUZBUkVB CSpzZWFyY2goKTsKaW50CWRpcnNjYW4oKTsKaW50CWZpbmRpbm8oKTsKaW50CWNhdGNoKCk7Cmlu dAlta2VudHJ5KCk7CmludAljaGdkZCgpOwppbnQJcGFzczEoKTsKaW50CXBhc3MxYigpOwppbnQJ cGFzczIoKTsKaW50CXBhc3MzKCk7CmludAlwYXNzNCgpOwppbnQJcGFzczUoKTsKCm1haW4oYXJn Yyxhcmd2KQppbnQJYXJnYzsKY2hhcgkqYXJndltdOwp7CglyZWdpc3RlciBGSUxFICpmcDsKCXJl Z2lzdGVyIG47CglyZWdpc3RlciBjaGFyICpwOwoJY2hhciBmaWxlbmFtZVs1MF07CgljaGFyICpz YnJrKCk7CgoJc3luYygpOwoJd2hpbGUoLS1hcmdjID4gMCAmJiAqKisrYXJndiA9PSAnLScpIHsK CQlzd2l0Y2goKisrKmFyZ3YpIHsKCQkJY2FzZSAndCc6CgkJCWNhc2UgJ1QnOgoJCQkJdGZsYWcr KzsKCQkJCWlmKCoqKythcmd2ID09ICctJyB8fCAtLWFyZ2MgPD0gMCkKCQkJCQllcnJleGl0KCJC YWQgLXQgb3B0aW9uXG4iKTsKCQkJCXAgPSBzY3JmaWxlOwoJCQkJd2hpbGUoKnArKyA9ICoqYXJn dikKCQkJCQkoKmFyZ3YpKys7CgkJCQlicmVhazsKCQkJY2FzZSAncyc6CS8qIHNhbHZhZ2UgZmxh ZyAqLwoJCQkJc3R5cGUoKysqYXJndik7CgkJCQlzZmxhZysrOwoJCQkJYnJlYWs7CgkJCWNhc2Ug J1MnOgkvKiBjb25kaXRpb25hbCBzYWx2YWdlICovCgkJCQlzdHlwZSgrKyphcmd2KTsKCQkJCWNz ZmxhZysrOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ24nOgkvKiBkZWZhdWx0IG5vIGFuc3dlciBmbGFn ICovCgkJCWNhc2UgJ04nOgoJCQkJbmZsYWcrKzsKCQkJCXlmbGFnID0gMDsKCQkJCWJyZWFrOwoJ CQljYXNlICd5JzoJLyogZGVmYXVsdCB5ZXMgYW5zd2VyIGZsYWcgKi8KCQkJY2FzZSAnWSc6CgkJ CQl5ZmxhZysrOwoJCQkJbmZsYWcgPSAwOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQllcnJl eGl0KCIlYyBvcHRpb24/XG4iLCoqYXJndik7CgkJfQoJfQoJaWYobmZsYWcgJiYgKHNmbGFnIHx8 IGNzZmxhZykpCgkJZXJyZXhpdCgiSW5jb21wYXRpYmxlIG9wdGlvbnM6IC1uIGFuZCAtJXNcbiIs c2ZsYWc/InMiOiJTIik7CglpZihzZmxhZyAmJiBjc2ZsYWcpCgkJc2ZsYWcgPSAwOwoJbWVtc2l6 ZSA9IChNRU1TSVpFKXNicmsoMCk7CgltZW1zaXplID0gTUFYREFUQSAtIG1lbXNpemUgLSBzaXpl b2YoaW50KTsKCXdoaWxlKG1lbXNpemUgPj0gMipzaXplb2YoQlVGQVJFQSkgJiYKCQkobWVtYmFz ZSA9IHNicmsobWVtc2l6ZSkpID09IChjaGFyICopLTEpCgkJbWVtc2l6ZSAtPSAxMDI0OwoJaWYo bWVtc2l6ZSA8IDIqc2l6ZW9mKEJVRkFSRUEpKQoJCWVycmV4aXQoIkNhbid0IGdldCBtZW1vcnlc biIpOwojZGVmaW5lIFNJR19JR04JKGludCAoKikoKSkxCglpZiAoc2lnbmFsKFNJR0lOVCwgU0lH X0lHTikgIT0gU0lHX0lHTikKCQlzaWduYWwoU0lHSU5ULCBjYXRjaCk7CglpZihhcmdjKSB7CQkv KiBhcmcgbGlzdCBoYXMgZmlsZSBuYW1lcyAqLwoJCXdoaWxlKGFyZ2MtLSA+IDApCgkJCWNoZWNr KCphcmd2KyspOwoJfQoJZWxzZSB7CQkJLyogdXNlIGRlZmF1bHQgY2hlY2tsaXN0ICovCgkJaWYo KGZwID0gZm9wZW4oY2hlY2tsaXN0LCJyIikpID09IE5VTEwpCgkJCWVycmV4aXQoIkNhbid0IG9w ZW4gY2hlY2tsaXN0IGZpbGU6ICVzXG4iLGNoZWNrbGlzdCk7CgkJd2hpbGUoZ2V0bGluZShmcCxm aWxlbmFtZSxzaXplb2YoZmlsZW5hbWUpKSAhPSBFT0YpCgkJCWNoZWNrKGZpbGVuYW1lKTsKCQlm Y2xvc2UoZnApOwoJfQoJZXhpdCgwKTsKfQoKCi8qIFZBUkFSR1MxICovCmVycm9yKHMxLHMyLHMz LHM0KQpjaGFyICpzMTsKewoJcHJpbnRmKHMxLHMyLHMzLHM0KTsKfQoKCi8qIFZBUkFSR1MxICov CmVycmV4aXQoczEsczIsczMsczQpCmNoYXIgKnMxOwp7CgllcnJvcihzMSxzMixzMyxzNCk7Cgll eGl0KDgpOwp9CgoKY2hlY2soZGV2KQpjaGFyICpkZXY7CnsKCXJlZ2lzdGVyIERJTk9ERSAqZHA7 CglyZWdpc3RlciBuOwoJcmVnaXN0ZXIgaW5vX3QgKmJscDsKCWlub190IHNhdmlubzsKCWRhZGRy X3QgYmxrOwoJQlVGQVJFQSAqYnAxLCAqYnAyOwoKCWlmKHNldHVwKGRldikgPT0gTk8pCgkJcmV0 dXJuOwoKCglwcmludGYoIioqIFBoYXNlIDEgLSBDaGVjayBCbG9ja3MgYW5kIFNpemVzXG4iKTsK CXBmdW5jID0gcGFzczE7Cglmb3IoaW51bSA9IDE7IGludW0gPD0gaW1heDsgaW51bSsrKSB7CgkJ aWYoKGRwID0gZ2lub2RlKCkpID09IE5VTEwpCgkJCWNvbnRpbnVlOwoJCWlmKEFMTE9DKSB7CgkJ CWxhc3Rpbm8gPSBpbnVtOwoJCQlpZihmdHlwZW9rKGRwKSA9PSBOTykgewoJCQkJcHJpbnRmKCJV TktOT1dOIEZJTEUgVFlQRSBJPSV1IixpbnVtKTsKCQkJCWlmKHJlcGx5KCJDTEVBUiIpID09IFlF UykgewoJCQkJCXphcGlubyhkcCk7CgkJCQkJaW5vZGlydHkoKTsKCQkJCX0KCQkJCWNvbnRpbnVl OwoJCQl9CgkJCW5fZmlsZXMrKzsKCQkJaWYoc2V0bG5jbnQoZHAtPmRpX25saW5rKSA8PSAwKSB7 CgkJCQlpZihiYWRsbnAgPCAmYmFkbG5jbnRbTUFYTE5DTlRdKQoJCQkJCSpiYWRsbnArKyA9IGlu dW07CgkJCQllbHNlIHsKCQkJCQlwcmludGYoIkxJTksgQ09VTlQgVEFCTEUgT1ZFUkZMT1ciKTsK CQkJCQlpZihyZXBseSgiQ09OVElOVUUiKSA9PSBOTykKCQkJCQkJZXJyZXhpdCgiIik7CgkJCQl9 CgkJCX0KCQkJc2V0c3RhdGUoRElSID8gRFNUQVRFIDogRlNUQVRFKTsKCQkJYmFkYmxrID0gZHVw YmxrID0gMDsKCQkJZmlsc2l6ZSA9IDA7CgkJCW1heGJsayA9IDA7CgkJCWNraW5vZGUoZHAsQURE Uik7CgkJCWlmKChuID0gZ2V0c3RhdGUoKSkgPT0gRFNUQVRFIHx8IG4gPT0gRlNUQVRFKQoJCQkJ c2l6ZWNoayhkcCk7CgkJfQoJCWVsc2UgaWYoZHAtPmRpX21vZGUgIT0gMCkgewoJCQlwcmludGYo IlBBUlRJQUxMWSBBTExPQ0FURUQgSU5PREUgST0ldSIsaW51bSk7CgkJCWlmKHJlcGx5KCJDTEVB UiIpID09IFlFUykgewoJCQkJemFwaW5vKGRwKTsKCQkJCWlub2RpcnR5KCk7CgkJCX0KCQl9Cgl9 CgoKCWlmKGVuZGR1cCAhPSAmZHVwbGlzdFswXSkgewoJCXByaW50ZigiKiogUGhhc2UgMWIgLSBS ZXNjYW4gRm9yIE1vcmUgRFVQU1xuIik7CgkJcGZ1bmMgPSBwYXNzMWI7CgkJZm9yKGludW0gPSAx OyBpbnVtIDw9IGxhc3Rpbm87IGludW0rKykgewoJCQlpZihnZXRzdGF0ZSgpICE9IFVTVEFURSAm JiAoZHAgPSBnaW5vZGUoKSkgIT0gTlVMTCkKCQkJCWlmKGNraW5vZGUoZHAsQUREUikgJiBTVE9Q KQoJCQkJCWJyZWFrOwoJCX0KCX0KCWlmKHJhd2ZsZykgewoJCWlmKGlub2Jsay5iX2RpcnR5KQoJ CQlid3JpdGUoJmRmaWxlLG1lbWJhc2Usc3RhcnRpYiwoaW50KW5pYmxrKkJTSVpFKTsKCQlpbm9i bGsuYl9kaXJ0eSA9IDA7CgkJaWYocG9vbGhlYWQpIHsKCQkJY2xlYXIobWVtYmFzZSxuaWJsaypC U0laRSk7CgkJCWZvcihicDEgPSBwb29saGVhZDticDEtPmJfbmV4dDticDEgPSBicDEtPmJfbmV4 dCk7CgkJCWJwMiA9ICYoKEJVRkFSRUEgKiltZW1iYXNlKVsobmlibGsqQlNJWkUpL3NpemVvZihC VUZBUkVBKV07CgkJCXdoaWxlKC0tYnAyID49IChCVUZBUkVBICopbWVtYmFzZSkgewoJCQkJaW5p dGJhcmVhKGJwMik7CgkJCQlicDItPmJfbmV4dCA9IGJwMS0+Yl9uZXh0OwoJCQkJYnAxLT5iX25l eHQgPSBicDI7CgkJCX0KCQl9CgkJcmF3ZmxnID0gMDsKCgl9CgoKCXByaW50ZigiKiogUGhhc2Ug MiAtIENoZWNrIFBhdGhuYW1lc1xuIik7CglpbnVtID0gUk9PVElOTzsKCXRoaXNuYW1lID0gcGF0 aHAgPSBwYXRobmFtZTsKCXBmdW5jID0gcGFzczI7Cglzd2l0Y2goZ2V0c3RhdGUoKSkgewoJCWNh c2UgVVNUQVRFOgoJCQllcnJleGl0KCJST09UIElOT0RFIFVOQUxMT0NBVEVELiBURVJNSU5BVElO Ry5cbiIpOwoJCWNhc2UgRlNUQVRFOgoJCQlwcmludGYoIlJPT1QgSU5PREUgTk9UIERJUkVDVE9S WSIpOwoJCQlpZihyZXBseSgiRklYIikgPT0gTk8gfHwgKGRwID0gZ2lub2RlKCkpID09IE5VTEwp CgkJCQllcnJleGl0KCIiKTsKCQkJZHAtPmRpX21vZGUgJj0gfklGTVQ7CgkJCWRwLT5kaV9tb2Rl IHw9IElGRElSOwoJCQlpbm9kaXJ0eSgpOwoJCQlzZXRzdGF0ZShEU1RBVEUpOwoJCWNhc2UgRFNU QVRFOgoJCQlkZXNjZW5kKCk7CgkJCWJyZWFrOwoJCWNhc2UgQ0xFQVI6CgkJCXByaW50ZigiRFVQ Uy9CQUQgSU4gUk9PVCBJTk9ERVxuIik7CgkJCWlmKHJlcGx5KCJDT05USU5VRSIpID09IE5PKQoJ CQkJZXJyZXhpdCgiIik7CgkJCXNldHN0YXRlKERTVEFURSk7CgkJCWRlc2NlbmQoKTsKCX0KCgoJ cHJpbnRmKCIqKiBQaGFzZSAzIC0gQ2hlY2sgQ29ubmVjdGl2aXR5XG4iKTsKCWZvcihpbnVtID0g Uk9PVElOTzsgaW51bSA8PSBsYXN0aW5vOyBpbnVtKyspIHsKCQlpZihnZXRzdGF0ZSgpID09IERT VEFURSkgewoJCQlwZnVuYyA9IGZpbmRpbm87CgkJCXNyY2huYW1lID0gIi4uIjsKCQkJc2F2aW5v ID0gaW51bTsKCQkJZG8gewoJCQkJb3JwaGFuID0gaW51bTsKCQkJCWlmKChkcCA9IGdpbm9kZSgp KSA9PSBOVUxMKQoJCQkJCWJyZWFrOwoJCQkJZmlsc2l6ZSA9IGRwLT5kaV9zaXplOwoJCQkJcGFy ZW50ZGlyID0gMDsKCQkJCWNraW5vZGUoZHAsREFUQSk7CgkJCQlpZigoaW51bSA9IHBhcmVudGRp cikgPT0gMCkKCQkJCQlicmVhazsKCQkJfSB3aGlsZShnZXRzdGF0ZSgpID09IERTVEFURSk7CgkJ CWludW0gPSBvcnBoYW47CgkJCWlmKGxpbmt1cCgpID09IFlFUykgewoJCQkJdGhpc25hbWUgPSBw YXRocCA9IHBhdGhuYW1lOwoJCQkJKnBhdGhwKysgPSAnPyc7CgkJCQlwZnVuYyA9IHBhc3MyOwoJ CQkJZGVzY2VuZCgpOwoJCQl9CgkJCWludW0gPSBzYXZpbm87CgkJfQoJfQoKCglwcmludGYoIioq IFBoYXNlIDQgLSBDaGVjayBSZWZlcmVuY2UgQ291bnRzXG4iKTsKCXBmdW5jID0gcGFzczQ7Cglm b3IoaW51bSA9IFJPT1RJTk87IGludW0gPD0gbGFzdGlubzsgaW51bSsrKSB7CgkJc3dpdGNoKGdl dHN0YXRlKCkpIHsKCQkJY2FzZSBGU1RBVEU6CgkJCQlpZihuID0gZ2V0bG5jbnQoKSkKCQkJCQlh ZGp1c3QoKHNob3J0KW4pOwoJCQkJZWxzZSB7CgkJCQkJZm9yKGJscCA9IGJhZGxuY250O2JscCA8 IGJhZGxucDsgYmxwKyspCgkJCQkJCWlmKCpibHAgPT0gaW51bSkgewoJCQkJCQkJY2xyaSgiVU5S RUYiLFlFUyk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2Ug RFNUQVRFOgoJCQkJY2xyaSgiVU5SRUYiLFlFUyk7CgkJCQlicmVhazsKCQkJY2FzZSBDTEVBUjoK CQkJCWNscmkoIkJBRC9EVVAiLFlFUyk7CgkJfQoJfQojaWZuZGVmIGludGVyZGF0YQoJaWYoaW1h eCAtIG5fZmlsZXMgIT0gc3VwZXJibGsuc190aW5vZGUpIHsKCQlwcmludGYoIkZSRUUgSU5PREUg Q09VTlQgV1JPTkcgSU4gU1VQRVJCTEsiKTsKCQlpZihyZXBseSgiRklYIikgPT0gWUVTKSB7CgkJ CXN1cGVyYmxrLnNfdGlub2RlID0gaW1heCAtIG5fZmlsZXM7CgkJCXNiZGlydHkoKTsKCQl9Cgl9 CiNlbmRpZgoJZmx1c2goJmRmaWxlLCZmaWxlYmxrKTsKCgoJcHJpbnRmKCIqKiBQaGFzZSA1IC0g Q2hlY2sgRnJlZSBMaXN0ICIpOwoJaWYoc2ZsYWcgfHwgKGNzZmxhZyAmJiBycGx5ZmxhZyA9PSAw KSkgewoJCXByaW50ZigiKElnbm9yZWQpXG4iKTsKCQlmaXhmcmVlID0gMTsKCX0KCWVsc2UgewoJ CXByaW50ZigiXG4iKTsKCQlpZihmcmVlbWFwKQoJCQljb3B5KGJsa21hcCxmcmVlbWFwLChNRU1T SVpFKWJtYXBzeik7CgkJZWxzZSB7CgkJCWZvcihibGsgPSAwOyBibGsgPCBmbWFwYmxrOyBibGsr KykgewoJCQkJYnAxID0gZ2V0YmxrKChCVUZBUkVBICopTlVMTCxibGspOwoJCQkJYnAyID0gZ2V0 YmxrKChCVUZBUkVBICopTlVMTCxibGsrZm1hcGJsayk7CgkJCQljb3B5KGJwMS0+Yl91bi5iX2J1 ZixicDItPmJfdW4uYl9idWYsQlNJWkUpOwoJCQkJZGlydHkoYnAyKTsKCQkJfQoJCX0KCQliYWRi bGsgPSBkdXBibGsgPSAwOwoJCWZyZWVibGsuZGZfbmZyZWUgPSBzdXBlcmJsay5zX25mcmVlOwoJ CWZvcihuID0gMDsgbiA8IE5JQ0ZSRUU7IG4rKykKCQkJZnJlZWJsay5kZl9mcmVlW25dID0gc3Vw ZXJibGsuc19mcmVlW25dOwoJCWZyZWVjaGsoKTsKCQlpZihiYWRibGspCgkJCXByaW50ZigiJWQg QkFEIEJMS1MgSU4gRlJFRSBMSVNUXG4iLGJhZGJsayk7CgkJaWYoZHVwYmxrKQoJCQlwcmludGYo IiVkIERVUCBCTEtTIElOIEZSRUUgTElTVFxuIixkdXBibGspOwoJCWlmKGZpeGZyZWUgPT0gMCkg ewoJCQlpZigobl9ibGtzK25fZnJlZSkgIT0gKGZtYXgtZm1pbikpIHsKCQkJCXByaW50ZigiJWxk IEJMSyhTKSBNSVNTSU5HXG4iLAoJCQkJCWZtYXgtZm1pbi1uX2Jsa3Mtbl9mcmVlKTsKCQkJCWZp eGZyZWUgPSAxOwoJCQl9CgkJCWVsc2UgaWYobl9mcmVlICE9IHN1cGVyYmxrLnNfdGZyZWUpIHsK I2lmbmRlZiBpbnRlcmRhdGEKCQkJCXByaW50ZigiRlJFRSBCTEsgQ09VTlQgV1JPTkcgSU4gU1VQ RVJCTEsiKTsKCQkJCWlmKHJlcGx5KCJGSVgiKSA9PSBZRVMpIHsKCQkJCQlzdXBlcmJsay5zX3Rm cmVlID0gbl9mcmVlOwoJCQkJCXNiZGlydHkoKTsKCQkJCX0KI2VuZGlmCgkJCX0KCQl9CgkJaWYo Zml4ZnJlZSkgewoJCQlwcmludGYoIkJBRCBGUkVFIExJU1QiKTsKCQkJaWYocmVwbHkoIlNBTFZB R0UiKSA9PSBOTykKCQkJCWZpeGZyZWUgPSAwOwoJCX0KCX0KCgoJaWYoZml4ZnJlZSkgewoJCXBy aW50ZigiKiogUGhhc2UgNiAtIFNhbHZhZ2UgRnJlZSBMaXN0XG4iKTsKCQltYWtlZnJlZSgpOwoJ CW5fZnJlZSA9IHN1cGVyYmxrLnNfdGZyZWU7Cgl9CgoKCXByaW50ZigiJWxkIGZpbGVzICVsZCBi bG9ja3MgJWxkIGZyZWVcbiIsCgkJbl9maWxlcyxuX2Jsa3Msbl9mcmVlKTsKCWlmKGRmaWxlLm1v ZCkgewoJCXRpbWUoJnN1cGVyYmxrLnNfdGltZSk7CgkJc2JkaXJ0eSgpOwoJfQoJY2tmaW5pKCk7 CglzeW5jKCk7CglpZihkZmlsZS5tb2QgJiYgaG90cm9vdCkgewoJCXByaW50ZigiXG4qKioqKiBC T09UIFVOSVggKE5PIFNZTkMhKSAqKioqKlxuIik7CgkJZm9yKDs7KTsKCX0KCWlmKGRmaWxlLm1v ZCkKCQlwcmludGYoIlxuKioqKiogRklMRSBTWVNURU0gV0FTIE1PRElGSUVEICoqKioqXG4iKTsK fQoKCmNraW5vZGUoZHAsZmxnKQpESU5PREUgKmRwOwpyZWdpc3RlciBmbGc7CnsKCXJlZ2lzdGVy IGRhZGRyX3QgKmFwOwoJcmVnaXN0ZXIgcmV0OwoJaW50ICgqZnVuYykoKSwgbjsKCWRhZGRyX3QJ aWFkZHJzW05BRERSXTsKCglpZihTUEVDSUFMKQoJCXJldHVybihLRUVQT04pOwoJbDN0b2woaWFk ZHJzLGRwLT5kaV9hZGRyLE5BRERSKTsKCWZ1bmMgPSAoZmxnID09IEFERFIpID8gcGZ1bmMgOiBk aXJzY2FuOwoJZm9yKGFwID0gaWFkZHJzOyBhcCA8ICZpYWRkcnNbTkFERFItM107IGFwKyspIHsK CQlpZigqYXAgJiYgKHJldCA9ICgqZnVuYykoKmFwKSkgJiBTVE9QKQoJCQlyZXR1cm4ocmV0KTsK CX0KCWZvcihuID0gMTsgbiA8IDQ7IG4rKykgewoJCWlmKCphcCAmJiAocmV0ID0gaWJsb2NrKCph cCxuLGZsZykpICYgU1RPUCkKCQkJcmV0dXJuKHJldCk7CgkJYXArKzsKCX0KCXJldHVybihLRUVQ T04pOwp9CgoKaWJsb2NrKGJsayxpbGV2ZWwsZmxnKQpkYWRkcl90IGJsazsKcmVnaXN0ZXIgaWxl dmVsOwp7CglyZWdpc3RlciBkYWRkcl90ICphcDsKCXJlZ2lzdGVyIG47CglpbnQgKCpmdW5jKSgp OwoJQlVGQVJFQSBpYjsKCglpZihmbGcgPT0gQUREUikgewoJCWZ1bmMgPSBwZnVuYzsKCQlpZigo KG4gPSAoKmZ1bmMpKGJsaykpICYgS0VFUE9OKSA9PSAwKQoJCQlyZXR1cm4obik7Cgl9CgllbHNl CgkJZnVuYyA9IGRpcnNjYW47CglpZihvdXRyYW5nZShibGspKQkJLyogcHJvdGVjdCB0aHlzZWxm ICovCgkJcmV0dXJuKFNLSVApOwoJaW5pdGJhcmVhKCZpYik7CglpZihnZXRibGsoJmliLGJsaykg PT0gTlVMTCkKCQlyZXR1cm4oU0tJUCk7CglpbGV2ZWwtLTsKCWZvcihhcCA9IGliLmJfdW4uYl9p bmRpcjsgYXAgPCAmaWIuYl91bi5iX2luZGlyW05JTkRJUl07IGFwKyspIHsKCQlpZigqYXApIHsK CQkJaWYoaWxldmVsID4gMCkgewoJCQkJbiA9IGlibG9jaygqYXAsaWxldmVsLGZsZyk7CgkJCX0K CQkJZWxzZQoJCQkJbiA9ICgqZnVuYykoKmFwKTsKCQkJaWYobiAmIFNUT1ApCgkJCQlyZXR1cm4o bik7CgkJfQoJfQoJcmV0dXJuKEtFRVBPTik7Cn0KCgpwYXNzMShibGspCmRhZGRyX3QgYmxrOwp7 CglyZWdpc3RlciBkYWRkcl90ICpkbHA7CgoJaWYob3V0cmFuZ2UoYmxrKSkgewoJCWJsa2Vycigi QkFEIixibGspOwoJCWlmKCsrYmFkYmxrID49IE1BWEJBRCkgewoJCQlwcmludGYoIkVYQ0VTU0lW RSBCQUQgQkxLUyBJPSV1IixpbnVtKTsKCQkJaWYocmVwbHkoIkNPTlRJTlVFIikgPT0gTk8pCgkJ CQllcnJleGl0KCIiKTsKCQkJcmV0dXJuKFNUT1ApOwoJCX0KCQlyZXR1cm4oU0tJUCk7Cgl9Cglp ZihnZXRibWFwKGJsaykpIHsKCQlibGtlcnIoIkRVUCIsYmxrKTsKCQlpZigrK2R1cGJsayA+PSBN QVhEVVApIHsKCQkJcHJpbnRmKCJFWENFU1NJVkUgRFVQIEJMS1MgST0ldSIsaW51bSk7CgkJCWlm KHJlcGx5KCJDT05USU5VRSIpID09IE5PKQoJCQkJZXJyZXhpdCgiIik7CgkJCXJldHVybihTVE9Q KTsKCQl9CgkJaWYoZW5kZHVwID49ICZkdXBsaXN0W0RVUFRCTFNJWkVdKSB7CgkJCXByaW50Zigi RFVQIFRBQkxFIE9WRVJGTE9XLiIpOwoJCQlpZihyZXBseSgiQ09OVElOVUUiKSA9PSBOTykKCQkJ CWVycmV4aXQoIiIpOwoJCQlyZXR1cm4oU1RPUCk7CgkJfQoJCWZvcihkbHAgPSBkdXBsaXN0OyBk bHAgPCBtdWxkdXA7IGRscCsrKSB7CgkJCWlmKCpkbHAgPT0gYmxrKSB7CgkJCQkqZW5kZHVwKysg PSBibGs7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZihkbHAgPj0gbXVsZHVwKSB7CgkJCSplbmRk dXArKyA9ICptdWxkdXA7CgkJCSptdWxkdXArKyA9IGJsazsKCQl9Cgl9CgllbHNlIHsKCQluX2Js a3MrKzsKCQlzZXRibWFwKGJsayk7Cgl9CglmaWxzaXplKys7CglyZXR1cm4oS0VFUE9OKTsKfQoK CnBhc3MxYihibGspCmRhZGRyX3QgYmxrOwp7CglyZWdpc3RlciBkYWRkcl90ICpkbHA7CgoJaWYo b3V0cmFuZ2UoYmxrKSkKCQlyZXR1cm4oU0tJUCk7Cglmb3IoZGxwID0gZHVwbGlzdDsgZGxwIDwg bXVsZHVwOyBkbHArKykgewoJCWlmKCpkbHAgPT0gYmxrKSB7CgkJCWJsa2VycigiRFVQIixibGsp OwoJCQkqZGxwID0gKi0tbXVsZHVwOwoJCQkqbXVsZHVwID0gYmxrOwoJCQlyZXR1cm4obXVsZHVw ID09IGR1cGxpc3QgPyBTVE9QIDogS0VFUE9OKTsKCQl9Cgl9CglyZXR1cm4oS0VFUE9OKTsKfQoK CnBhc3MyKGRpcnApCnJlZ2lzdGVyIERJUkVDVCAqZGlycDsKewoJcmVnaXN0ZXIgY2hhciAqcDsK CXJlZ2lzdGVyIG47CglESU5PREUgKmRwOwoKCWlmKChpbnVtID0gZGlycC0+ZF9pbm8pID09IDAp CgkJcmV0dXJuKEtFRVBPTik7Cgl0aGlzbmFtZSA9IHBhdGhwOwoJZm9yKHAgPSBkaXJwLT5kX25h bWU7IHAgPCAmZGlycC0+ZF9uYW1lW0RJUlNJWl07ICkKCQlpZigoKnBhdGhwKysgPSAqcCsrKSA9 PSAwKSB7CgkJCS0tcGF0aHA7CgkJCWJyZWFrOwoJCX0KCSpwYXRocCA9IDA7CgluID0gTk87Cglp ZihpbnVtID4gaW1heCB8fCBpbnVtIDwgUk9PVElOTykKCQluID0gZGlyZXJyKCJJIE9VVCBPRiBS QU5HRSIpOwoJZWxzZSB7CglhZ2FpbjoKCQlzd2l0Y2goZ2V0c3RhdGUoKSkgewoJCQljYXNlIFVT VEFURToKCQkJCW4gPSBkaXJlcnIoIlVOQUxMT0NBVEVEIik7CgkJCQlicmVhazsKCQkJY2FzZSBD TEVBUjoKCQkJCWlmKChuID0gZGlyZXJyKCJEVVAvQkFEIikpID09IFlFUykKCQkJCQlicmVhazsK CQkJCWlmKChkcCA9IGdpbm9kZSgpKSA9PSBOVUxMKQoJCQkJCWJyZWFrOwoJCQkJc2V0c3RhdGUo RElSID8gRFNUQVRFIDogRlNUQVRFKTsKCQkJCWdvdG8gYWdhaW47CgkJCWNhc2UgRlNUQVRFOgoJ CQkJZGVjbG5jbnQoKTsKCQkJCWJyZWFrOwoJCQljYXNlIERTVEFURToKCQkJCWRlY2xuY250KCk7 CgkJCQlkZXNjZW5kKCk7CgkJfQoJfQoJcGF0aHAgPSB0aGlzbmFtZTsKCWlmKG4gPT0gTk8pCgkJ cmV0dXJuKEtFRVBPTik7CglkaXJwLT5kX2lubyA9IDA7CglyZXR1cm4oS0VFUE9OfEFMVEVSRCk7 Cn0KCgpwYXNzNChibGspCmRhZGRyX3QgYmxrOwp7CglyZWdpc3RlciBkYWRkcl90ICpkbHA7CgoJ aWYob3V0cmFuZ2UoYmxrKSkKCQlyZXR1cm4oU0tJUCk7CglpZihnZXRibWFwKGJsaykpIHsKCQlm b3IoZGxwID0gZHVwbGlzdDsgZGxwIDwgZW5kZHVwOyBkbHArKykKCQkJaWYoKmRscCA9PSBibGsp IHsKCQkJCSpkbHAgPSAqLS1lbmRkdXA7CgkJCQlyZXR1cm4oS0VFUE9OKTsKCQkJfQoJCWNscmJt YXAoYmxrKTsKCQluX2Jsa3MtLTsKCX0KCXJldHVybihLRUVQT04pOwp9CgoKcGFzczUoYmxrKQpk YWRkcl90IGJsazsKewoJaWYob3V0cmFuZ2UoYmxrKSkgewoJCWZpeGZyZWUgPSAxOwoJCWlmKCsr YmFkYmxrID49IE1BWEJBRCkgewoJCQlwcmludGYoIkVYQ0VTU0lWRSBCQUQgQkxLUyBJTiBGUkVF IExJU1QuIik7CgkJCWlmKHJlcGx5KCJDT05USU5VRSIpID09IE5PKQoJCQkJZXJyZXhpdCgiIik7 CgkJCXJldHVybihTVE9QKTsKCQl9CgkJcmV0dXJuKFNLSVApOwoJfQoJaWYoZ2V0Zm1hcChibGsp KSB7CgkJZml4ZnJlZSA9IDE7CgkJaWYoKytkdXBibGsgPj0gRFVQVEJMU0laRSkgewoJCQlwcmlu dGYoIkVYQ0VTU0lWRSBEVVAgQkxLUyBJTiBGUkVFIExJU1QuIik7CgkJCWlmKHJlcGx5KCJDT05U SU5VRSIpID09IE5PKQoJCQkJZXJyZXhpdCgiIik7CgkJCXJldHVybihTVE9QKTsKCQl9Cgl9Cgll bHNlIHsKCQluX2ZyZWUrKzsKCQlzZXRmbWFwKGJsayk7Cgl9CglyZXR1cm4oS0VFUE9OKTsKfQoK CmJsa2VycihzLGJsaykKZGFkZHJfdCBibGs7CmNoYXIgKnM7CnsKCXByaW50ZigiJWxkICVzIEk9 JXVcbiIsYmxrLHMsaW51bSk7CglzZXRzdGF0ZShDTEVBUik7CS8qIG1hcmsgZm9yIHBvc3NpYmxl IGNsZWFyaW5nICovCn0KCgpkZXNjZW5kKCkKewoJcmVnaXN0ZXIgRElOT0RFICpkcDsKCXJlZ2lz dGVyIGNoYXIgKnNhdm5hbWU7CglvZmZfdCBzYXZzaXplOwoKCXNldHN0YXRlKEZTVEFURSk7Cglp ZigoZHAgPSBnaW5vZGUoKSkgPT0gTlVMTCkKCQlyZXR1cm47CglzYXZuYW1lID0gdGhpc25hbWU7 CgkqcGF0aHArKyA9ICcvJzsKCXNhdnNpemUgPSBmaWxzaXplOwoJZmlsc2l6ZSA9IGRwLT5kaV9z aXplOwoJY2tpbm9kZShkcCxEQVRBKTsKCXRoaXNuYW1lID0gc2F2bmFtZTsKCSotLXBhdGhwID0g MDsKCWZpbHNpemUgPSBzYXZzaXplOwp9CgoKZGlyc2NhbihibGspCmRhZGRyX3QgYmxrOwp7Cgly ZWdpc3RlciBESVJFQ1QgKmRpcnA7CglyZWdpc3RlciBjaGFyICpwMSwgKnAyOwoJcmVnaXN0ZXIg bjsKCURJUkVDVCBkaXJlbnRyeTsKCglpZihvdXRyYW5nZShibGspKSB7CgkJZmlsc2l6ZSAtPSBC U0laRTsKCQlyZXR1cm4oU0tJUCk7Cgl9Cglmb3IoZGlycCA9IGRpcmJsay5iX2RpcjsgZGlycCA8 ICZkaXJibGsuYl9kaXJbTkRJUkVDVF0gJiYKCQlmaWxzaXplID4gMDsgZGlycCsrLCBmaWxzaXpl IC09IHNpemVvZihESVJFQ1QpKSB7CgkJaWYoZ2V0YmxrKCZmaWxlYmxrLGJsaykgPT0gTlVMTCkg ewoJCQlmaWxzaXplIC09ICgmZGlyYmxrLmJfZGlyW05ESVJFQ1RdLWRpcnApKnNpemVvZihESVJF Q1QpOwoJCQlyZXR1cm4oU0tJUCk7CgkJfQoJCXAxID0gJmRpcnAtPmRfbmFtZVtESVJTSVpdOwoJ CXAyID0gJmRpcmVudHJ5LmRfbmFtZVtESVJTSVpdOwoJCXdoaWxlKHAxID4gKGNoYXIgKilkaXJw KQoJCQkqLS1wMiA9ICotLXAxOwoJCWlmKChuID0gKCpwZnVuYykoJmRpcmVudHJ5KSkgJiBBTFRF UkQpIHsKCQkJaWYoZ2V0YmxrKCZmaWxlYmxrLGJsaykgIT0gTlVMTCkgewoJCQkJcDEgPSAmZGly cC0+ZF9uYW1lW0RJUlNJWl07CgkJCQlwMiA9ICZkaXJlbnRyeS5kX25hbWVbRElSU0laXTsKCQkJ CXdoaWxlKHAxID4gKGNoYXIgKilkaXJwKQoJCQkJCSotLXAxID0gKi0tcDI7CgkJCQlmYmRpcnR5 KCk7CgkJCX0KCQkJZWxzZQoJCQkJbiAmPSB+QUxURVJEOwoJCX0KCQlpZihuICYgU1RPUCkKCQkJ cmV0dXJuKG4pOwoJfQoJcmV0dXJuKGZpbHNpemUgPiAwID8gS0VFUE9OIDogU1RPUCk7Cn0KCgpk aXJlcnIocykKY2hhciAqczsKewoJcmVnaXN0ZXIgRElOT0RFICpkcDsKCglwcmludGYoIiVzICIs cyk7CglwaW5vZGUoKTsKCWlmKChkcCA9IGdpbm9kZSgpKSAhPSBOVUxMICYmIGZ0eXBlb2soZHAp KQoJCXByaW50ZigiXG4lcz0lcyIsRElSPyJESVIiOiJGSUxFIixwYXRobmFtZSk7CgllbHNlCgkJ cHJpbnRmKCJcbk5BTUU9JXMiLHBhdGhuYW1lKTsKCXJldHVybihyZXBseSgiUkVNT1ZFIikpOwp9 CgoKYWRqdXN0KGxjbnQpCnJlZ2lzdGVyIHNob3J0IGxjbnQ7CnsKCXJlZ2lzdGVyIERJTk9ERSAq ZHA7CgoJaWYoKGRwID0gZ2lub2RlKCkpID09IE5VTEwpCgkJcmV0dXJuOwoJaWYoZHAtPmRpX25s aW5rID09IGxjbnQpIHsKCQlpZihsaW5rdXAoKSA9PSBOTykKCQkJY2xyaSgiVU5SRUYiLE5PKTsK CX0KCWVsc2UgewoJCXByaW50ZigiTElOSyBDT1VOVCAlcyIsCgkJCShsZmRpcj09aW51bSk/bGZu YW1lOihESVI/IkRJUiI6IkZJTEUiKSk7CgkJcGlub2RlKCk7CgkJcHJpbnRmKCIgQ09VTlQgJWQg U0hPVUxEIEJFICVkIiwKCQkJZHAtPmRpX25saW5rLGRwLT5kaV9ubGluay1sY250KTsKCQlpZihy ZXBseSgiQURKVVNUIikgPT0gWUVTKSB7CgkJCWRwLT5kaV9ubGluayAtPSBsY250OwoJCQlpbm9k aXJ0eSgpOwoJCX0KCX0KfQoKCmNscmkocyxmbGcpCmNoYXIgKnM7CnsKCXJlZ2lzdGVyIERJTk9E RSAqZHA7CgoJaWYoKGRwID0gZ2lub2RlKCkpID09IE5VTEwpCgkJcmV0dXJuOwoJaWYoZmxnID09 IFlFUykgewoJCXByaW50ZigiJXMgJXMiLHMsRElSPyJESVIiOiJGSUxFIik7CgkJcGlub2RlKCk7 Cgl9CglpZihyZXBseSgiQ0xFQVIiKSA9PSBZRVMpIHsKCQluX2ZpbGVzLS07CgkJcGZ1bmMgPSBw YXNzNDsKCQlja2lub2RlKGRwLEFERFIpOwoJCXphcGlubyhkcCk7CgkJaW5vZGlydHkoKTsKCX0K fQoKCnNldHVwKGRldikKY2hhciAqZGV2Owp7CglyZWdpc3RlciBuOwoJcmVnaXN0ZXIgQlVGQVJF QSAqYnA7CglyZWdpc3RlciBNRU1TSVpFIG1zaXplOwoJY2hhciAqbWJhc2U7CglkYWRkcl90IGJj bnQsIG5zY3JibGs7CglkZXZfdCByb290ZGV2OwoJb2ZmX3Qgc21hcHN6LCBsbmNudHN6LCB0b3Rz ejsKCXN0cnVjdCB7CgkJZGFkZHJfdAl0ZnJlZTsKCQlpbm9fdAl0aW5vZGU7CgkJY2hhcglmbmFt ZVs2XTsKCQljaGFyCWZwYWNrWzZdOwoJfSB1c3RhdGFyZWE7CglzdHJ1Y3Qgc3RhdCBzdGF0YXJl YTsKCglpZihzdGF0KCIvIiwmc3RhdGFyZWEpIDwgMCkKCQllcnJleGl0KCJDYW4ndCBzdGF0IHJv b3RcbiIpOwoJcm9vdGRldiA9IHN0YXRhcmVhLnN0X2RldjsKCWlmKHN0YXQoZGV2LCZzdGF0YXJl YSkgPCAwKSB7CgkJZXJyb3IoIkNhbid0IHN0YXQgJXNcbiIsZGV2KTsKCQlyZXR1cm4oTk8pOwoJ fQoJaG90cm9vdCA9IDA7CglyYXdmbGcgPSAwOwoJaWYoKHN0YXRhcmVhLnN0X21vZGUgJiBTX0lG TVQpID09IFNfSUZCTEspIHsKCQlpZih1c3RhdChzdGF0YXJlYS5zdF9yZGV2LCAoY2hhciAqKSZ1 c3RhdGFyZWEpID49IDApIHsKCQkJaG90cm9vdCsrOwoJCX0KCX0KCWVsc2UgaWYoKHN0YXRhcmVh LnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZDSFIpCgkJcmF3ZmxnKys7CgllbHNlIHsKCQlpZiAo cmVwbHkoImZpbGUgaXMgbm90IGEgYmxvY2sgb3IgY2hhcmFjdGVyIGRldmljZTsgT0siKSA9PSBO TykKCQkJcmV0dXJuKE5PKTsKCX0KCWlmKHJvb3RkZXYgPT0gc3RhdGFyZWEuc3RfcmRldikKCQlo b3Ryb290Kys7CglpZigoZGZpbGUucmZkZXMgPSBvcGVuKGRldiwwKSkgPCAwKSB7CgkJZXJyb3Io IkNhbid0IG9wZW4gJXNcbiIsZGV2KTsKCQlyZXR1cm4oTk8pOwoJfQoJcHJpbnRmKCJcbiVzIixk ZXYpOwoJaWYobmZsYWcgfHwgKGRmaWxlLndmZGVzID0gb3BlbihkZXYsMSkpIDwgMCkgewoJCWRm aWxlLndmZGVzID0gLTE7CgkJcHJpbnRmKCIgKE5PIFdSSVRFKSIpOwoJfQoJcHJpbnRmKCJcbiIp OwoJZml4ZnJlZSA9IDA7CglkZmlsZS5tb2QgPSAwOwoJbl9maWxlcyA9IG5fYmxrcyA9IG5fZnJl ZSA9IDA7CgltdWxkdXAgPSBlbmRkdXAgPSAmZHVwbGlzdFswXTsKCWJhZGxucCA9ICZiYWRsbmNu dFswXTsKCWxmZGlyID0gMDsKCXJwbHlmbGFnID0gMDsKCWluaXRiYXJlYSgmc2Jsayk7Cglpbml0 YmFyZWEoJmZpbGVibGspOwoJaW5pdGJhcmVhKCZpbm9ibGspOwoJc2ZpbGUud2ZkZXMgPSBzZmls ZS5yZmRlcyA9IC0xOwoJcm1zY3IgPSAwOwoJaWYoZ2V0YmxrKCZzYmxrLFNVUEVSQikgPT0gTlVM TCkgewoJCWNrZmluaSgpOwoJCXJldHVybihOTyk7Cgl9CglpbWF4ID0gKChpbm9fdClzdXBlcmJs ay5zX2lzaXplIC0gKFNVUEVSQisxKSkgKiBJTk9QQjsKCWZtaW4gPSAoZGFkZHJfdClzdXBlcmJs ay5zX2lzaXplOwkvKiBmaXJzdCBkYXRhIGJsayBudW0gKi8KCWZtYXggPSBzdXBlcmJsay5zX2Zz aXplOwkJLyogZmlyc3QgaW52YWxpZCBibGsgbnVtICovCglpZihmbWluID49IGZtYXggfHwgCgkJ KGltYXgvSU5PUEIpICE9ICgoaW5vX3Qpc3VwZXJibGsuc19pc2l6ZS0oU1VQRVJCKzEpKSkgewoJ CWVycm9yKCJTaXplIGNoZWNrOiBmc2l6ZSAlbGQgaXNpemUgJWRcbiIsCgkJCXN1cGVyYmxrLnNf ZnNpemUsc3VwZXJibGsuc19pc2l6ZSk7CgkJY2tmaW5pKCk7CgkJcmV0dXJuKE5PKTsKCX0KCXBy aW50ZigiRmlsZSBTeXN0ZW06ICUuNnMgVm9sdW1lOiAlLjZzXG5cbiIsIHN1cGVyYmxrLnNfZm5h bWUsCgkJc3VwZXJibGsuc19mcGFjayk7CglibWFwc3ogPSByb3VuZHVwKGhvd21hbnkoZm1heCxC SVRTUEIpLHNpemVvZigqbG5jbnRwKSk7CglzbWFwc3ogPSByb3VuZHVwKGhvd21hbnkoKGxvbmcp KGltYXgrMSksU1RBVEVQQiksc2l6ZW9mKCpsbmNudHApKTsKCWxuY250c3ogPSAobG9uZykoaW1h eCsxKSAqIHNpemVvZigqbG5jbnRwKTsKCWlmKGJtYXBzeiA+IHNtYXBzeitsbmNudHN6KQoJCXNt YXBzeiA9IGJtYXBzei1sbmNudHN6OwoJdG90c3ogPSBibWFwc3orc21hcHN6K2xuY250c3o7Cglt c2l6ZSA9IG1lbXNpemU7CgltYmFzZSA9IG1lbWJhc2U7CglpZihyYXdmbGcpIHsKCQlpZihtc2l6 ZSA8IChNRU1TSVpFKShOSU5PQkxLKkJTSVpFKSArIDIqc2l6ZW9mKEJVRkFSRUEpKQoJCQlyYXdm bGcgPSAwOwoJCWVsc2UgewoJCQltc2l6ZSAtPSAoTUVNU0laRSlOSU5PQkxLKkJTSVpFOwoJCQlt YmFzZSArPSAoTUVNU0laRSlOSU5PQkxLKkJTSVpFOwoJCQluaWJsayA9IE5JTk9CTEs7CgkJCXN0 YXJ0aWIgPSBmbWF4OwoJCX0KCX0KCWNsZWFyKG1iYXNlLG1zaXplKTsKCWlmKChvZmZfdCltc2l6 ZSA8IHRvdHN6KSB7CgkJYm1hcHN6ID0gcm91bmR1cChibWFwc3osQlNJWkUpOwoJCXNtYXBzeiA9 IHJvdW5kdXAoc21hcHN6LEJTSVpFKTsKCQlsbmNudHN6ID0gcm91bmR1cChsbmNudHN6LEJTSVpF KTsKCQluc2NyYmxrID0gKGJtYXBzeitzbWFwc3orbG5jbnRzeik+PkJTSElGVDsKCQlpZih0Zmxh ZyA9PSAwKSB7CgkJCXByaW50ZigiXG5ORUVEIFNDUkFUQ0ggRklMRSAoJWxkIEJMS1MpXG4iLG5z Y3JibGspOwoJCQlkbyB7CgkJCQlwcmludGYoIkVOVEVSIEZJTEVOQU1FOiAgIik7CgkJCQlpZigo biA9IGdldGxpbmUoc3RkaW4sc2NyZmlsZSxzaXplb2Yoc2NyZmlsZSkpKSA9PSBFT0YpCgkJCQkJ ZXJyZXhpdCgiXG4iKTsKCQkJfSB3aGlsZShuID09IDApOwoJCX0KCQlpZihzdGF0KHNjcmZpbGUs JnN0YXRhcmVhKSA8IDAgfHwKCQkJKHN0YXRhcmVhLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZS RUcpCgkJCXJtc2NyKys7CgkJaWYoKHNmaWxlLndmZGVzID0gY3JlYXQoc2NyZmlsZSwwNjY2KSkg PCAwIHx8CgkJCShzZmlsZS5yZmRlcyA9IG9wZW4oc2NyZmlsZSwwKSkgPCAwKSB7CgkJCWVycm9y KCJDYW4ndCBjcmVhdGUgJXNcbiIsc2NyZmlsZSk7CgkJCWNrZmluaSgpOwoJCQlyZXR1cm4oTk8p OwoJCX0KCQlicCA9ICYoKEJVRkFSRUEgKiltYmFzZSlbKG1zaXplL3NpemVvZihCVUZBUkVBKSld OwoJCXBvb2xoZWFkID0gTlVMTDsKCQl3aGlsZSgtLWJwID49IChCVUZBUkVBICopbWJhc2UpIHsK CQkJaW5pdGJhcmVhKGJwKTsKCQkJYnAtPmJfbmV4dCA9IHBvb2xoZWFkOwoJCQlwb29saGVhZCA9 IGJwOwoJCX0KCQlicCA9IHBvb2xoZWFkOwoJCWZvcihiY250ID0gMDsgYmNudCA8IG5zY3JibGs7 IGJjbnQrKykgewoJCQlicC0+Yl9ibm8gPSBiY250OwoJCQlkaXJ0eShicCk7CgkJCWZsdXNoKCZz ZmlsZSxicCk7CgkJfQoJCWJsa21hcCA9IGZyZWVtYXAgPSBzdGF0ZW1hcCA9IChjaGFyICopIE5V TEw7CgkJbG5jbnRwID0gKHNob3J0ICopIE5VTEw7CgkJc21hcGJsayA9IGJtYXBzeiAvIEJTSVpF OwoJCWxuY250YmxrID0gc21hcGJsayArIHNtYXBzeiAvIEJTSVpFOwoJCWZtYXBibGsgPSBzbWFw YmxrOwoJfQoJZWxzZSB7CgkJaWYocmF3ZmxnICYmIChvZmZfdCltc2l6ZSA+IHRvdHN6K0JTSVpF KSB7CgkJCW5pYmxrICs9ICh1bnNpZ25lZCkoKG9mZl90KW1zaXplLXRvdHN6KT4+QlNISUZUOwoJ CQlpZihuaWJsayA+IE1BWFJBVykKCQkJCW5pYmxrID0gTUFYUkFXOwoJCQltc2l6ZSA9IG1lbXNp emUgLSAobmlibGsqQlNJWkUpOwoJCQltYmFzZSA9IG1lbWJhc2UgKyAobmlibGsqQlNJWkUpOwoJ CX0KCQlwb29saGVhZCA9IE5VTEw7CgkJYmxrbWFwID0gbWJhc2U7CgkJc3RhdGVtYXAgPSAmbWJh c2VbKE1FTVNJWkUpYm1hcHN6XTsKCQlmcmVlbWFwID0gc3RhdGVtYXA7CgkJbG5jbnRwID0gKHNo b3J0ICopJnN0YXRlbWFwWyhNRU1TSVpFKXNtYXBzel07Cgl9CglyZXR1cm4oWUVTKTsKfQoKCkRJ Tk9ERSAqCmdpbm9kZSgpCnsKCXJlZ2lzdGVyIERJTk9ERSAqZHA7CglyZWdpc3RlciBjaGFyICpt YmFzZTsKCWRhZGRyX3QgaWJsazsKCglpZihpbnVtID4gaW1heCkKCQlyZXR1cm4oTlVMTCk7Cglp YmxrID0gaXRvZChpbnVtKTsKCWlmKHJhd2ZsZykgewoJCW1iYXNlID0gbWVtYmFzZTsKCQlpZihp YmxrIDwgc3RhcnRpYiB8fCBpYmxrID49IHN0YXJ0aWIrbmlibGspIHsKCQkJaWYoaW5vYmxrLmJf ZGlydHkpCgkJCQlid3JpdGUoJmRmaWxlLG1iYXNlLHN0YXJ0aWIsKGludCluaWJsaypCU0laRSk7 CgkJCWlub2Jsay5iX2RpcnR5ID0gMDsKCQkJaWYoYnJlYWQoJmRmaWxlLG1iYXNlLGlibGssKGlu dCluaWJsaypCU0laRSkgPT0gTk8pIHsKCQkJCXN0YXJ0aWIgPSBmbWF4OwoJCQkJcmV0dXJuKE5V TEwpOwoJCQl9CgkJCXN0YXJ0aWIgPSBpYmxrOwoJCX0KCQlkcCA9IChESU5PREUgKikmbWJhc2Vb KHVuc2lnbmVkKSgoaWJsay1zdGFydGliKTw8QlNISUZUKV07Cgl9CgllbHNlIGlmKGdldGJsaygm aW5vYmxrLGlibGspICE9IE5VTEwpCgkJZHAgPSBpbm9ibGsuYl91bi5iX2Rpbm9kZTsKCWVsc2UK CQlyZXR1cm4oTlVMTCk7CglyZXR1cm4oZHAgKyBpdG9vKGludW0pKTsKfQoKCmZ0eXBlb2soZHAp CkRJTk9ERSAqZHA7CnsKCXN3aXRjaChkcC0+ZGlfbW9kZSAmIElGTVQpIHsKCQljYXNlIElGRElS OgoJCWNhc2UgSUZSRUc6CgkJY2FzZSBJRkJMSzoKCQljYXNlIElGQ0hSOgoJCWNhc2UgSUZNUEM6 CgkJY2FzZSBJRk1QQjoKCQkJcmV0dXJuKFlFUyk7CgkJZGVmYXVsdDoKCQkJcmV0dXJuKE5PKTsK CX0KfQoKCnJlcGx5KHMpCmNoYXIgKnM7CnsKCWNoYXIgbGluZVs4MF07CgoJcnBseWZsYWcgPSAx OwoJcHJpbnRmKCJcbiVzPyAiLHMpOwoJaWYobmZsYWcgfHwgY3NmbGFnIHx8IGRmaWxlLndmZGVz IDwgMCkgewoJCXByaW50ZigiIG5vXG5cbiIpOwoJCXJldHVybihOTyk7Cgl9CglpZih5ZmxhZykg ewoJCXByaW50ZigiIHllc1xuXG4iKTsKCQlyZXR1cm4oWUVTKTsKCX0KCWlmKGdldGxpbmUoc3Rk aW4sbGluZSxzaXplb2YobGluZSkpID09IEVPRikKCQllcnJleGl0KCJcbiIpOwoJcHJpbnRmKCJc biIpOwoJaWYobGluZVswXSA9PSAneScgfHwgbGluZVswXSA9PSAnWScpCgkJcmV0dXJuKFlFUyk7 CgllbHNlCgkJcmV0dXJuKE5PKTsKfQoKCmdldGxpbmUoZnAsbG9jLG1heGxlbikKRklMRSAqZnA7 CmNoYXIgKmxvYzsKewoJcmVnaXN0ZXIgbjsKCXJlZ2lzdGVyIGNoYXIgKnAsICpsYXN0bG9jOwoK CXAgPSBsb2M7CglsYXN0bG9jID0gJnBbbWF4bGVuLTFdOwoJd2hpbGUoKG4gPSBnZXRjKGZwKSkg IT0gJ1xuJykgewoJCWlmKG4gPT0gRU9GKQoJCQlyZXR1cm4oRU9GKTsKCQlpZighaXNzcGFjZShu KSAmJiBwIDwgbGFzdGxvYykKCQkJKnArKyA9IG47Cgl9CgkqcCA9IDA7CglyZXR1cm4ocCAtIGxv Yyk7Cn0KCgpzdHlwZShwKQpyZWdpc3RlciBjaGFyICpwOwp7CglpZigqcCA9PSAwKQoJCXJldHVy bjsKCWlmICgqKHArMSkgPT0gMCkgewoJCWlmICgqcCA9PSAnMycpIHsKCQkJY3lsc2l6ZSA9IDIw MDsKCQkJc3RlcHNpemUgPSA1OwoJCQlyZXR1cm47CgkJfQoJCWlmICgqcCA9PSAnNCcpIHsKCQkJ Y3lsc2l6ZSA9IDQxODsKCQkJc3RlcHNpemUgPSA5OwoJCQlyZXR1cm47CgkJfQoJfQoJY3lsc2l6 ZSA9IGF0b2kocCk7Cgl3aGlsZSgqcCAmJiAqcCAhPSAnOicpCgkJcCsrOwoJaWYoKnApCgkJcCsr OwoJc3RlcHNpemUgPSBhdG9pKHApOwoJaWYoc3RlcHNpemUgPD0gMCB8fCBzdGVwc2l6ZSA+IGN5 bHNpemUgfHwKCWN5bHNpemUgPD0gMCB8fCBjeWxzaXplID4gTUFYQ1lMKSB7CgkJZXJyb3IoIklu dmFsaWQgLXMgYXJndW1lbnQsIGRlZmF1bHRzIGFzc3VtZWRcbiIpOwoJCWN5bHNpemUgPSBzdGVw c2l6ZSA9IDA7Cgl9Cn0KCgpkb3N0YXRlKHMsZmxnKQp7CglyZWdpc3RlciBjaGFyICpwOwoJcmVn aXN0ZXIgdW5zaWduZWQgYnl0ZSwgc2hpZnQ7CglCVUZBUkVBICpicDsKCglieXRlID0gKGludW0p L1NUQVRFUEI7CglzaGlmdCA9IExTVEFURSAqICgoaW51bSklU1RBVEVQQik7CglpZihzdGF0ZW1h cCAhPSBOVUxMKSB7CgkJYnAgPSBOVUxMOwoJCXAgPSAmc3RhdGVtYXBbYnl0ZV07Cgl9CgllbHNl IGlmKChicCA9IGdldGJsaygoQlVGQVJFQSAqKU5VTEwsKGRhZGRyX3QpKHNtYXBibGsrKGJ5dGUv QlNJWkUpKSkpID09IE5VTEwpCgkJZXJyZXhpdCgiRmF0YWwgSS9PIGVycm9yXG4iKTsKCWVsc2UK CQlwID0gJmJwLT5iX3VuLmJfYnVmW2J5dGUlQlNJWkVdOwoJc3dpdGNoKGZsZykgewoJCWNhc2Ug MDoKCQkJKnAgJj0gfihTTUFTSzw8KHNoaWZ0KSk7CgkJCSpwIHw9IHM8PChzaGlmdCk7CgkJCWlm KGJwICE9IE5VTEwpCgkJCQlkaXJ0eShicCk7CgkJCXJldHVybihzKTsKCQljYXNlIDE6CgkJCXJl dHVybigoKnA+PihzaGlmdCkpICYgU01BU0spOwoJfQoJcmV0dXJuKFVTVEFURSk7Cn0KCgpkb21h cChibGssZmxnKQpkYWRkcl90IGJsazsKewoJcmVnaXN0ZXIgY2hhciAqcDsKCXJlZ2lzdGVyIHVu c2lnbmVkIG47CglyZWdpc3RlciBCVUZBUkVBICpicDsKCW9mZl90IGJ5dGU7CgoJYnl0ZSA9IGJs ayA+PiBCSVRTSElGVDsKCW4gPSAxPDwoKHVuc2lnbmVkKShibGsgJiBCSVRNQVNLKSk7CglpZihm bGcgJiAwNCkgewoJCXAgPSBmcmVlbWFwOwoJCWJsayA9IGZtYXBibGs7Cgl9CgllbHNlIHsKCQlw ID0gYmxrbWFwOwoJCWJsayA9IDA7Cgl9CglpZihwICE9IE5VTEwpIHsKCQlicCA9IE5VTEw7CgkJ cCArPSAodW5zaWduZWQpYnl0ZTsKCX0KCWVsc2UgaWYoKGJwID0gZ2V0YmxrKChCVUZBUkVBICop TlVMTCxibGsrKGJ5dGU+PkJTSElGVCkpKSA9PSBOVUxMKQoJCWVycmV4aXQoIkZhdGFsIEkvTyBl cnJvclxuIik7CgllbHNlCgkJcCA9ICZicC0+Yl91bi5iX2J1ZlsodW5zaWduZWQpKGJ5dGUmQk1B U0spXTsKCXN3aXRjaChmbGcmMDMpIHsKCQljYXNlIDA6CgkJCSpwIHw9IG47CgkJCWJyZWFrOwoJ CWNhc2UgMToKCQkJbiAmPSAqcDsKCQkJYnAgPSBOVUxMOwoJCQlicmVhazsKCQljYXNlIDI6CgkJ CSpwICY9IH5uOwoJfQoJaWYoYnAgIT0gTlVMTCkKCQlkaXJ0eShicCk7CglyZXR1cm4obik7Cn0K Cgpkb2xuY250KHZhbCxmbGcpCnNob3J0IHZhbDsKewoJcmVnaXN0ZXIgc2hvcnQgKnNwOwoJcmVn aXN0ZXIgQlVGQVJFQSAqYnA7CgoJaWYobG5jbnRwICE9IE5VTEwpIHsKCQlicCA9IE5VTEw7CgkJ c3AgPSAmbG5jbnRwW2ludW1dOwoJfQoJZWxzZSBpZigoYnAgPSBnZXRibGsoKEJVRkFSRUEgKilO VUxMLChkYWRkcl90KShsbmNudGJsaysoaW51bS9TUEVSQikpKSkgPT0gTlVMTCkKCQllcnJleGl0 KCJGYXRhbCBJL08gZXJyb3JcbiIpOwoJZWxzZQoJCXNwID0gJmJwLT5iX3VuLmJfbG5rc1tpbnVt JVNQRVJCXTsKCXN3aXRjaChmbGcpIHsKCQljYXNlIDA6CgkJCSpzcCA9IHZhbDsKCQkJYnJlYWs7 CgkJY2FzZSAxOgoJCQlicCA9IE5VTEw7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJKCpzcCktLTsK CX0KCWlmKGJwICE9IE5VTEwpCgkJZGlydHkoYnApOwoJcmV0dXJuKCpzcCk7Cn0KCgpCVUZBUkVB ICoKZ2V0YmxrKGJwLGJsaykKZGFkZHJfdCBibGs7CnJlZ2lzdGVyIEJVRkFSRUEgKmJwOwp7Cgly ZWdpc3RlciBzdHJ1Y3QgZmlsZWNudGwgKmZjcDsKCglpZihicCA9PSBOVUxMKSB7CgkJYnAgPSBz ZWFyY2goYmxrKTsKCQlmY3AgPSAmc2ZpbGU7Cgl9CgllbHNlCgkJZmNwID0gJmRmaWxlOwoJaWYo YnAtPmJfYm5vID09IGJsaykKCQlyZXR1cm4oYnApOwoJZmx1c2goZmNwLGJwKTsKCWlmKGJyZWFk KGZjcCxicC0+Yl91bi5iX2J1ZixibGssQlNJWkUpICE9IE5PKSB7CgkJYnAtPmJfYm5vID0gYmxr OwoJCXJldHVybihicCk7Cgl9CglicC0+Yl9ibm8gPSAoZGFkZHJfdCktMTsKCXJldHVybihOVUxM KTsKfQoKCmZsdXNoKGZjcCxicCkKc3RydWN0IGZpbGVjbnRsICpmY3A7CnJlZ2lzdGVyIEJVRkFS RUEgKmJwOwp7CglpZihicC0+Yl9kaXJ0eSkgewoJCWJ3cml0ZShmY3AsYnAtPmJfdW4uYl9idWYs YnAtPmJfYm5vLEJTSVpFKTsKCX0KCWJwLT5iX2RpcnR5ID0gMDsKfQoKCnJ3ZXJyKHMsYmxrKQpj aGFyICpzOwpkYWRkcl90IGJsazsKewoJcHJpbnRmKCJcbkNBTiBOT1QgJXM6IEJMSyAlbGQiLHMs YmxrKTsKCWlmKHJlcGx5KCJDT05USU5VRSIpID09IE5PKQoJCWVycmV4aXQoIlByb2dyYW0gdGVy bWluYXRlZFxuIik7Cn0KCgpzaXplY2hrKGRwKQpyZWdpc3RlciBESU5PREUgKmRwOwp7Ci8qCglp ZiAobWF4YmxrICE9IGhvd21hbnkoZHAtPmRpX3NpemUsIEJTSVpFKSkKCQlwcmludGYoIlBPU1NJ QkxFIEZJTEUgU0laRSBFUlJPUiBJPSV1ICglbGQsJWxkKVxuXG4iLGludW0sIG1heGJsaywgaG93 bWFueShkcC0+ZGlfc2l6ZSxCU0laRSkpOwoqLwoJaWYoRElSICYmIChkcC0+ZGlfc2l6ZSAlIHNp emVvZihESVJFQ1QpKSAhPSAwKSB7CgkJcHJpbnRmKCJESVJFQ1RPUlkgTUlTQUxJR05FRCBJPSV1 XG5cbiIsaW51bSk7Cgl9Cn0KCgpja2ZpbmkoKQp7CglmbHVzaCgmZGZpbGUsJmZpbGVibGspOwoJ Zmx1c2goJmRmaWxlLCZzYmxrKTsKCWZsdXNoKCZkZmlsZSwmaW5vYmxrKTsKCWNsb3NlKGRmaWxl LnJmZGVzKTsKCWNsb3NlKGRmaWxlLndmZGVzKTsKCWNsb3NlKHNmaWxlLnJmZGVzKTsKCWNsb3Nl KHNmaWxlLndmZGVzKTsKCWlmKHJtc2NyKSB7CgkJdW5saW5rKHNjcmZpbGUpOwoJfQp9CgoKcGlu b2RlKCkKewoJcmVnaXN0ZXIgRElOT0RFICpkcDsKCXJlZ2lzdGVyIGNoYXIgKnA7CgljaGFyIHVp ZGJ1ZlsyMDBdOwoJY2hhciAqY3RpbWUoKTsKCglwcmludGYoIiBJPSV1ICIsaW51bSk7CglpZigo ZHAgPSBnaW5vZGUoKSkgPT0gTlVMTCkKCQlyZXR1cm47CglwcmludGYoIiBPV05FUj0iKTsKCWlm KGdldHB3KChpbnQpZHAtPmRpX3VpZCx1aWRidWYpID09IDApIHsKCQlmb3IocCA9IHVpZGJ1Zjsg KnAgIT0gJzonOyBwKyspOwoJCSpwID0gMDsKCQlwcmludGYoIiVzICIsdWlkYnVmKTsKCX0KCWVs c2UgewoJCXByaW50ZigiJWQgIixkcC0+ZGlfdWlkKTsKCX0KCXByaW50ZigiTU9ERT0lb1xuIixk cC0+ZGlfbW9kZSk7CglwcmludGYoIlNJWkU9JWxkICIsZHAtPmRpX3NpemUpOwoJcCA9IGN0aW1l KCZkcC0+ZGlfbXRpbWUpOwoJcHJpbnRmKCJNVElNRT0lMTIuMTJzICU0LjRzICIscCs0LHArMjAp Owp9CgoKY29weShmcCx0cCxzaXplKQpyZWdpc3RlciBjaGFyICp0cCwgKmZwOwpNRU1TSVpFIHNp emU7CnsKCXdoaWxlKHNpemUtLSkKCQkqdHArKyA9ICpmcCsrOwp9CgoKZnJlZWNoaygpCnsKCXJl Z2lzdGVyIGRhZGRyX3QgKmFwOwoKCWlmKGZyZWVibGsuZGZfbmZyZWUgPT0gMCkKCQlyZXR1cm47 CglkbyB7CgkJaWYoZnJlZWJsay5kZl9uZnJlZSA8PSAwIHx8IGZyZWVibGsuZGZfbmZyZWUgPiBO SUNGUkVFKSB7CgkJCXByaW50ZigiQkFEIEZSRUVCTEsgQ09VTlRcbiIpOwoJCQlmaXhmcmVlID0g MTsKCQkJcmV0dXJuOwoJCX0KCQlhcCA9ICZmcmVlYmxrLmRmX2ZyZWVbZnJlZWJsay5kZl9uZnJl ZV07CgkJd2hpbGUoLS1hcCA+ICZmcmVlYmxrLmRmX2ZyZWVbMF0pIHsKCQkJaWYocGFzczUoKmFw KSA9PSBTVE9QKQoJCQkJcmV0dXJuOwoJCX0KCQlpZigqYXAgPT0gKGRhZGRyX3QpMCB8fCBwYXNz NSgqYXApICE9IEtFRVBPTikKCQkJcmV0dXJuOwoJfSB3aGlsZShnZXRibGsoJmZpbGVibGssKmFw KSAhPSBOVUxMKTsKfQoKCm1ha2VmcmVlKCkKewoJcmVnaXN0ZXIgaSwgY3lsLCBzdGVwOwoJaW50 IGo7CgljaGFyIGZsZ1tNQVhDWUxdOwoJc2hvcnQgYWRkcltNQVhDWUxdOwoJZGFkZHJfdCBibGss IGJhc2VibGs7CgoJc3VwZXJibGsuc19uZnJlZSA9IDA7CglzdXBlcmJsay5zX2Zsb2NrID0gMDsK CXN1cGVyYmxrLnNfZm1vZCA9IDA7CglzdXBlcmJsay5zX3RmcmVlID0gMDsKCXN1cGVyYmxrLnNf bmlub2RlID0gMDsKCXN1cGVyYmxrLnNfaWxvY2sgPSAwOwoJc3VwZXJibGsuc19yb25seSA9IDA7 CglpZihjeWxzaXplID09IDAgfHwgc3RlcHNpemUgPT0gMCkgewoJCXN0ZXAgPSBzdXBlcmJsay5z X2RpbmZvWzBdOwoJCWN5bCA9IHN1cGVyYmxrLnNfZGluZm9bMV07Cgl9CgllbHNlIHsKCQlzdGVw ID0gc3RlcHNpemU7CgkJY3lsID0gY3lsc2l6ZTsKCX0KCWlmKHN0ZXAgPiBjeWwgfHwgc3RlcCA8 PSAwIHx8IGN5bCA8PSAwIHx8IGN5bCA+IE1BWENZTCkgewoJCWVycm9yKCJEZWZhdWx0IGZyZWUg bGlzdCBzcGFjaW5nIGFzc3VtZWRcbiIpOwoJCXN0ZXAgPSBTVEVQU0laRTsKCQljeWwgPSBDWUxT SVpFOwoJfQoJc3VwZXJibGsuc19kaW5mb1swXSA9IHN0ZXA7CglzdXBlcmJsay5zX2RpbmZvWzFd ID0gY3lsOwoJY2xlYXIoZmxnLHNpemVvZihmbGcpKTsKCWkgPSAwOwoJZm9yKGogPSAwOyBqIDwg Y3lsOyBqKyspIHsKCQl3aGlsZShmbGdbaV0pCgkJCWkgPSAoaSArIDEpICUgY3lsOwoJCWFkZHJb al0gPSBpICsgMTsKCQlmbGdbaV0rKzsKCQlpID0gKGkgKyBzdGVwKSAlIGN5bDsKCX0KCWJhc2Vi bGsgPSAoZGFkZHJfdClyb3VuZHVwKGZtYXgsY3lsKTsKCWNsZWFyKChjaGFyICopJmZyZWVibGss QlNJWkUpOwoJZnJlZWJsay5kZl9uZnJlZSsrOwoJZm9yKCA7IGJhc2VibGsgPiAwOyBiYXNlYmxr IC09IGN5bCkKCQlmb3IoaSA9IDA7IGkgPCBjeWw7IGkrKykgewoJCQlibGsgPSBiYXNlYmxrIC0g YWRkcltpXTsKCQkJaWYoIW91dHJhbmdlKGJsaykgJiYgIWdldGJtYXAoYmxrKSkgewoJCQkJc3Vw ZXJibGsuc190ZnJlZSsrOwoJCQkJaWYoZnJlZWJsay5kZl9uZnJlZSA+PSBOSUNGUkVFKSB7CgkJ CQkJZmJkaXJ0eSgpOwoJCQkJCWZpbGVibGsuYl9ibm8gPSBibGs7CgkJCQkJZmx1c2goJmRmaWxl LCZmaWxlYmxrKTsKCQkJCQljbGVhcigoY2hhciAqKSZmcmVlYmxrLEJTSVpFKTsKCQkJCX0KCQkJ CWZyZWVibGsuZGZfZnJlZVtmcmVlYmxrLmRmX25mcmVlXSA9IGJsazsKCQkJCWZyZWVibGsuZGZf bmZyZWUrKzsKCQkJfQoJCX0KCXN1cGVyYmxrLnNfbmZyZWUgPSBmcmVlYmxrLmRmX25mcmVlOwoJ Zm9yKGkgPSAwOyBpIDwgTklDRlJFRTsgaSsrKQoJCXN1cGVyYmxrLnNfZnJlZVtpXSA9IGZyZWVi bGsuZGZfZnJlZVtpXTsKCXNiZGlydHkoKTsKfQoKCmNsZWFyKHAsY250KQpyZWdpc3RlciBjaGFy ICpwOwpNRU1TSVpFIGNudDsKewoJd2hpbGUoY250LS0pCgkJKnArKyA9IDA7Cn0KCgpCVUZBUkVB ICoKc2VhcmNoKGJsaykKZGFkZHJfdCBibGs7CnsKCXJlZ2lzdGVyIEJVRkFSRUEgKnBicCwgKmJw OwoKCWZvcihicCA9IChCVUZBUkVBICopICZwb29saGVhZDsgYnAtPmJfbmV4dDsgKSB7CgkJcGJw ID0gYnA7CgkJYnAgPSBwYnAtPmJfbmV4dDsKCQlpZihicC0+Yl9ibm8gPT0gYmxrKQoJCQlicmVh azsKCX0KCXBicC0+Yl9uZXh0ID0gYnAtPmJfbmV4dDsKCWJwLT5iX25leHQgPSBwb29saGVhZDsK CXBvb2xoZWFkID0gYnA7CglyZXR1cm4oYnApOwp9CgoKZmluZGlubyhkaXJwKQpyZWdpc3RlciBE SVJFQ1QgKmRpcnA7CnsKCXJlZ2lzdGVyIGNoYXIgKnAxLCAqcDI7CgoJaWYoZGlycC0+ZF9pbm8g PT0gMCkKCQlyZXR1cm4oS0VFUE9OKTsKCWZvcihwMSA9IGRpcnAtPmRfbmFtZSxwMiA9IHNyY2hu YW1lOypwMisrID09ICpwMTsgcDErKykgewoJCWlmKCpwMSA9PSAwIHx8IHAxID09ICZkaXJwLT5k X25hbWVbRElSU0laLTFdKSB7CgkJCWlmKGRpcnAtPmRfaW5vID49IFJPT1RJTk8gJiYgZGlycC0+ ZF9pbm8gPD0gaW1heCkKCQkJCXBhcmVudGRpciA9IGRpcnAtPmRfaW5vOwoJCQlyZXR1cm4oU1RP UCk7CgkJfQoJfQoJcmV0dXJuKEtFRVBPTik7Cn0KCgpta2VudHJ5KGRpcnApCnJlZ2lzdGVyIERJ UkVDVCAqZGlycDsKewoJcmVnaXN0ZXIgaW5vX3QgaW47CglyZWdpc3RlciBjaGFyICpwOwoKCWlm KGRpcnAtPmRfaW5vKQoJCXJldHVybihLRUVQT04pOwoJZGlycC0+ZF9pbm8gPSBvcnBoYW47Cglp biA9IG9ycGhhbjsKCXAgPSAmZGlycC0+ZF9uYW1lWzddOwoJKi0tcCA9IDA7Cgl3aGlsZShwID4g ZGlycC0+ZF9uYW1lKSB7CgkJKi0tcCA9IChpbiAlIDEwKSArICcwJzsKCQlpbiAvPSAxMDsKCX0K CXJldHVybihBTFRFUkR8U1RPUCk7Cn0KCgpjaGdkZChkaXJwKQpyZWdpc3RlciBESVJFQ1QgKmRp cnA7CnsKCWlmKGRpcnAtPmRfbmFtZVswXSA9PSAnLicgJiYgZGlycC0+ZF9uYW1lWzFdID09ICcu JyAmJgoJZGlycC0+ZF9uYW1lWzJdID09IDApIHsKCQlkaXJwLT5kX2lubyA9IGxmZGlyOwoJCXJl dHVybihBTFRFUkR8U1RPUCk7Cgl9CglyZXR1cm4oS0VFUE9OKTsKfQoKCmxpbmt1cCgpCnsKCXJl Z2lzdGVyIERJTk9ERSAqZHA7CglyZWdpc3RlciBsb3N0ZGlyOwoJcmVnaXN0ZXIgaW5vX3QgcGRp cjsKCglpZigoZHAgPSBnaW5vZGUoKSkgPT0gTlVMTCkKCQlyZXR1cm4oTk8pOwoJbG9zdGRpciA9 IERJUjsKCXBkaXIgPSBwYXJlbnRkaXI7CglwcmludGYoIlVOUkVGICVzICIsbG9zdGRpciA/ICJE SVIiIDogIkZJTEUiKTsKCXBpbm9kZSgpOwoJaWYocmVwbHkoIlJFQ09OTkVDVCIpID09IE5PKQoJ CXJldHVybihOTyk7CglvcnBoYW4gPSBpbnVtOwoJaWYobGZkaXIgPT0gMCkgewoJCWludW0gPSBS T09USU5POwoJCWlmKChkcCA9IGdpbm9kZSgpKSA9PSBOVUxMKSB7CgkJCWludW0gPSBvcnBoYW47 CgkJCXJldHVybihOTyk7CgkJfQoJCXBmdW5jID0gZmluZGlubzsKCQlzcmNobmFtZSA9IGxmbmFt ZTsKCQlmaWxzaXplID0gZHAtPmRpX3NpemU7CgkJcGFyZW50ZGlyID0gMDsKCQlja2lub2RlKGRw LERBVEEpOwoJCWludW0gPSBvcnBoYW47CgkJaWYoKGxmZGlyID0gcGFyZW50ZGlyKSA9PSAwKSB7 CgkJCXByaW50ZigiU09SUlkuIE5PIGxvc3QrZm91bmQgRElSRUNUT1JZXG5cbiIpOwoJCQlyZXR1 cm4oTk8pOwoJCX0KCX0KCWludW0gPSBsZmRpcjsKCWlmKChkcCA9IGdpbm9kZSgpKSA9PSBOVUxM IHx8ICFESVIgfHwgZ2V0c3RhdGUoKSAhPSBGU1RBVEUpIHsKCQlpbnVtID0gb3JwaGFuOwoJCXBy aW50ZigiU09SUlkuIE5PIGxvc3QrZm91bmQgRElSRUNUT1JZXG5cbiIpOwoJCXJldHVybihOTyk7 Cgl9CglpZihkcC0+ZGlfc2l6ZSAmIEJNQVNLKSB7CgkJZHAtPmRpX3NpemUgPSByb3VuZHVwKGRw LT5kaV9zaXplLEJTSVpFKTsKCQlpbm9kaXJ0eSgpOwoJfQoJZmlsc2l6ZSA9IGRwLT5kaV9zaXpl OwoJaW51bSA9IG9ycGhhbjsKCXBmdW5jID0gbWtlbnRyeTsKCWlmKChja2lub2RlKGRwLERBVEEp ICYgQUxURVJEKSA9PSAwKSB7CgkJcHJpbnRmKCJTT1JSWS4gTk8gU1BBQ0UgSU4gbG9zdCtmb3Vu ZCBESVJFQ1RPUllcblxuIik7CgkJcmV0dXJuKE5PKTsKCX0KCWRlY2xuY250KCk7CglpZihsb3N0 ZGlyKSB7CgkJcGZ1bmMgPSBjaGdkZDsKCQlkcCA9IGdpbm9kZSgpOwoJCWZpbHNpemUgPSBkcC0+ ZGlfc2l6ZTsKCQlja2lub2RlKGRwLERBVEEpOwoJCWludW0gPSBsZmRpcjsKCQlpZigoZHAgPSBn aW5vZGUoKSkgIT0gTlVMTCkgewoJCQlkcC0+ZGlfbmxpbmsrKzsKCQkJaW5vZGlydHkoKTsKCQkJ c2V0bG5jbnQoZ2V0bG5jbnQoKSsxKTsKCQl9CgkJaW51bSA9IG9ycGhhbjsKCQlwcmludGYoIkRJ UiBJPSV1IENPTk5FQ1RFRC4gIixvcnBoYW4pOwoJCXByaW50ZigiUEFSRU5UIFdBUyBJPSV1XG5c biIscGRpcik7Cgl9CglyZXR1cm4oWUVTKTsKfQoKCmJyZWFkKGZjcCxidWYsYmxrLHNpemUpCmRh ZGRyX3QgYmxrOwpyZWdpc3RlciBzdHJ1Y3QgZmlsZWNudGwgKmZjcDsKcmVnaXN0ZXIgc2l6ZTsK Y2hhciAqYnVmOwp7CglpZihsc2VlayhmY3AtPnJmZGVzLGJsazw8QlNISUZULDApIDwgMCkKCQly d2VycigiU0VFSyIsYmxrKTsKCWVsc2UgaWYocmVhZChmY3AtPnJmZGVzLGJ1ZixzaXplKSA9PSBz aXplKQoJCXJldHVybihZRVMpOwoJcndlcnIoIlJFQUQiLGJsayk7CglyZXR1cm4oTk8pOwp9CgoK YndyaXRlKGZjcCxidWYsYmxrLHNpemUpCmRhZGRyX3QgYmxrOwpyZWdpc3RlciBzdHJ1Y3QgZmls ZWNudGwgKmZjcDsKcmVnaXN0ZXIgc2l6ZTsKY2hhciAqYnVmOwp7CglpZihmY3AtPndmZGVzIDwg MCkKCQlyZXR1cm4oTk8pOwoJaWYobHNlZWsoZmNwLT53ZmRlcyxibGs8PEJTSElGVCwwKSA8IDAp CgkJcndlcnIoIlNFRUsiLGJsayk7CgllbHNlIGlmKHdyaXRlKGZjcC0+d2ZkZXMsYnVmLHNpemUp ID09IHNpemUpIHsKCQlmY3AtPm1vZCA9IDE7CgkJcmV0dXJuKFlFUyk7Cgl9Cglyd2VycigiV1JJ VEUiLGJsayk7CglyZXR1cm4oTk8pOwp9CgpjYXRjaCgpCnsKCWNrZmluaSgpOwoJZXhpdCg0KTsK fQoKdXN0YXQoeCwgcykKY2hhciAqczsKewoJcmV0dXJuKC0xKTsKfQo= --000000000000c9c6da05f6142d53--