From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: Re: JSON/YAML/TOML/etc. parsing performance Date: Sat, 30 Sep 2017 22:02:55 +0000 Message-ID: References: <87poaqhc63.fsf@lifelogs.com> <8360ceh5f1.fsf@gnu.org> <83h8vl5lf9.fsf@gnu.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="94eb2c1c10026361b3055a6f4e07" X-Trace: blaine.gmane.org 1506809052 21586 195.159.176.226 (30 Sep 2017 22:04:12 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 30 Sep 2017 22:04:12 +0000 (UTC) Cc: emacs-devel@gnu.org To: Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Oct 01 00:04:05 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dyPrf-0004vq-Av for ged-emacs-devel@m.gmane.org; Sun, 01 Oct 2017 00:04:04 +0200 Original-Received: from localhost ([::1]:40490 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dyPrm-0002vY-KL for ged-emacs-devel@m.gmane.org; Sat, 30 Sep 2017 18:04:10 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46724) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dyPqv-0002vG-Rs for emacs-devel@gnu.org; Sat, 30 Sep 2017 18:03:23 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dyPqr-0008Ge-QY for emacs-devel@gnu.org; Sat, 30 Sep 2017 18:03:17 -0400 Original-Received: from mail-oi0-x230.google.com ([2607:f8b0:4003:c06::230]:43134) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dyPqm-0008BD-W9; Sat, 30 Sep 2017 18:03:09 -0400 Original-Received: by mail-oi0-x230.google.com with SMTP id c77so2151968oig.0; Sat, 30 Sep 2017 15:03:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=bHOsTILmIfpVemwRNpfBTHrkTCUIIfhGYWl8PQbuaH8=; b=dZMCqEvUIOj39e/3i26ZqKhPdEZal+kdYeki1N8XtZA2vA+nR0IUH8SwgQYz+mWgJM YPOeV4pABmlcIZYcB78/EPQZCkNqETjzPFfA8eAluBFe1eKTOGCmiqg2BGRfBOfCkW3w RMTJ7IOwtMp4gCw5Vu1D/KHd/gDeGVCVPk6ma8McGatOi/ksGUDPJCbyhsfILuMPUE/J Hs56FExBVRwJ8kSCGPN+j6mUrH01eAAPjlTAmj+y9+dezZxWnI6//a6qtZGYCHmE8P4t 3hBisy1LFHXQkHgMWCk4ZsxgILkNM7APSo2rRhEZ3g7pyJjteoi6WO7K+BrHWKh1IZOm 6Rdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=bHOsTILmIfpVemwRNpfBTHrkTCUIIfhGYWl8PQbuaH8=; b=oASQ7axipq2Nu8nV11iZq3ssiuxVMmsvgSNZMAEN5FSbvXO4WFcAm/2+oXbgPSnotO SVrjBoxTDMDHr4EJjnF8VE6tSTwSf23Sy5piokBLB9n9ZdEbNqhmI5xXc1u1Ybgn0BgG byt5TcG7XHc4fcfrU7qzCULMOo5cAHwtzVEy4p7zybA1VwVvxtkhlCDEiJCFfpypikS/ Nzl/OB6kE8QSDnwk6PoPMlMoIQ8rSrDr2J/5NYR81zQKtdu5A9CePXMCZ8W923GWuBPf wb9QU5bFhV1gQ1mMkTeCJHGn6WUCV8A+sChhwi7NnyTQM7POlNXlY+L4X0MM8Yrbajps b5ug== X-Gm-Message-State: AMCzsaWaNKLrbj3c3nQHJdAzVlM5w5CIGIIGBA14q9QpnK9YBTmka6hp R6zwNlXZQ9rgve9m8mKzbEZH1W0g6ReFWWWlQB/Azg== X-Google-Smtp-Source: AOwi7QBvn1mbP482BmL+1PaG7jAvhomUf8LlQhJLKTmJywnIgMj0Lf65LhByUHXol6YVWqQ7A+H4bMFYCPpOlWH0GG8= X-Received: by 10.157.66.142 with SMTP id r14mr4598604ote.335.1506808986440; Sat, 30 Sep 2017 15:03:06 -0700 (PDT) In-Reply-To: <83h8vl5lf9.fsf@gnu.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4003:c06::230 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:218977 Archived-At: --94eb2c1c10026361b3055a6f4e07 Content-Type: multipart/alternative; boundary="94eb2c1c10026361b0055a6f4e05" --94eb2c1c10026361b0055a6f4e05 Content-Type: text/plain; charset="UTF-8" Eli Zaretskii schrieb am Fr., 29. Sep. 2017 um 21:56 Uhr: > > From: Philipp Stephani > > Date: Thu, 28 Sep 2017 21:19:00 +0000 > > Cc: emacs-devel@gnu.org > > > > IIUC Jansson only accepts UTF-8 strings (i.e. it will generate an error > some input is not an UTF-8 string), and > > will only return UTF-8 strings as well. Therefore I think that direct > conversion between Lisp strings and C > > strings (using SDATA etc.) is always correct because the internal Emacs > encoding is a superset of UTF-8. > > Also build_string should always be correct because it will generate a > correct multibyte string for an UTF-8 > > string with non-ASCII characters, and a correct unibyte string for an > ASCII string, right? > > I don't think it's a good idea to write code which has such > assumptions embedded in it. We don't do that in other cases, although > UTF-8 based systems are widespread nowadays. Instead, we make sure > that encoding and decoding UTF-8 byte stream is implemented > efficiently, and when possible simply reuses the same string data. > > Besides, these assumptions are not always true, for example: > > . The Emacs internal representation could include raw bytes, whose > representations (both of them) is not valid UTF-8; > . Strings we receive from the library could be invalid UTF-8, in > which case putting them into a buffer or string without decoding > will mean trouble for programs that will try to process them; > > So I think decoding and encoding any string passed to/from Jansson is > better for stability and future maintenance. If you worry about > performance, you shouldn't: we convert UTF-8 into our internal > representation as efficiently as possible. > > > > + /* LISP now must be a vector or hashtable. */ > > > + if (++lisp_eval_depth > max_lisp_eval_depth) > > > + xsignal0 (Qjson_object_too_deep); > > > > This error could mislead: the problem could be in the nesting of > > surrounding Lisp being too deep, and the JSON part could be just fine. > > > > Agreed, but I think it's better to use lisp_eval_depth here because it's > the total nesting depth that could cause > > stack overflows. > > Well, at least the error message should not point exclusively to a > JSON problem, it should mention the possibility of a Lisp eval depth > overflow as well. > OK, I've attached a new patch that incorporates most of these changes. > > > > + Lisp_Object string > > > + = make_string (buffer_and_size->buffer, buffer_and_size->size); > > > > This is arbitrary text, so I'm not sure make_string is appropriate. > > Could the text be a byte stream, i.e. not human-readable text? If so, > > do we want to create a unibyte string or a multibyte string here? > > > > It should always be UTF-8. > > How does JSON express byte streams, then? Doesn't it support data (as > opposed to text)? > Usually using base64. > > > > + { > > > + bool overflow = INT_ADD_WRAPV (BUFFER_CEILING_OF (point), 1, &end); > > > + eassert (!overflow); > > > + } > > > + size_t count; > > > + { > > > + bool overflow = INT_SUBTRACT_WRAPV (end, point, &count); > > > + eassert (!overflow); > > > + } > > > > Why did you need these blocks in braces? > > > > To be able to reuse the "overflow" name/ > > Why can't you reuse it without the braces? > > Then I'd need to reuse the variable. Not a big deal, just personal style. --94eb2c1c10026361b0055a6f4e05 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Eli Za= retskii <eliz@gnu.org> schrieb am= Fr., 29. Sep. 2017 um 21:56=C2=A0Uhr:
> From: Philipp Stephani <p.stephani2@gmail.com>
> Date: Thu, 28 Sep 2017 21:19:00 +0000
> Cc: emacs-dev= el@gnu.org
>
> IIUC Jansson only accepts UTF-8 strings (i.e. it will generate an erro= r some input is not an UTF-8 string), and
> will only return UTF-8 strings as well. Therefore I think that direct = conversion between Lisp strings and C
> strings (using SDATA etc.) is always correct because the internal Emac= s encoding is a superset of UTF-8.
> Also build_string should always be correct because it will generate a = correct multibyte string for an UTF-8
> string with non-ASCII characters, and a correct unibyte string for an = ASCII string, right?

I don't think it's a good idea to write code which has such
assumptions embedded in it.=C2=A0 We don't do that in other cases, alth= ough
UTF-8 based systems are widespread nowadays.=C2=A0 Instead, we make sure that encoding and decoding UTF-8 byte stream is implemented
efficiently, and when possible simply reuses the same string data.

Besides, these assumptions are not always true, for example:

=C2=A0 . The Emacs internal representation could include raw bytes, whose =C2=A0 =C2=A0 representations (both of them) is not valid UTF-8;
=C2=A0 . Strings we receive from the library could be invalid UTF-8, in
=C2=A0 =C2=A0 which case putting them into a buffer or string without decod= ing
=C2=A0 =C2=A0 will mean trouble for programs that will try to process them;=

So I think decoding and encoding any string passed to/from Jansson is
better for stability and future maintenance.=C2=A0 If you worry about
performance, you shouldn't: we convert UTF-8 into our internal
representation as efficiently as possible.

>=C2=A0 > + /* LISP now must be a vector or hashtable. */
>=C2=A0 > + if (++lisp_eval_depth > max_lisp_eval_depth)
>=C2=A0 > + xsignal0 (Qjson_object_too_deep);
>
>=C2=A0 This error could mislead: the problem could be in the nesting of=
>=C2=A0 surrounding Lisp being too deep, and the JSON part could be just= fine.
>
> Agreed, but I think it's better to use lisp_eval_depth here becaus= e it's the total nesting depth that could cause
> stack overflows.

Well, at least the error message should not point exclusively to a
JSON problem, it should mention the possibility of a Lisp eval depth
overflow as well.

OK, I've attached= a new patch that incorporates most of these changes.
=C2=A0

>=C2=A0 > + Lisp_Object string
>=C2=A0 > + =3D make_string (buffer_and_size->buffer, buffer_and_s= ize->size);
>
>=C2=A0 This is arbitrary text, so I'm not sure make_string is appro= priate.
>=C2=A0 Could the text be a byte stream, i.e. not human-readable text? I= f so,
>=C2=A0 do we want to create a unibyte string or a multibyte string here= ?
>
> It should always be UTF-8.

How does JSON express byte streams, then?=C2=A0 Doesn't it support data= (as
opposed to text)?

Usually using base64.=
=C2=A0

>=C2=A0 > + {
>=C2=A0 > + bool overflow =3D INT_ADD_WRAPV (BUFFER_CEILING_OF (point= ), 1, &end);
>=C2=A0 > + eassert (!overflow);
>=C2=A0 > + }
>=C2=A0 > + size_t count;
>=C2=A0 > + {
>=C2=A0 > + bool overflow =3D INT_SUBTRACT_WRAPV (end, point, &co= unt);
>=C2=A0 > + eassert (!overflow);
>=C2=A0 > + }
>
>=C2=A0 Why did you need these blocks in braces?
>
> To be able to reuse the "overflow" name/

Why can't you reuse it without the braces?


Then I'd need to reuse the variabl= e. Not a big deal, just personal style.=C2=A0
--94eb2c1c10026361b0055a6f4e05-- --94eb2c1c10026361b3055a6f4e07 Content-Type: text/plain; charset="UTF-8"; name="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Disposition: attachment; filename="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Transfer-Encoding: base64 Content-ID: <15ed4d046231bd849ac1> X-Attachment-Id: 15ed4d046231bd849ac1 RnJvbSA0ZjdjNzQ1M2I2M2ZhMDBjM2RjOGUwZWZmMTkyOTU2NjhkOWNhNDU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IE1vbiwgMTggU2VwIDIwMTcgMTA6NTE6MzkgKzAyMDAKU3ViamVjdDogW1BBVENIXSBJbXBs ZW1lbnQgbmF0aXZlIEpTT04gc3VwcG9ydCB1c2luZyBKYW5zc29uCgoqIGNvbmZpZ3VyZS5hYzog TmV3IG9wdGlvbiAtLXdpdGgtanNvbi4KCiogc3JjL2pzb24uYyAoRmpzb25fc2VyaWFsaXplLCBG anNvbl9pbnNlcnQsIEZqc29uX3BhcnNlX3N0cmluZykKKEZqc29uX3BhcnNlX2J1ZmZlcik6IE5l dyBkZWZ1bnMuCihqc29uX2hhc19wcmVmaXgsIGpzb25faGFzX3N1ZmZpeCwganNvbl9tYWtlX3N0 cmluZykKKGpzb25fYnVpbGRfc3RyaW5nLCBqc29uX2VuY29kZSwganNvbl9vdXRfb2ZfbWVtb3J5 LCBqc29uX3BhcnNlX2Vycm9yKQooanNvbl9yZWxlYXNlX29iamVjdCwgY2hlY2tfc3RyaW5nX3dp dGhvdXRfZW1iZWRkZWRfbnVsbHMsIGpzb25fY2hlY2spCihsaXNwX3RvX2pzb24sIGxpc3BfdG9f anNvbl90b3BsZXZlbCwgbGlzcF90b19qc29uX3RvcGxldmVsXzEpCihqc29uX2luc2VydCwganNv bl9pbnNlcnRfY2FsbGJhY2ssIGpzb25fdG9fbGlzcCkKKGpzb25fcmVhZF9idWZmZXJfY2FsbGJh Y2ssIEZqc29uX3BhcnNlX2J1ZmZlciwgZGVmaW5lX2Vycm9yKTogTmV3CmhlbHBlciBmdW5jdGlv bnMuCihzeW1zX29mX2pzb24pOiBOZXcgZmlsZS4KCiogc3JjL2xpc3AuaDogRGVjbGFyYXRpb24g Zm9yIHN5bXNfb2ZfanNvbi4KCiogc3JjL2NvbmZfcG9zdC5oIChBVFRSSUJVVEVfV0FSTl9VTlVT RURfUkVTVUxUKTogTmV3IGF0dHJpYnV0ZSBtYWNyby4KCiogc3JjL2VtYWNzLmMgKG1haW4pOiBF bmFibGUgSlNPTiBmdW5jdGlvbnMuCgoqIHNyYy9ldmFsLmMgKGludGVybmFsX2NhdGNoX2FsbCwg aW50ZXJuYWxfY2F0Y2hfYWxsXzEpOiBOZXcgaGVscGVyCmZ1bmN0aW9ucyB0byBjYXRjaCBhbGwg c2lnbmFscy4KKHN5bXNfb2ZfZXZhbCk6IEFkZCB1bmludGVybmVkIHN5bWJvbCB0byBzaWduaWZ5 IG91dCBvZiBtZW1vcnkuCgoqIHNyYy9NYWtlZmlsZS5pbiAoSlNPTl9MSUJTLCBKU09OX0NGTEFH UywgSlNPTl9PQkosIEVNQUNTX0NGTEFHUykKKGJhc2Vfb2JqLCBMSUJFUyk6IENvbXBpbGUganNv bi5jIGlmIC0td2l0aC1qc29uIGlzIGVuYWJsZWQuCgoqIHRlc3Qvc3JjL2pzb24tdGVzdHMuZWwg KGpzb24tc2VyaWFsaXplL3JvdW5kdHJpcCkKKGpzb24tc2VyaWFsaXplL29iamVjdCwganNvbi1w YXJzZS1zdHJpbmcvb2JqZWN0KQooanNvbi1wYXJzZS1zdHJpbmcvc3RyaW5nLCBqc29uLXNlcmlh bGl6ZS9zdHJpbmcpCihqc29uLXBhcnNlLXN0cmluZy9pbmNvbXBsZXRlLCBqc29uLXBhcnNlLXN0 cmluZy90cmFpbGluZykKKGpzb24tcGFyc2UtYnVmZmVyL2luY29tcGxldGUsIGpzb24tcGFyc2Ut YnVmZmVyL3RyYWlsaW5nKTogTmV3IHVuaXQKdGVzdHMuCi0tLQogY29uZmlndXJlLmFjICAgICAg ICAgICB8ICAyMCArLQogZXRjL05FV1MgICAgICAgICAgICAgICB8ICAgNyArCiBzcmMvTWFrZWZp bGUuaW4gICAgICAgIHwgIDExICstCiBzcmMvY29uZl9wb3N0LmggICAgICAgIHwgICA2ICsKIHNy Yy9lbWFjcy5jICAgICAgICAgICAgfCAgIDQgKwogc3JjL2V2YWwuYyAgICAgICAgICAgICB8ICA1 NCArKysrKysKIHNyYy9qc29uLmMgICAgICAgICAgICAgfCA1MTcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2xpc3AuaCAgICAgICAgICAgICB8 ICAgNiArCiB0ZXN0L3NyYy9qc29uLXRlc3RzLmVsIHwgIDk3ICsrKysrKysrKysKIDkgZmlsZXMg Y2hhbmdlZCwgNzE4IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL2pzb24uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3Qvc3JjL2pzb24tdGVzdHMu ZWwKCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggNzViZGE3 YjE2NC4uNDI5N2U0ZDY3YyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3Vy ZS5hYwpAQCAtMzQ4LDYgKzM0OCw3IEBAIEFDX0RFRlVOCiBPUFRJT05fREVGQVVMVF9PRkYoW2Nh aXJvXSxbY29tcGlsZSB3aXRoIENhaXJvIGRyYXdpbmcgKGV4cGVyaW1lbnRhbCldKQogT1BUSU9O X0RFRkFVTFRfT04oW3htbDJdLFtkb24ndCBjb21waWxlIHdpdGggWE1MIHBhcnNpbmcgc3VwcG9y dF0pCiBPUFRJT05fREVGQVVMVF9PTihbaW1hZ2VtYWdpY2tdLFtkb24ndCBjb21waWxlIHdpdGgg SW1hZ2VNYWdpY2sgaW1hZ2Ugc3VwcG9ydF0pCitPUFRJT05fREVGQVVMVF9PTihbanNvbl0sIFtk b24ndCBjb21waWxlIHdpdGggbmF0aXZlIEpTT04gc3VwcG9ydF0pCiAKIE9QVElPTl9ERUZBVUxU X09OKFt4ZnRdLFtkb24ndCB1c2UgWEZUIGZvciBhbnRpIGFsaWFzZWQgZm9udHNdKQogT1BUSU9O X0RFRkFVTFRfT04oW2xpYm90Zl0sW2Rvbid0IHVzZSBsaWJvdGYgZm9yIE9wZW5UeXBlIGZvbnQg c3VwcG9ydF0pCkBAIC0yODU2LDYgKzI4NTcsMjIgQEAgQUNfREVGVU4KIEFDX1NVQlNUKExJQlNZ U1RFTURfTElCUykKIEFDX1NVQlNUKExJQlNZU1RFTURfQ0ZMQUdTKQogCitIQVZFX0pTT049bm8K K0pTT05fT0JKPQorCitpZiB0ZXN0ICIke3dpdGhfanNvbn0iID0geWVzOyB0aGVuCisgIEVNQUNT X0NIRUNLX01PRFVMRVMoW0pTT05dLCBbamFuc3NvbiA+PSAyLjVdLAorICAgIFtIQVZFX0pTT049 eWVzXSwgW0hBVkVfSlNPTj1ub10pCisgIGlmIHRlc3QgIiR7SEFWRV9KU09OfSIgPSB5ZXM7IHRo ZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9KU09OLCAxLCBbRGVmaW5lIGlmIHVzaW5nIEphbnNzb24u XSkKKyAgICBKU09OX09CSj1qc29uLm8KKyAgZmkKK2ZpCisKK0FDX1NVQlNUKEpTT05fTElCUykK K0FDX1NVQlNUKEpTT05fQ0ZMQUdTKQorQUNfU1VCU1QoSlNPTl9PQkopCisKIE5PVElGWV9PQko9 CiBOT1RJRllfU1VNTUFSWT1ubwogCkBAIC01MzY4LDcgKzUzODUsNyBAQCBBQ19ERUZVTgogZm9y IG9wdCBpbiBYQVczRCBYUE0gSlBFRyBUSUZGIEdJRiBQTkcgUlNWRyBDQUlSTyBJTUFHRU1BR0lD SyBTT1VORCBHUE0gREJVUyBcCiAgIEdDT05GIEdTRVRUSU5HUyBOT1RJRlkgQUNMIExJQlNFTElO VVggR05VVExTIExJQlhNTDIgRlJFRVRZUEUgTTE3Tl9GTFQgXAogICBMSUJPVEYgWEZUIFpMSUIg VE9PTEtJVF9TQ1JPTExfQkFSUyBYX1RPT0xLSVQgT0xEWE1FTlUgWDExIE5TIE1PRFVMRVMgXAot ICBYV0lER0VUUyBMSUJTWVNURU1EIENBTk5PVF9EVU1QIExDTVMyOyBkbworICBYV0lER0VUUyBM SUJTWVNURU1EIEpTT04gQ0FOTk9UX0RVTVAgTENNUzI7IGRvCiAKICAgICBjYXNlICRvcHQgaW4K ICAgICAgIENBTk5PVF9EVU1QKSBldmFsIHZhbD1cJHskb3B0fSA7OwpAQCAtNTQxOCw2ICs1NDM1 LDcgQEAgQUNfREVGVU4KICAgRG9lcyBFbWFjcyB1c2UgLWxvdGY/ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAke0hBVkVfTElCT1RGfQogICBEb2VzIEVtYWNzIHVzZSAtbHhmdD8g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SEFWRV9YRlR9CiAgIERvZXMgRW1h Y3MgdXNlIC1sc3lzdGVtZD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtIQVZFX0xJ QlNZU1RFTUR9CisgIERvZXMgRW1hY3MgdXNlIC1samFuc3Nvbj8gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJHtIQVZFX0pTT059CiAgIERvZXMgRW1hY3MgZGlyZWN0bHkgdXNlIHpsaWI/ ICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtIQVZFX1pMSUJ9CiAgIERvZXMgRW1hY3MgaGF2 ZSBkeW5hbWljIG1vZHVsZXMgc3VwcG9ydD8gICAgICAgICAgICAgICAgJHtIQVZFX01PRFVMRVN9 CiAgIERvZXMgRW1hY3MgdXNlIHRvb2xraXQgc2Nyb2xsIGJhcnM/ICAgICAgICAgICAgICAgICAg ICAgJHtVU0VfVE9PTEtJVF9TQ1JPTExfQkFSU30KZGlmZiAtLWdpdCBhL2V0Yy9ORVdTIGIvZXRj L05FV1MKaW5kZXggOGZiYzM1NGZjMC4uNWEwYTE2NDkzNyAxMDA2NDQKLS0tIGEvZXRjL05FV1MK KysrIGIvZXRjL05FV1MKQEAgLTI1LDYgKzI1LDEzIEBAIFdoZW4geW91IGFkZCBhIG5ldyBpdGVt LCB1c2UgdGhlIGFwcHJvcHJpYXRlIG1hcmsgaWYgeW91IGFyZSBzdXJlIGl0IGFwcGxpZXMsCiAM CiAqIEluc3RhbGxhdGlvbiBDaGFuZ2VzIGluIEVtYWNzIDI3LjEKIAorKiogVGhlIG5ldyBjb25m aWd1cmUgb3B0aW9uICctLXdpdGgtanNvbicgYWRkcyBzdXBwb3J0IGZvciBKU09OIHVzaW5nCit0 aGUgSmFuc3NvbiBsaWJyYXJ5LiAgSXQgaXMgb24gYnkgZGVmYXVsdDsgdXNlICdjb25maWd1cmUK Ky0td2l0aC1qc29uPW5vJyB0byBidWlsZCB3aXRob3V0IEphbnNzb24gc3VwcG9ydC4gIFRoZSBu ZXcgSlNPTgorZnVuY3Rpb25zICdqc29uLXNlcmlhbGl6ZScsICdqc29uLWluc2VydCcsICdqc29u LXBhcnNlLXN0cmluZycsIGFuZAorJ2pzb24tcGFyc2UtYnVmZmVyJyBhcmUgdHlwaWNhbGx5IG11 Y2ggZmFzdGVyIHRoYW4gdGhlaXIgTGlzcAorY291bnRlcnBhcnRzIGZyb20ganNvbi5lbC4KKwog DAogKiBTdGFydHVwIENoYW5nZXMgaW4gRW1hY3MgMjcuMQogCmRpZmYgLS1naXQgYS9zcmMvTWFr ZWZpbGUuaW4gYi9zcmMvTWFrZWZpbGUuaW4KaW5kZXggOWE4YzljODVmMC4uYjM5NTYyNzg5MyAx MDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlLmluCisrKyBiL3NyYy9NYWtlZmlsZS5pbgpAQCAtMzEy LDYgKzMxMiwxMCBAQCBMSUJHTlVUTFNfQ0ZMQUdTID0KIExJQlNZU1RFTURfTElCUyA9IEBMSUJT WVNURU1EX0xJQlNACiBMSUJTWVNURU1EX0NGTEFHUyA9IEBMSUJTWVNURU1EX0NGTEFHU0AKIAor SlNPTl9MSUJTID0gQEpTT05fTElCU0AKK0pTT05fQ0ZMQUdTID0gQEpTT05fQ0ZMQUdTQAorSlNP Tl9PQkogPSBASlNPTl9PQkpACisKIElOVEVSVkFMU19IID0gZGlzcGV4dGVybi5oIGludGVydmFs cy5oIGNvbXBvc2l0ZS5oCiAKIEdFVExPQURBVkdfTElCUyA9IEBHRVRMT0FEQVZHX0xJQlNACkBA IC0zNjMsNyArMzY3LDcgQEAgRU1BQ1NfQ0ZMQUdTPQogICAkKFdFQktJVF9DRkxBR1MpIFwKICAg JChTRVRUSU5HU19DRkxBR1MpICQoRlJFRVRZUEVfQ0ZMQUdTKSAkKEZPTlRDT05GSUdfQ0ZMQUdT KSBcCiAgICQoTElCT1RGX0NGTEFHUykgJChNMTdOX0ZMVF9DRkxBR1MpICQoREVQRkxBR1MpIFwK LSAgJChMSUJTWVNURU1EX0NGTEFHUykgXAorICAkKExJQlNZU1RFTURfQ0ZMQUdTKSAkKEpTT05f Q0ZMQUdTKSBcCiAgICQoTElCR05VVExTX0NGTEFHUykgJChOT1RJRllfQ0ZMQUdTKSAkKENBSVJP X0NGTEFHUykgXAogICAkKFdFUlJPUl9DRkxBR1MpCiBBTExfQ0ZMQUdTID0gJChFTUFDU19DRkxB R1MpICQoV0FSTl9DRkxBR1MpICQoQ0ZMQUdTKQpAQCAtMzk3LDcgKzQwMSw3IEBAIGJhc2Vfb2Jq ID0KIAl0aHJlYWQubyBzeXN0aHJlYWQubyBcCiAJJChpZiAkKEhZQlJJRF9NQUxMT0MpLHNoZWFw Lm8pIFwKIAkkKE1TRE9TX09CSikgJChNU0RPU19YX09CSikgJChOU19PQkopICQoQ1lHV0lOX09C SikgJChGT05UX09CSikgXAotCSQoVzMyX09CSikgJChXSU5ET1dfU1lTVEVNX09CSikgJChYR1NF TE9CSikKKwkkKFczMl9PQkopICQoV0lORE9XX1NZU1RFTV9PQkopICQoWEdTRUxPQkopICQoSlNP Tl9PQkopCiBvYmogPSAkKGJhc2Vfb2JqKSAkKE5TX09CSkNfT0JKKQogCiAjIyBPYmplY3QgZmls ZXMgdXNlZCBvbiBzb21lIG1hY2hpbmUgb3Igb3RoZXIuCkBAIC00OTMsNyArNDk3LDggQEAgTElC RVMgPQogICAgJChMSUJTX1RFUk1DQVApICQoR0VUTE9BREFWR19MSUJTKSAkKFNFVFRJTkdTX0xJ QlMpICQoTElCU0VMSU5VWF9MSUJTKSBcCiAgICAkKEZSRUVUWVBFX0xJQlMpICQoRk9OVENPTkZJ R19MSUJTKSAkKExJQk9URl9MSUJTKSAkKE0xN05fRkxUX0xJQlMpIFwKICAgICQoTElCR05VVExT X0xJQlMpICQoTElCX1BUSFJFQUQpICQoR0VUQUREUklORk9fQV9MSUJTKSAkKExJQkxDTVMyKSBc Ci0gICAkKE5PVElGWV9MSUJTKSAkKExJQl9NQVRIKSAkKExJQlopICQoTElCTU9EVUxFUykgJChM SUJTWVNURU1EX0xJQlMpCisgICAkKE5PVElGWV9MSUJTKSAkKExJQl9NQVRIKSAkKExJQlopICQo TElCTU9EVUxFUykgJChMSUJTWVNURU1EX0xJQlMpIFwKKyAgICQoSlNPTl9MSUJTKQogCiAjIyBG T1JDRSBpdCBzbyB0aGF0IGFkbWluL3VuaWRhdGEgY2FuIGRlY2lkZSB3aGV0aGVyIHRoZXNlIGZp bGVzCiAjIyBhcmUgdXAtdG8tZGF0ZS4gIEFsdGhvdWdoIHNpbmNlIGNoYXJwcm9wIGRlcGVuZHMg b24gYm9vdHN0cmFwLWVtYWNzLApkaWZmIC0tZ2l0IGEvc3JjL2NvbmZfcG9zdC5oIGIvc3JjL2Nv bmZfcG9zdC5oCmluZGV4IGZlYmRiOGI4YmYuLjFhN2Y1MWZhNTEgMTAwNjQ0Ci0tLSBhL3NyYy9j b25mX3Bvc3QuaAorKysgYi9zcmMvY29uZl9wb3N0LmgKQEAgLTMzOCw2ICszMzgsMTIgQEAgZXh0 ZXJuIGludCBlbWFjc19zZXRlbnZfVFogKGNoYXIgY29uc3QgKik7CiAjIGRlZmluZSBBVFRSSUJV VEVfTk9fU0FOSVRJWkVfQUREUkVTUwogI2VuZGlmCiAKKyNpZiBfX2hhc19hdHRyaWJ1dGUgKHdh cm5fdW51c2VkX3Jlc3VsdCkKKyMgZGVmaW5lIEFUVFJJQlVURV9XQVJOX1VOVVNFRF9SRVNVTFQg X19hdHRyaWJ1dGVfXyAoKF9fd2Fybl91bnVzZWRfcmVzdWx0X18pKQorI2Vsc2UKKyMgZGVmaW5l IEFUVFJJQlVURV9XQVJOX1VOVVNFRF9SRVNVTFQKKyNlbmRpZgorCiAvKiBnY2MgLWZzYW5pdGl6 ZT1hZGRyZXNzIGRvZXMgbm90IHdvcmsgd2l0aCB2Zm9yayBpbiBGZWRvcmEgMjUgeDg2LTY0Lgog ICAgRm9yIG5vdywgYXNzdW1lIHRoYXQgdGhpcyBwcm9ibGVtIG9jY3VycyBvbiBhbGwgcGxhdGZv cm1zLiAgKi8KICNpZiBBRERSRVNTX1NBTklUSVpFUiAmJiAhZGVmaW5lZCB2Zm9yawpkaWZmIC0t Z2l0IGEvc3JjL2VtYWNzLmMgYi9zcmMvZW1hY3MuYwppbmRleCAwZmU3ZDkxMTNiLi4zOTc2MTAx NmVmIDEwMDY0NAotLS0gYS9zcmMvZW1hY3MuYworKysgYi9zcmMvZW1hY3MuYwpAQCAtMTYxMCw2 ICsxNjEwLDEwIEBAIFVzaW5nIGFuIEVtYWNzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgteC10b29s a2l0PWx1Y2lkIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9ibGVtCiAgICAgICBzeW1zX29mX3RocmVh ZHMgKCk7CiAgICAgICBzeW1zX29mX3Byb2ZpbGVyICgpOwogCisjaWZkZWYgSEFWRV9KU09OCisg ICAgICBzeW1zX29mX2pzb24gKCk7CisjZW5kaWYKKwogICAgICAga2V5c19vZl9jYXNlZmlkZGxl ICgpOwogICAgICAga2V5c19vZl9jbWRzICgpOwogICAgICAga2V5c19vZl9idWZmZXIgKCk7CmRp ZmYgLS1naXQgYS9zcmMvZXZhbC5jIGIvc3JjL2V2YWwuYwppbmRleCAzOWQ3ODM2NGQ1Li5lNjAx NTQ4NDVjIDEwMDY0NAotLS0gYS9zcmMvZXZhbC5jCisrKyBiL3NyYy9ldmFsLmMKQEAgLTE0MTYs NiArMTQxNiw1NyBAQCBpbnRlcm5hbF9jb25kaXRpb25fY2FzZV9uIChMaXNwX09iamVjdCAoKmJm dW4pIChwdHJkaWZmX3QsIExpc3BfT2JqZWN0ICopLAogICAgIH0KIH0KIAorc3RhdGljIExpc3Bf T2JqZWN0CitpbnRlcm5hbF9jYXRjaF9hbGxfMSAoTGlzcF9PYmplY3QgKCpmdW5jdGlvbikgKHZv aWQgKiksIHZvaWQgKmFyZ3VtZW50KQoreworICBzdHJ1Y3QgaGFuZGxlciAqYyA9IHB1c2hfaGFu ZGxlcl9ub3NpZ25hbCAoUXQsIENBVENIRVJfQUxMKTsKKyAgaWYgKGMgPT0gTlVMTCkKKyAgICBy ZXR1cm4gUWNhdGNoX2FsbF9tZW1vcnlfZnVsbDsKKworICBpZiAoc3lzX3NldGptcCAoYy0+am1w KSA9PSAwKQorICAgIHsKKyAgICAgIExpc3BfT2JqZWN0IHZhbCA9IGZ1bmN0aW9uIChhcmd1bWVu dCk7CisgICAgICBlYXNzZXJ0IChoYW5kbGVybGlzdCA9PSBjKTsKKyAgICAgIGhhbmRsZXJsaXN0 ID0gYy0+bmV4dDsKKyAgICAgIHJldHVybiB2YWw7CisgICAgfQorICBlbHNlCisgICAgeworICAg ICAgZWFzc2VydCAoaGFuZGxlcmxpc3QgPT0gYyk7CisgICAgICBMaXNwX09iamVjdCB2YWwgPSBj LT52YWw7CisgICAgICBoYW5kbGVybGlzdCA9IGMtPm5leHQ7CisgICAgICBGc2lnbmFsIChRbm9f Y2F0Y2gsIHZhbCk7CisgICAgfQorfQorCisvKiBMaWtlIGEgY29tYmluYXRpb24gb2YgaW50ZXJu YWxfY29uZGl0aW9uX2Nhc2VfMSBhbmQgaW50ZXJuYWxfY2F0Y2guCisgICBDYXRjaGVzIGFsbCBz aWduYWxzIGFuZCB0aHJvd3MuICBOZXZlciBleGl0cyBub25sb2NhbGx5OyByZXR1cm5zCisgICBR Y2F0Y2hfYWxsX21lbW9yeV9mdWxsIGlmIG5vIGhhbmRsZXIgY291bGQgYmUgYWxsb2NhdGVkLiAg Ki8KKworTGlzcF9PYmplY3QKK2ludGVybmFsX2NhdGNoX2FsbCAoTGlzcF9PYmplY3QgKCpmdW5j dGlvbikgKHZvaWQgKiksIHZvaWQgKmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICBMaXNw X09iamVjdCAoKmhhbmRsZXIpIChMaXNwX09iamVjdCkpCit7CisgIHN0cnVjdCBoYW5kbGVyICpj ID0gcHVzaF9oYW5kbGVyX25vc2lnbmFsIChRdCwgQ09ORElUSU9OX0NBU0UpOworICBpZiAoYyA9 PSBOVUxMKQorICAgIHJldHVybiBRY2F0Y2hfYWxsX21lbW9yeV9mdWxsOworCisgIGlmIChzeXNf c2V0am1wIChjLT5qbXApID09IDApCisgICAgeworICAgICAgTGlzcF9PYmplY3QgdmFsID0gaW50 ZXJuYWxfY2F0Y2hfYWxsXzEgKGZ1bmN0aW9uLCBhcmd1bWVudCk7CisgICAgICBlYXNzZXJ0ICho YW5kbGVybGlzdCA9PSBjKTsKKyAgICAgIGhhbmRsZXJsaXN0ID0gYy0+bmV4dDsKKyAgICAgIHJl dHVybiB2YWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZWFzc2VydCAoaGFuZGxlcmxp c3QgPT0gYyk7CisgICAgICBMaXNwX09iamVjdCB2YWwgPSBjLT52YWw7CisgICAgICBoYW5kbGVy bGlzdCA9IGMtPm5leHQ7CisgICAgICByZXR1cm4gaGFuZGxlciAodmFsKTsKKyAgICB9Cit9CisK IHN0cnVjdCBoYW5kbGVyICoKIHB1c2hfaGFuZGxlciAoTGlzcF9PYmplY3QgdGFnX2NoX3ZhbCwg ZW51bSBoYW5kbGVydHlwZSBoYW5kbGVydHlwZSkKIHsKQEAgLTQwNjUsNiArNDExNiw5IEBAIGFs aXN0IG9mIGFjdGl2ZSBsZXhpY2FsIGJpbmRpbmdzLiAgKi8pOwogCiAgIGluaGliaXRfbGlzcF9j b2RlID0gUW5pbDsKIAorICBERUZTWU0gKFFjYXRjaF9hbGxfbWVtb3J5X2Z1bGwsICJjYXRjaC1h bGwtbWVtb3J5LWZ1bGwiKTsKKyAgRnVuaW50ZXJuIChRY2F0Y2hfYWxsX21lbW9yeV9mdWxsLCBR bmlsKTsKKwogICBkZWZzdWJyICgmU29yKTsKICAgZGVmc3ViciAoJlNhbmQpOwogICBkZWZzdWJy ICgmU2lmKTsKZGlmZiAtLWdpdCBhL3NyYy9qc29uLmMgYi9zcmMvanNvbi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjc5YmU1NWJkNTQKLS0tIC9kZXYvbnVsbAorKysg Yi9zcmMvanNvbi5jCkBAIC0wLDAgKzEsNTE3IEBACisvKiBKU09OIHBhcnNpbmcgYW5kIHNlcmlh bGl6YXRpb24uCisKK0NvcHlyaWdodCAoQykgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s IEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgorCitHTlUgRW1hY3MgaXMg ZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMg b2YgdGhlIExpY2Vuc2UsIG9yIChhdAoreW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor CitHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgRW1hY3MuICBJZiBub3QsIHNlZSA8 aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5o PgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRl IDxqYW5zc29uLmg+CisKKyNpbmNsdWRlICJsaXNwLmgiCisjaW5jbHVkZSAiYnVmZmVyLmgiCisj aW5jbHVkZSAiY29kaW5nLmgiCisKK3N0YXRpYyBib29sCitqc29uX2hhc19wcmVmaXggKGNvbnN0 IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcHJlZml4KQoreworICBzaXplX3Qgc3RyaW5nX2xl biA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgc2l6ZV90IHByZWZpeF9sZW4gPSBzdHJsZW4gKHByZWZp eCk7CisgIHJldHVybiBzdHJpbmdfbGVuID49IHByZWZpeF9sZW4gJiYgbWVtY21wIChzdHJpbmcs IHByZWZpeCwgcHJlZml4X2xlbikgPT0gMDsKK30KKworc3RhdGljIGJvb2wKK2pzb25faGFzX3N1 ZmZpeCAoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgIHNpemVf dCBzdHJpbmdfbGVuID0gc3RybGVuIChzdHJpbmcpOworICBzaXplX3Qgc3VmZml4X2xlbiA9IHN0 cmxlbiAoc3VmZml4KTsKKyAgcmV0dXJuIHN0cmluZ19sZW4gPj0gc3VmZml4X2xlbgorICAgICYm IG1lbWNtcCAoc3RyaW5nICsgc3RyaW5nX2xlbiAtIHN1ZmZpeF9sZW4sIHN1ZmZpeCwgc3VmZml4 X2xlbikgPT0gMDsKK30KKworc3RhdGljIExpc3BfT2JqZWN0Citqc29uX21ha2Vfc3RyaW5nIChj b25zdCBjaGFyICpkYXRhLCBwdHJkaWZmX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIG1ha2Vfc3BlY2lm aWVkX3N0cmluZyAoZGF0YSwgLTEsIHNpemUsIHRydWUpOworfQorCitzdGF0aWMgTGlzcF9PYmpl Y3QKK2pzb25fYnVpbGRfc3RyaW5nIChjb25zdCBjaGFyICpkYXRhKQoreworICBzaXplX3Qgc2l6 ZSA9IHN0cmxlbiAoZGF0YSk7CisgIGVhc3NlcnQgKHNpemUgPCBQVFJESUZGX01BWCk7CisgIHJl dHVybiBqc29uX21ha2Vfc3RyaW5nIChkYXRhLCBzaXplKTsKK30KKworc3RhdGljIExpc3BfT2Jq ZWN0Citqc29uX2VuY29kZSAoTGlzcF9PYmplY3Qgc3RyaW5nKQoreworICByZXR1cm4gY29kZV9j b252ZXJ0X3N0cmluZyAoc3RyaW5nLCBRdXRmXzhfdW5peCwgUXQsIHRydWUsIHRydWUsIHRydWUp OworfQorCitzdGF0aWMgX05vcmV0dXJuIHZvaWQKK2pzb25fb3V0X29mX21lbW9yeSAodm9pZCkK K3sKKyAgeHNpZ25hbDAgKFFqc29uX291dF9vZl9tZW1vcnkpOworfQorCitzdGF0aWMgX05vcmV0 dXJuIHZvaWQKK2pzb25fcGFyc2VfZXJyb3IgKGNvbnN0IGpzb25fZXJyb3JfdCAqZXJyb3IpCit7 CisgIExpc3BfT2JqZWN0IHN5bWJvbDsKKyAgaWYgKGpzb25faGFzX3N1ZmZpeCAoZXJyb3ItPnRl eHQsICJleHBlY3RlZCBuZWFyIGVuZCBvZiBmaWxlIikpCisgICAgc3ltYm9sID0gUWpzb25fZW5k X29mX2ZpbGU7CisgIGVsc2UgaWYgKGpzb25faGFzX3ByZWZpeCAoZXJyb3ItPnRleHQsICJlbmQg b2YgZmlsZSBleHBlY3RlZCIpKQorICAgIHN5bWJvbCA9IFFqc29uX3RyYWlsaW5nX2NvbnRlbnQ7 CisgIGVsc2UKKyAgICBzeW1ib2wgPSBRanNvbl9wYXJzZV9lcnJvcjsKKyAgeHNpZ25hbCAoc3lt Ym9sLAorICAgICAgICAgICBsaXN0NSAoanNvbl9idWlsZF9zdHJpbmcgKGVycm9yLT50ZXh0KSwK KyAgICAgICAgICAgICAgICAgIGpzb25fYnVpbGRfc3RyaW5nIChlcnJvci0+c291cmNlKSwgbWFr ZV9uYXRudW0gKGVycm9yLT5saW5lKSwKKyAgICAgICAgICAgICAgICAgIG1ha2VfbmF0bnVtIChl cnJvci0+Y29sdW1uKSwgbWFrZV9uYXRudW0gKGVycm9yLT5wb3NpdGlvbikpKTsKK30KKworc3Rh dGljIHZvaWQKK2pzb25fcmVsZWFzZV9vYmplY3QgKHZvaWQgKm9iamVjdCkKK3sKKyAganNvbl9k ZWNyZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19zdHJpbmdfd2l0aG91dF9l bWJlZGRlZF9udWxscyAoTGlzcF9PYmplY3Qgb2JqZWN0KQoreworICBDSEVDS19TVFJJTkcgKG9i amVjdCk7CisgIENIRUNLX1RZUEUgKG1lbWNociAoU0RBVEEgKG9iamVjdCksICdcMCcsIFNCWVRF UyAob2JqZWN0KSkgPT0gTlVMTCwKKyAgICAgICAgICAgICAgUXN0cmluZ193aXRob3V0X2VtYmVk ZGVkX251bGxzX3AsIG9iamVjdCk7Cit9CisKK3N0YXRpYyBBVFRSSUJVVEVfV0FSTl9VTlVTRURf UkVTVUxUIGpzb25fdCAqCitqc29uX2NoZWNrIChqc29uX3QgKm9iamVjdCkKK3sKKyAgaWYgKG9i amVjdCA9PSBOVUxMKQorICAgIGpzb25fb3V0X29mX21lbW9yeSAoKTsKKyAgcmV0dXJuIG9iamVj dDsKK30KKworc3RhdGljIGpzb25fdCAqbGlzcF90b19qc29uIChMaXNwX09iamVjdCkgQVRUUklC VVRFX1dBUk5fVU5VU0VEX1JFU1VMVDsKKworLyogVGhpcyByZXR1cm5zIExpc3BfT2JqZWN0IHNv IHdlIGNhbiB1c2UgdW5iaW5kX3RvLiAgVGhlIHJldHVybiB2YWx1ZQorICAgaXMgYWx3YXlzIG5p bC4gICovCisKK3N0YXRpYyBfR0xfQVJHX05PTk5VTEwgKCgyKSkgTGlzcF9PYmplY3QKK2xpc3Bf dG9fanNvbl90b3BsZXZlbF8xIChMaXNwX09iamVjdCBsaXNwLCBqc29uX3QgKipqc29uKQorewor ICBpZiAoVkVDVE9SUCAobGlzcCkpCisgICAgeworICAgICAgcHRyZGlmZl90IHNpemUgPSBBU0la RSAobGlzcCk7CisgICAgICBlYXNzZXJ0IChzaXplID49IDApOworICAgICAgaWYgKHNpemUgPiBT SVpFX01BWCkKKyAgICAgICAgeHNpZ25hbDEgKFFvdmVyZmxvd19lcnJvciwgYnVpbGRfc3RyaW5n ICgidmVjdG9yIGlzIHRvbyBsb25nIikpOworICAgICAgKmpzb24gPSBqc29uX2NoZWNrIChqc29u X2FycmF5ICgpKTsKKyAgICAgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQRExfSU5ERVggKCk7Cisg ICAgICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBqc29u KTsKKyAgICAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICB7 CisgICAgICAgICAgaW50IHN0YXR1cworICAgICAgICAgICAgPSBqc29uX2FycmF5X2FwcGVuZF9u ZXcgKCpqc29uLCBsaXNwX3RvX2pzb24gKEFSRUYgKGxpc3AsIGkpKSk7CisgICAgICAgICAgaWYg KHN0YXR1cyA9PSAtMSkKKyAgICAgICAgICAgIGpzb25fb3V0X29mX21lbW9yeSAoKTsKKyAgICAg ICAgICBlYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgICAgIH0KKyAgICAgIGVhc3NlcnQgKGpz b25fYXJyYXlfc2l6ZSAoKmpzb24pID09IHNpemUpOworICAgICAgY2xlYXJfdW53aW5kX3Byb3Rl Y3QgKGNvdW50KTsKKyAgICAgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBRbmlsKTsKKyAgICB9 CisgIGVsc2UgaWYgKEhBU0hfVEFCTEVfUCAobGlzcCkpCisgICAgeworICAgICAgc3RydWN0IExp c3BfSGFzaF9UYWJsZSAqaCA9IFhIQVNIX1RBQkxFIChsaXNwKTsKKyAgICAgICpqc29uID0ganNv bl9jaGVjayAoanNvbl9vYmplY3QgKCkpOworICAgICAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BE TF9JTkRFWCAoKTsKKyAgICAgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIgKGpzb25fcmVsZWFz ZV9vYmplY3QsICpqc29uKTsKKyAgICAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgSEFTSF9U QUJMRV9TSVpFIChoKTsgKytpKQorICAgICAgICBpZiAoIU5JTFAgKEhBU0hfSEFTSCAoaCwgaSkp KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExpc3BfT2JqZWN0IGtleSA9IGpzb25fZW5jb2Rl IChIQVNIX0tFWSAoaCwgaSkpOworICAgICAgICAgICAgLyogV2UgY2Fu4oCZdCBzcGVjaWZ5IHRo ZSBsZW5ndGgsIHNvIHRoZSBzdHJpbmcgbXVzdCBiZQorICAgICAgICAgICAgICAgbnVsbC10ZXJt aW5hdGVkLiAgKi8KKyAgICAgICAgICAgIGNoZWNrX3N0cmluZ193aXRob3V0X2VtYmVkZGVkX251 bGxzIChrZXkpOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IGpzb25fb2JqZWN0X3NldF9uZXcg KCpqc29uLCBTU0RBVEEgKGtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbGlzcF90b19qc29uIChIQVNIX1ZBTFVFIChoLCBpKSkpOworICAgICAgICAg ICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgICAgICAganNvbl9vdXRfb2ZfbWVtb3J5ICgp OworICAgICAgICAgICAgZWFzc2VydCAoc3RhdHVzID09IDApOworICAgICAgICAgIH0KKyAgICAg IGNsZWFyX3Vud2luZF9wcm90ZWN0IChjb3VudCk7CisgICAgICByZXR1cm4gdW5iaW5kX3RvIChj b3VudCwgUW5pbCk7CisgICAgfQorICB3cm9uZ190eXBlX2FyZ3VtZW50IChRanNvbl92YWx1ZV9w LCBsaXNwKTsKK30KKworc3RhdGljIEFUVFJJQlVURV9XQVJOX1VOVVNFRF9SRVNVTFQganNvbl90 ICoKK2xpc3BfdG9fanNvbl90b3BsZXZlbCAoTGlzcF9PYmplY3QgbGlzcCkKK3sKKyAgaWYgKCsr bGlzcF9ldmFsX2RlcHRoID4gbWF4X2xpc3BfZXZhbF9kZXB0aCkKKyAgICB4c2lnbmFsMCAoUWpz b25fb2JqZWN0X3Rvb19kZWVwKTsKKyAganNvbl90ICpqc29uOworICBsaXNwX3RvX2pzb25fdG9w bGV2ZWxfMSAobGlzcCwgJmpzb24pOworICAtLWxpc3BfZXZhbF9kZXB0aDsKKyAgcmV0dXJuIGpz b247Cit9CisKK3N0YXRpYyBBVFRSSUJVVEVfV0FSTl9VTlVTRURfUkVTVUxUIGpzb25fdCAqCits aXNwX3RvX2pzb24gKExpc3BfT2JqZWN0IGxpc3ApCit7CisgIGlmIChFUSAobGlzcCwgUUNudWxs KSkKKyAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl9udWxsICgpKTsKKyAgZWxzZSBpZiAoRVEg KGxpc3AsIFFDZmFsc2UpKQorICAgIHJldHVybiBqc29uX2NoZWNrIChqc29uX2ZhbHNlICgpKTsK KyAgZWxzZSBpZiAoRVEgKGxpc3AsIFF0KSkKKyAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl90 cnVlICgpKTsKKyAgZWxzZSBpZiAoSU5URUdFUlAgKGxpc3ApKQorICAgIHsKKyAgICAgIENIRUNL X1RZUEVfUkFOR0VEX0lOVEVHRVIgKGpzb25faW50X3QsIGxpc3ApOworICAgICAgcmV0dXJuIGpz b25fY2hlY2sgKGpzb25faW50ZWdlciAoWElOVCAobGlzcCkpKTsKKyAgICB9CisgIGVsc2UgaWYg KEZMT0FUUCAobGlzcCkpCisgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpzb25fcmVhbCAoWEZMT0FU X0RBVEEgKGxpc3ApKSk7CisgIGVsc2UgaWYgKFNUUklOR1AgKGxpc3ApKQorICAgIHsKKyAgICAg IExpc3BfT2JqZWN0IGVuY29kZWQgPSBqc29uX2VuY29kZSAobGlzcCk7CisgICAgICBwdHJkaWZm X3Qgc2l6ZSA9IFNCWVRFUyAoZW5jb2RlZCk7CisgICAgICBlYXNzZXJ0IChzaXplID49IDApOwor ICAgICAgaWYgKHNpemUgPiBTSVpFX01BWCkKKyAgICAgICAgeHNpZ25hbDEgKFFvdmVyZmxvd19l cnJvciwgYnVpbGRfc3RyaW5nICgic3RyaW5nIGlzIHRvbyBsb25nIikpOworICAgICAgcmV0dXJu IGpzb25fY2hlY2sgKGpzb25fc3RyaW5nbiAoU1NEQVRBIChlbmNvZGVkKSwgc2l6ZSkpOworICAg IH0KKworICAvKiBMSVNQIG5vdyBtdXN0IGJlIGEgdmVjdG9yIG9yIGhhc2h0YWJsZS4gICovCisg IHJldHVybiBsaXNwX3RvX2pzb25fdG9wbGV2ZWwgKGxpc3ApOworfQorCitERUZVTiAoImpzb24t c2VyaWFsaXplIiwgRmpzb25fc2VyaWFsaXplLCBTanNvbl9zZXJpYWxpemUsIDEsIDEsIE5VTEws CisgICAgICAgZG9jOiAvKiBSZXR1cm4gdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgT0JKRUNU IGFzIGEgc3RyaW5nLgorT0JKRUNUIG11c3QgYmUgYSB2ZWN0b3Igb3IgaGFzaHRhYmxlLCBhbmQg aXRzIGVsZW1lbnRzIGNhbiByZWN1cnNpdmVseQorY29udGFpbiBgOm51bGwnLCBgOmZhbHNlJywg dCwgbnVtYmVycywgc3RyaW5ncywgb3Igb3RoZXIgdmVjdG9ycyBhbmQKK2hhc2h0YWJsZXMuICBg Om51bGwnLCBgOmZhbHNlJywgYW5kIHQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gSlNPTiBudWxsLAor ZmFsc2UsIGFuZCB0cnVlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiAgVmVjdG9ycyB3aWxsIGJlIGNv bnZlcnRlZCB0bworSlNPTiBhcnJheXMsIGFuZCBoYXNodGFibGVzIHRvIEpTT04gb2JqZWN0cy4g IEhhc2h0YWJsZSBrZXlzIG11c3QgYmUKK3N0cmluZ3Mgd2l0aG91dCBlbWJlZGRlZCBudWxsIGNo YXJhY3RlcnMgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbgorZWFjaCBvYmplY3QuICAqLykKKyAg KExpc3BfT2JqZWN0IG9iamVjdCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRF WCAoKTsKKworICBqc29uX3QgKmpzb24gPSBsaXNwX3RvX2pzb25fdG9wbGV2ZWwgKG9iamVjdCk7 CisgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIgKGpzb25fcmVsZWFzZV9vYmplY3QsIGpzb24p OworCisgIGNoYXIgKnN0cmluZyA9IGpzb25fZHVtcHMgKGpzb24sIEpTT05fQ09NUEFDVCk7Cisg IGlmIChzdHJpbmcgPT0gTlVMTCkKKyAgICBqc29uX291dF9vZl9tZW1vcnkgKCk7CisgIHJlY29y ZF91bndpbmRfcHJvdGVjdF9wdHIgKGZyZWUsIHN0cmluZyk7CisKKyAgcmV0dXJuIHVuYmluZF90 byAoY291bnQsIGpzb25fYnVpbGRfc3RyaW5nIChzdHJpbmcpKTsKK30KKworc3RydWN0IGpzb25f YnVmZmVyX2FuZF9zaXplCit7CisgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKKyAgc2l6ZV90IHNpemU7 Cit9OworCitzdGF0aWMgTGlzcF9PYmplY3QKK2pzb25faW5zZXJ0ICh2b2lkICpkYXRhKQorewor ICBjb25zdCBzdHJ1Y3QganNvbl9idWZmZXJfYW5kX3NpemUgKmJ1ZmZlcl9hbmRfc2l6ZSA9IGRh dGE7CisgIGlmIChidWZmZXJfYW5kX3NpemUtPnNpemUgPiBQVFJESUZGX01BWCkKKyAgICB4c2ln bmFsMSAoUW92ZXJmbG93X2Vycm9yLCBidWlsZF9zdHJpbmcgKCJidWZmZXIgdG9vIGxhcmdlIikp OworICBpbnNlcnQgKGJ1ZmZlcl9hbmRfc2l6ZS0+YnVmZmVyLCBidWZmZXJfYW5kX3NpemUtPnNp emUpOworICByZXR1cm4gUW5pbDsKK30KKworc3RydWN0IGpzb25faW5zZXJ0X2RhdGEKK3sKKyAg LyogbmlsIGlmIGpzb25faW5zZXJ0IHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIHRoZSBzeW1ib2wKKyAg ICAgUWNhdGNoX2FsbF9tZW1vcnlfZnVsbCBvciBhIGNvbnMgKEVSUk9SLVNZTUJPTCAuIEVSUk9S LURBVEEpLiAgKi8KKyAgTGlzcF9PYmplY3QgZXJyb3I7Cit9OworCitzdGF0aWMgaW50Citqc29u X2luc2VydF9jYWxsYmFjayAoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAq ZGF0YSkKK3sKKyAgLyogVGhpcyBmdW5jdGlvbiBtYXkgbm90IGV4aXQgbm9ubG9jYWxseS4gICov CisgIHN0cnVjdCBqc29uX2luc2VydF9kYXRhICpkID0gZGF0YTsKKyAgc3RydWN0IGpzb25fYnVm ZmVyX2FuZF9zaXplIGJ1ZmZlcl9hbmRfc2l6ZQorICAgID0gey5idWZmZXIgPSBidWZmZXIsIC5z aXplID0gc2l6ZX07CisgIGQtPmVycm9yID0gaW50ZXJuYWxfY2F0Y2hfYWxsIChqc29uX2luc2Vy dCwgJmJ1ZmZlcl9hbmRfc2l6ZSwgRmlkZW50aXR5KTsKKyAgcmV0dXJuIE5JTFAgKGQtPmVycm9y KSA/IDAgOiAtMTsKK30KKworREVGVU4gKCJqc29uLWluc2VydCIsIEZqc29uX2luc2VydCwgU2pz b25faW5zZXJ0LCAxLCAxLCBOVUxMLAorICAgICAgIGRvYzogLyogSW5zZXJ0IHRoZSBKU09OIHJl cHJlc2VudGF0aW9uIG9mIE9CSkVDVCBiZWZvcmUgcG9pbnQuCitUaGlzIGlzIHRoZSBzYW1lIGFz IChpbnNlcnQgKGpzb24tc2VyaWFsaXplIE9CSkVDVCkpLCBidXQgcG90ZW50aWFsbHkKK2Zhc3Rl ci4gIFNlZSB0aGUgZnVuY3Rpb24gYGpzb24tc2VyaWFsaXplJyBmb3IgYWxsb3dlZCB2YWx1ZXMg b2YKK09CSkVDVC4gICovKQorICAoTGlzcF9PYmplY3Qgb2JqZWN0KQoreworICBwdHJkaWZmX3Qg Y291bnQgPSBTUEVDUERMX0lOREVYICgpOworCisgIGpzb25fdCAqanNvbiA9IGxpc3BfdG9fanNv biAob2JqZWN0KTsKKyAgcmVjb3JkX3Vud2luZF9wcm90ZWN0X3B0ciAoanNvbl9yZWxlYXNlX29i amVjdCwganNvbik7CisKKyAgc3RydWN0IGpzb25faW5zZXJ0X2RhdGEgZGF0YTsKKyAgaW50IHN0 YXR1cworICAgID0ganNvbl9kdW1wX2NhbGxiYWNrIChqc29uLCBqc29uX2luc2VydF9jYWxsYmFj aywgJmRhdGEsIEpTT05fQ09NUEFDVCk7CisgIGlmIChzdGF0dXMgPT0gLTEpCisgICAgeworICAg ICAgaWYgKENPTlNQIChkYXRhLmVycm9yKSkKKyAgICAgICAgeHNpZ25hbCAoWENBUiAoZGF0YS5l cnJvciksIFhDRFIgKGRhdGEuZXJyb3IpKTsKKyAgICAgIGVsc2UKKyAgICAgICAganNvbl9vdXRf b2ZfbWVtb3J5ICgpOworICAgIH0KKyAgZWFzc2VydCAoc3RhdHVzID09IDApOworICBlYXNzZXJ0 IChOSUxQIChkYXRhLmVycm9yKSk7CisgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBRbmlsKTsK K30KKworc3RhdGljIF9HTF9BUkdfTk9OTlVMTCAoKDEpKSBMaXNwX09iamVjdAoranNvbl90b19s aXNwIChqc29uX3QgKmpzb24pCit7CisgIHN3aXRjaCAoanNvbl90eXBlb2YgKGpzb24pKQorICAg IHsKKyAgICBjYXNlIEpTT05fTlVMTDoKKyAgICAgIHJldHVybiBRQ251bGw7CisgICAgY2FzZSBK U09OX0ZBTFNFOgorICAgICAgcmV0dXJuIFFDZmFsc2U7CisgICAgY2FzZSBKU09OX1RSVUU6Cisg ICAgICByZXR1cm4gUXQ7CisgICAgY2FzZSBKU09OX0lOVEVHRVI6CisgICAgICB7CisgICAgICAg IGpzb25faW50X3QgdmFsdWUgPSBqc29uX2ludGVnZXJfdmFsdWUgKGpzb24pOworICAgICAgICBp ZiAoRklYTlVNX09WRVJGTE9XX1AgKHZhbHVlKSkKKyAgICAgICAgICB4c2lnbmFsMSAoUW92ZXJm bG93X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICBidWlsZF9zdHJpbmcgKCJKU09OIGludGVn ZXIgaXMgdG9vIGxhcmdlIikpOworICAgICAgICByZXR1cm4gbWFrZV9udW1iZXIgKHZhbHVlKTsK KyAgICAgIH0KKyAgICBjYXNlIEpTT05fUkVBTDoKKyAgICAgIHJldHVybiBtYWtlX2Zsb2F0IChq c29uX3JlYWxfdmFsdWUgKGpzb24pKTsKKyAgICBjYXNlIEpTT05fU1RSSU5HOgorICAgICAgewor ICAgICAgICBzaXplX3Qgc2l6ZSA9IGpzb25fc3RyaW5nX2xlbmd0aCAoanNvbik7CisgICAgICAg IGlmIChGSVhOVU1fT1ZFUkZMT1dfUCAoc2l6ZSkpCisgICAgICAgICAgeHNpZ25hbDEgKFFvdmVy Zmxvd19lcnJvciwgYnVpbGRfc3RyaW5nICgiSlNPTiBzdHJpbmcgaXMgdG9vIGxvbmciKSk7Cisg ICAgICAgIHJldHVybiBqc29uX21ha2Vfc3RyaW5nIChqc29uX3N0cmluZ192YWx1ZSAoanNvbiks IHNpemUpOworICAgICAgfQorICAgIGNhc2UgSlNPTl9BUlJBWToKKyAgICAgIHsKKyAgICAgICAg aWYgKCsrbGlzcF9ldmFsX2RlcHRoID4gbWF4X2xpc3BfZXZhbF9kZXB0aCkKKyAgICAgICAgICB4 c2lnbmFsMCAoUWpzb25fb2JqZWN0X3Rvb19kZWVwKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBq c29uX2FycmF5X3NpemUgKGpzb24pOworICAgICAgICBpZiAoRklYTlVNX09WRVJGTE9XX1AgKHNp emUpKQorICAgICAgICAgIHhzaWduYWwxIChRb3ZlcmZsb3dfZXJyb3IsIGJ1aWxkX3N0cmluZyAo IkpTT04gYXJyYXkgaXMgdG9vIGxvbmciKSk7CisgICAgICAgIExpc3BfT2JqZWN0IHJlc3VsdCA9 IEZtYWtlX3ZlY3RvciAobWFrZV9uYXRudW0gKHNpemUpLCBRdW5ib3VuZCk7CisgICAgICAgIGZv ciAocHRyZGlmZl90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICAgIEFTRVQgKHJlc3Vs dCwgaSwKKyAgICAgICAgICAgICAgICBqc29uX3RvX2xpc3AgKGpzb25fYXJyYXlfZ2V0IChqc29u LCBpKSkpOworICAgICAgICAtLWxpc3BfZXZhbF9kZXB0aDsKKyAgICAgICAgcmV0dXJuIHJlc3Vs dDsKKyAgICAgIH0KKyAgICBjYXNlIEpTT05fT0JKRUNUOgorICAgICAgeworICAgICAgICBpZiAo KytsaXNwX2V2YWxfZGVwdGggPiBtYXhfbGlzcF9ldmFsX2RlcHRoKQorICAgICAgICAgIHhzaWdu YWwwIChRanNvbl9vYmplY3RfdG9vX2RlZXApOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGpzb25f b2JqZWN0X3NpemUgKGpzb24pOworICAgICAgICBpZiAoRklYTlVNX09WRVJGTE9XX1AgKHNpemUp KQorICAgICAgICAgIHhzaWduYWwxIChRb3ZlcmZsb3dfZXJyb3IsCisgICAgICAgICAgICAgICAg ICAgIGJ1aWxkX3N0cmluZyAoIkpTT04gb2JqZWN0IGhhcyB0b28gbWFueSBlbGVtZW50cyIpKTsK KyAgICAgICAgTGlzcF9PYmplY3QgcmVzdWx0ID0gQ0FMTE4gKEZtYWtlX2hhc2hfdGFibGUsIFFD dGVzdCwgUWVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNzaXpl LCBtYWtlX25hdG51bSAoc2l6ZSkpOworICAgICAgICBzdHJ1Y3QgTGlzcF9IYXNoX1RhYmxlICpo ID0gWEhBU0hfVEFCTEUgKHJlc3VsdCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmtleV9zdHI7Cisg ICAgICAgIGpzb25fdCAqdmFsdWU7CisgICAgICAgIGpzb25fb2JqZWN0X2ZvcmVhY2ggKGpzb24s IGtleV9zdHIsIHZhbHVlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExpc3BfT2JqZWN0IGtl eSA9IGpzb25fYnVpbGRfc3RyaW5nIChrZXlfc3RyKTsKKyAgICAgICAgICAgIEVNQUNTX1VJTlQg aGFzaDsKKyAgICAgICAgICAgIHB0cmRpZmZfdCBpID0gaGFzaF9sb29rdXAgKGgsIGtleSwgJmhh c2gpOworICAgICAgICAgICAgZWFzc2VydCAoaSA8IDApOworICAgICAgICAgICAgaGFzaF9wdXQg KGgsIGtleSwganNvbl90b19saXNwICh2YWx1ZSksIGhhc2gpOworICAgICAgICAgIH0KKyAgICAg ICAgLS1saXNwX2V2YWxfZGVwdGg7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9Cisg ICAgfQorICAvKiBDYW7igJl0IGdldCBoZXJlLiAgKi8KKyAgZW1hY3NfYWJvcnQgKCk7Cit9CisK K0RFRlVOICgianNvbi1wYXJzZS1zdHJpbmciLCBGanNvbl9wYXJzZV9zdHJpbmcsIFNqc29uX3Bh cnNlX3N0cmluZywgMSwgMSwgTlVMTCwKKyAgICAgICBkb2M6IC8qIFBhcnNlIHRoZSBKU09OIFNU UklORyBpbnRvIGEgTGlzcCBvYmplY3QuCitUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSByZXZlcnNl IG9wZXJhdGlvbiBvZiBganNvbi1zZXJpYWxpemUnLCB3aGljaAorc2VlLiAgVGhlIHJldHVybmVk IG9iamVjdCB3aWxsIGJlIGEgdmVjdG9yIG9yIGhhc2h0YWJsZS4gIEl0cyBlbGVtZW50cword2ls bCBiZSBgOm51bGwnLCBgOmZhbHNlJywgdCwgbnVtYmVycywgc3RyaW5ncywgb3IgZnVydGhlciB2 ZWN0b3JzIGFuZAoraGFzaHRhYmxlcy4gIElmIHRoZXJlIGFyZSBkdXBsaWNhdGUga2V5cyBpbiBh biBvYmplY3QsIGFsbCBidXQgdGhlCitsYXN0IG9uZSBhcmUgaWdub3JlZC4gIElmIFNUUklORyBk b2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBKU09OIG9iamVjdCwKK2FuIGVycm9yIG9mIHR5cGUgYGpz b24tcGFyc2UtZXJyb3InIGlzIHNpZ25hbGVkLiAgKi8pCisgIChMaXNwX09iamVjdCBzdHJpbmcp Cit7CisgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQRExfSU5ERVggKCk7CisgIExpc3BfT2JqZWN0 IGVuY29kZWQgPSBqc29uX2VuY29kZSAoc3RyaW5nKTsKKyAgY2hlY2tfc3RyaW5nX3dpdGhvdXRf ZW1iZWRkZWRfbnVsbHMgKGVuY29kZWQpOworCisgIGpzb25fZXJyb3JfdCBlcnJvcjsKKyAganNv bl90ICpvYmplY3QgPSBqc29uX2xvYWRzIChTU0RBVEEgKGVuY29kZWQpLCAwLCAmZXJyb3IpOwor ICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAganNvbl9wYXJzZV9lcnJvciAoJmVycm9yKTsKKwor ICAvKiBBdm9pZCBsZWFraW5nIHRoZSBvYmplY3QgaW4gY2FzZSBvZiBmdXJ0aGVyIGVycm9ycy4g ICovCisgIGlmIChvYmplY3QgIT0gTlVMTCkKKyAgICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRy IChqc29uX3JlbGVhc2Vfb2JqZWN0LCBvYmplY3QpOworCisgIHJldHVybiB1bmJpbmRfdG8gKGNv dW50LCBqc29uX3RvX2xpc3AgKG9iamVjdCkpOworfQorCitzdHJ1Y3QganNvbl9yZWFkX2J1ZmZl cl9kYXRhCit7CisgIHB0cmRpZmZfdCBwb2ludDsKK307CisKK3N0YXRpYyBzaXplX3QKK2pzb25f cmVhZF9idWZmZXJfY2FsbGJhY2sgKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgdm9pZCAq ZGF0YSkKK3sKKyAgc3RydWN0IGpzb25fcmVhZF9idWZmZXJfZGF0YSAqZCA9IGRhdGE7CisKKyAg LyogRmlyc3QsIHBhcnNlIGZyb20gcG9pbnQgdG8gdGhlIGdhcCBvciB0aGUgZW5kIG9mIHRoZSBh Y2Nlc3NpYmxlCisgICAgIHBvcnRpb24sIHdoYXRldmVyIGlzIGNsb3Nlci4gICovCisgIHB0cmRp ZmZfdCBwb2ludCA9IGQtPnBvaW50OworICBwdHJkaWZmX3QgZW5kOworICB7CisgICAgYm9vbCBv dmVyZmxvdyA9IElOVF9BRERfV1JBUFYgKEJVRkZFUl9DRUlMSU5HX09GIChwb2ludCksIDEsICZl bmQpOworICAgIGVhc3NlcnQgKCFvdmVyZmxvdyk7CisgIH0KKyAgc2l6ZV90IGNvdW50OworICB7 CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9TVUJUUkFDVF9XUkFQViAoZW5kLCBwb2ludCwgJmNv dW50KTsKKyAgICBlYXNzZXJ0ICghb3ZlcmZsb3cpOworICB9CisgIGlmIChidWZsZW4gPCBjb3Vu dCkKKyAgICBjb3VudCA9IGJ1ZmxlbjsKKyAgbWVtY3B5IChidWZmZXIsIEJZVEVfUE9TX0FERFIg KHBvaW50KSwgY291bnQpOworICB7CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9BRERfV1JBUFYg KGQtPnBvaW50LCBjb3VudCwgJmQtPnBvaW50KTsKKyAgICBlYXNzZXJ0ICghb3ZlcmZsb3cpOwor ICB9CisgIHJldHVybiBjb3VudDsKK30KKworREVGVU4gKCJqc29uLXBhcnNlLWJ1ZmZlciIsIEZq c29uX3BhcnNlX2J1ZmZlciwgU2pzb25fcGFyc2VfYnVmZmVyLAorICAgICAgIDAsIDAsIE5VTEws CisgICAgICAgZG9jOiAvKiBSZWFkIEpTT04gb2JqZWN0IGZyb20gY3VycmVudCBidWZmZXIgc3Rh cnRpbmcgYXQgcG9pbnQuCitUaGlzIGlzIHNpbWlsYXIgdG8gYGpzb24tcGFyc2Utc3RyaW5nJywg d2hpY2ggc2VlLiAgTW92ZSBwb2ludCBhZnRlcgordGhlIGVuZCBvZiB0aGUgb2JqZWN0IGlmIHBh cnNpbmcgd2FzIHN1Y2Nlc3NmdWwuICBPbiBlcnJvciwgcG9pbnQgaXMKK25vdCBtb3ZlZC4gICov KQorICAodm9pZCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKwor ICBwdHJkaWZmX3QgcG9pbnQgPSBQVF9CWVRFOworICBzdHJ1Y3QganNvbl9yZWFkX2J1ZmZlcl9k YXRhIGRhdGEgPSB7LnBvaW50ID0gcG9pbnR9OworICBqc29uX2Vycm9yX3QgZXJyb3I7CisgIGpz b25fdCAqb2JqZWN0ID0ganNvbl9sb2FkX2NhbGxiYWNrIChqc29uX3JlYWRfYnVmZmVyX2NhbGxi YWNrLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT05f RElTQUJMRV9FT0ZfQ0hFQ0ssICZlcnJvcik7CisKKyAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAg IGpzb25fcGFyc2VfZXJyb3IgKCZlcnJvcik7CisKKyAgLyogQXZvaWQgbGVha2luZyB0aGUgb2Jq ZWN0IGluIGNhc2Ugb2YgZnVydGhlciBlcnJvcnMuICAqLworICByZWNvcmRfdW53aW5kX3Byb3Rl Y3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBvYmplY3QpOworCisgIC8qIENvbnZlcnQgYW5k IHRoZW4gbW92ZSBwb2ludCBvbmx5IGlmIGV2ZXJ5dGhpbmcgc3VjY2VlZGVkLiAgKi8KKyAgTGlz cF9PYmplY3QgbGlzcCA9IGpzb25fdG9fbGlzcCAob2JqZWN0KTsKKworICB7CisgICAgLyogQWRq dXN0IHBvaW50IGJ5IGhvdyBtdWNoIHdlIGp1c3QgcmVhZC4gIERvIHRoaXMgaGVyZSBiZWNhdXNl CisgICAgICAgdG9rZW5lci0+Y2hhcl9vZmZzZXQgYmVjb21lcyBpbmNvcnJlY3QgYmVsb3cuICAq LworICAgIGJvb2wgb3ZlcmZsb3cgPSBJTlRfQUREX1dSQVBWIChwb2ludCwgZXJyb3IucG9zaXRp b24sICZwb2ludCk7CisgICAgZWFzc2VydCAoIW92ZXJmbG93KTsKKyAgICBlYXNzZXJ0IChwb2lu dCA8PSBaVl9CWVRFKTsKKyAgICBTRVRfUFRfQk9USCAoQllURV9UT19DSEFSIChwb2ludCksIHBv aW50KTsKKyAgfQorCisgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBsaXNwKTsKK30KKworLyog U2ltcGxpZmllZCB2ZXJzaW9uIG9mIOKAmGRlZmluZS1lcnJvcuKAmSB0aGF0IHdvcmtzIHdpdGgg cHVyZQorICAgb2JqZWN0cy4gICovCisKK3N0YXRpYyB2b2lkCitkZWZpbmVfZXJyb3IgKExpc3Bf T2JqZWN0IG5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIExpc3BfT2JqZWN0IHBhcmVudCkKK3sK KyAgZWFzc2VydCAoU1lNQk9MUCAobmFtZSkpOworICBlYXNzZXJ0IChTWU1CT0xQIChwYXJlbnQp KTsKKyAgTGlzcF9PYmplY3QgcGFyZW50X2NvbmRpdGlvbnMgPSBGZ2V0IChwYXJlbnQsIFFlcnJv cl9jb25kaXRpb25zKTsKKyAgZWFzc2VydCAoQ09OU1AgKHBhcmVudF9jb25kaXRpb25zKSk7Cisg IGVhc3NlcnQgKCFOSUxQIChGbWVtcSAocGFyZW50LCBwYXJlbnRfY29uZGl0aW9ucykpKTsKKyAg ZWFzc2VydCAoTklMUCAoRm1lbXEgKG5hbWUsIHBhcmVudF9jb25kaXRpb25zKSkpOworICBGcHV0 IChuYW1lLCBRZXJyb3JfY29uZGl0aW9ucywgcHVyZV9jb25zIChuYW1lLCBwYXJlbnRfY29uZGl0 aW9ucykpOworICBGcHV0IChuYW1lLCBRZXJyb3JfbWVzc2FnZSwgYnVpbGRfcHVyZV9jX3N0cmlu ZyAobWVzc2FnZSkpOworfQorCit2b2lkCitzeW1zX29mX2pzb24gKHZvaWQpCit7CisgIERFRlNZ TSAoUUNudWxsLCAiOm51bGwiKTsKKyAgREVGU1lNIChRQ2ZhbHNlLCAiOmZhbHNlIik7CisKKyAg REVGU1lNIChRc3RyaW5nX3dpdGhvdXRfZW1iZWRkZWRfbnVsbHNfcCwgInN0cmluZy13aXRob3V0 LWVtYmVkZGVkLW51bGxzLXAiKTsKKyAgREVGU1lNIChRanNvbl92YWx1ZV9wLCAianNvbi12YWx1 ZS1wIik7CisKKyAgREVGU1lNIChRdXRmXzhfdW5peCwgInV0Zi04LXVuaXgiKTsKKworICBERUZT WU0gKFFqc29uX2Vycm9yLCAianNvbi1lcnJvciIpOworICBERUZTWU0gKFFqc29uX291dF9vZl9t ZW1vcnksICJqc29uLW91dC1vZi1tZW1vcnkiKTsKKyAgREVGU1lNIChRanNvbl9wYXJzZV9lcnJv ciwgImpzb24tcGFyc2UtZXJyb3IiKTsKKyAgREVGU1lNIChRanNvbl9lbmRfb2ZfZmlsZSwgImpz b24tZW5kLW9mLWZpbGUiKTsKKyAgREVGU1lNIChRanNvbl90cmFpbGluZ19jb250ZW50LCAianNv bi10cmFpbGluZy1jb250ZW50Iik7CisgIERFRlNZTSAoUWpzb25fb2JqZWN0X3Rvb19kZWVwLCAi anNvbi1vYmplY3QtdG9vLWRlZXAiKTsKKyAgZGVmaW5lX2Vycm9yIChRanNvbl9lcnJvciwgImdl bmVyaWMgSlNPTiBlcnJvciIsIFFlcnJvcik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fb3V0X29m X21lbW9yeSwgIm5vIGZyZWUgbWVtb3J5IGZvciBjcmVhdGluZyBKU09OIG9iamVjdCIsCisgICAg ICAgICAgICAgICAgUWpzb25fZXJyb3IpOworICBkZWZpbmVfZXJyb3IgKFFqc29uX3BhcnNlX2Vy cm9yLCAiY291bGQgbm90IHBhcnNlIEpTT04gc3RyZWFtIiwKKyAgICAgICAgICAgICAgICBRanNv bl9lcnJvcik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fZW5kX29mX2ZpbGUsICJlbmQgb2YgSlNP TiBzdHJlYW0iLCBRanNvbl9wYXJzZV9lcnJvcik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fdHJh aWxpbmdfY29udGVudCwgInRyYWlsaW5nIGNvbnRlbnQgYWZ0ZXIgSlNPTiBzdHJlYW0iLAorICAg ICAgICAgICAgICAgIFFqc29uX3BhcnNlX2Vycm9yKTsKKyAgZGVmaW5lX2Vycm9yIChRanNvbl9v YmplY3RfdG9vX2RlZXAsCisgICAgICAgICAgICAgICAgIm9iamVjdCBjeWNsaWMgb3IgTGlzcCBl dmFsdWF0aW9uIHRvbyBkZWVwIiwgUWpzb25fZXJyb3IpOworCisgIERFRlNZTSAoUXB1cmUsICJw dXJlIik7CisgIERFRlNZTSAoUXNpZGVfZWZmZWN0X2ZyZWUsICJzaWRlLWVmZmVjdC1mcmVlIik7 CisKKyAgREVGU1lNIChRanNvbl9zZXJpYWxpemUsICJqc29uLXNlcmlhbGl6ZSIpOworICBERUZT WU0gKFFqc29uX3BhcnNlX3N0cmluZywgImpzb24tcGFyc2Utc3RyaW5nIik7CisgIEZwdXQgKFFq c29uX3NlcmlhbGl6ZSwgUXB1cmUsIFF0KTsKKyAgRnB1dCAoUWpzb25fc2VyaWFsaXplLCBRc2lk ZV9lZmZlY3RfZnJlZSwgUXQpOworICBGcHV0IChRanNvbl9wYXJzZV9zdHJpbmcsIFFwdXJlLCBR dCk7CisgIEZwdXQgKFFqc29uX3BhcnNlX3N0cmluZywgUXNpZGVfZWZmZWN0X2ZyZWUsIFF0KTsK KworICBkZWZzdWJyICgmU2pzb25fc2VyaWFsaXplKTsKKyAgZGVmc3ViciAoJlNqc29uX2luc2Vy dCk7CisgIGRlZnN1YnIgKCZTanNvbl9wYXJzZV9zdHJpbmcpOworICBkZWZzdWJyICgmU2pzb25f cGFyc2VfYnVmZmVyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9saXNwLmggYi9zcmMvbGlzcC5oCmlu ZGV4IDBjM2NhM2FlMDYuLjdlY2FkNDBmMzAgMTAwNjQ0Ci0tLSBhL3NyYy9saXNwLmgKKysrIGIv c3JjL2xpc3AuaApAQCAtMzQ0MCw2ICszNDQwLDExIEBAIGV4dGVybiBpbnQgeF9iaXRtYXBfbWFz ayAoc3RydWN0IGZyYW1lICosIHB0cmRpZmZfdCk7CiBleHRlcm4gdm9pZCByZXNldF9pbWFnZV90 eXBlcyAodm9pZCk7CiBleHRlcm4gdm9pZCBzeW1zX29mX2ltYWdlICh2b2lkKTsKIAorI2lmZGVm IEhBVkVfSlNPTgorLyogRGVmaW5lZCBpbiBqc29uLmMuICAqLworZXh0ZXJuIHZvaWQgc3ltc19v Zl9qc29uICh2b2lkKTsKKyNlbmRpZgorCiAvKiBEZWZpbmVkIGluIGluc2RlbC5jLiAgKi8KIGV4 dGVybiB2b2lkIG1vdmVfZ2FwX2JvdGggKHB0cmRpZmZfdCwgcHRyZGlmZl90KTsKIGV4dGVybiBf Tm9yZXR1cm4gdm9pZCBidWZmZXJfb3ZlcmZsb3cgKHZvaWQpOwpAQCAtMzg2Myw2ICszODY4LDcg QEAgZXh0ZXJuIExpc3BfT2JqZWN0IGludGVybmFsX2NvbmRpdGlvbl9jYXNlXzIgKExpc3BfT2Jq ZWN0ICgqKSAoTGlzcF9PYmplY3QsIExpc3AKIGV4dGVybiBMaXNwX09iamVjdCBpbnRlcm5hbF9j b25kaXRpb25fY2FzZV9uCiAgICAgKExpc3BfT2JqZWN0ICgqKSAocHRyZGlmZl90LCBMaXNwX09i amVjdCAqKSwgcHRyZGlmZl90LCBMaXNwX09iamVjdCAqLAogICAgICBMaXNwX09iamVjdCwgTGlz cF9PYmplY3QgKCopIChMaXNwX09iamVjdCwgcHRyZGlmZl90LCBMaXNwX09iamVjdCAqKSk7Citl eHRlcm4gTGlzcF9PYmplY3QgaW50ZXJuYWxfY2F0Y2hfYWxsIChMaXNwX09iamVjdCAoKikgKHZv aWQgKiksIHZvaWQgKiwgTGlzcF9PYmplY3QgKCopIChMaXNwX09iamVjdCkpOwogZXh0ZXJuIHN0 cnVjdCBoYW5kbGVyICpwdXNoX2hhbmRsZXIgKExpc3BfT2JqZWN0LCBlbnVtIGhhbmRsZXJ0eXBl KTsKIGV4dGVybiBzdHJ1Y3QgaGFuZGxlciAqcHVzaF9oYW5kbGVyX25vc2lnbmFsIChMaXNwX09i amVjdCwgZW51bSBoYW5kbGVydHlwZSk7CiBleHRlcm4gdm9pZCBzcGVjYmluZCAoTGlzcF9PYmpl Y3QsIExpc3BfT2JqZWN0KTsKZGlmZiAtLWdpdCBhL3Rlc3Qvc3JjL2pzb24tdGVzdHMuZWwgYi90 ZXN0L3NyYy9qc29uLXRlc3RzLmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAuLjg4MjBjNjgyYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3NyYy9qc29uLXRlc3RzLmVs CkBAIC0wLDAgKzEsOTcgQEAKKzs7OyBqc29uLXRlc3RzLmVsIC0tLSB1bml0IHRlc3RzIGZvciBq c29uLmMgICAgICAgICAgLSotIGxleGljYWwtYmluZGluZzogdDsgLSotCisKKzs7IENvcHlyaWdo dCAoQykgMjAxNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworOzsgVGhpcyBmaWxl IGlzIHBhcnQgb2YgR05VIEVtYWNzLgorCis7OyBHTlUgRW1hY3MgaXMgZnJlZSBzb2Z0d2FyZTog eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorOzsgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7 IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExp Y2Vuc2UsIG9yCis7OyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCis7OyBH TlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKzs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCis7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorCis7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorOzsgYWxvbmcgd2l0aCBHTlUgRW1hY3MuICBJ ZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCis7OzsgQ29tbWVu dGFyeToKKworOzsgVW5pdCB0ZXN0cyBmb3Igc3JjL2pzb24uYy4KKworOzs7IENvZGU6CisKKyhy ZXF1aXJlICdjbC1saWIpCisocmVxdWlyZSAnbWFwKQorCisoZXJ0LWRlZnRlc3QganNvbi1zZXJp YWxpemUvcm91bmR0cmlwICgpCisgIChsZXQgKChsaXNwIFs6bnVsbCA6ZmFsc2UgdCAwIDEyMyAt NDU2IDMuNzUgImZvbyJdKQorICAgICAgICAoanNvbiAiW251bGwsZmFsc2UsdHJ1ZSwwLDEyMywt NDU2LDMuNzUsXCJmb29cIl0iKSkKKyAgICAoc2hvdWxkIChlcXVhbCAoanNvbi1zZXJpYWxpemUg bGlzcCkganNvbikpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgIChqc29uLWluc2VydCBs aXNwKQorICAgICAgKHNob3VsZCAoZXF1YWwgKGJ1ZmZlci1zdHJpbmcpIGpzb24pKQorICAgICAg KHNob3VsZCAoZW9icCkpKQorICAgIChzaG91bGQgKGVxdWFsIChqc29uLXBhcnNlLXN0cmluZyBq c29uKSBsaXNwKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKGluc2VydCBqc29uKQor ICAgICAgKGdvdG8tY2hhciAxKQorICAgICAgKHNob3VsZCAoZXF1YWwgKGpzb24tcGFyc2UtYnVm ZmVyKSBsaXNwKSkKKyAgICAgIChzaG91bGQgKGVvYnApKSkpKQorCisoZXJ0LWRlZnRlc3QganNv bi1zZXJpYWxpemUvb2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAobWFrZS1oYXNoLXRhYmxlIDp0 ZXN0ICMnZXF1YWwpKSkKKyAgICAocHV0aGFzaCAiYWJjIiBbMSAyIHRdIHRhYmxlKQorICAgIChw dXRoYXNoICJkZWYiIDpudWxsIHRhYmxlKQorICAgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlh bGl6ZSB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAie1wiYWJjXCI6WzEsMix0cnVlXSxcImRl ZlwiOm51bGx9IikpKSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFyc2Utc3RyaW5nL29iamVjdCAo KQorICAobGV0ICgoYWN0dWFsCisgICAgICAgICAoanNvbi1wYXJzZS1zdHJpbmcKKyAgICAgICAg ICAieyBcImFiY1wiIDogWzEsIDIsIHRydWVdLCBcImRlZlwiIDogbnVsbCwgXCJhYmNcIiA6IFs5 LCBmYWxzZV0gfVxuIikpKQorICAgIChzaG91bGQgKGhhc2gtdGFibGUtcCBhY3R1YWwpKQorICAg IChzaG91bGQgKGVxdWFsIChoYXNoLXRhYmxlLWNvdW50IGFjdHVhbCkgMikpCisgICAgKHNob3Vs ZCAoZXF1YWwgKGNsLXNvcnQgKG1hcC1wYWlycyBhY3R1YWwpICMnc3RyaW5nPCA6a2V5ICMnY2Fy KQorICAgICAgICAgICAgICAgICAgICcoKCJhYmMiIC4gWzkgOmZhbHNlXSkgKCJkZWYiIC4gOm51 bGwpKSkpKSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFyc2Utc3RyaW5nL3N0cmluZyAoKQorICAo c2hvdWxkLWVycm9yIChqc29uLXBhcnNlLXN0cmluZyAiW1wiZm9ybWZlZWRcZlwiXSIpIDp0eXBl ICdqc29uLXBhcnNlLWVycm9yKQorICAoc2hvdWxkIChlcXVhbCAoanNvbi1wYXJzZS1zdHJpbmcg IltcImZvbyBcXFwiYmFyXFxcIlwiXSIpIFsiZm9vIFwiYmFyXCIiXSkpCisgIChzaG91bGQgKGVx dWFsIChqc29uLXBhcnNlLXN0cmluZyAiW1wiYWJjzrHOss6zXCJdIikgWyJhYmPOsc6yzrMiXSkp CisgIChzaG91bGQgKGVxdWFsIChqc29uLXBhcnNlLXN0cmluZyAiW1wiXFxuYXNkXFx1MDQ0NFxc dTA0NGJcXHUwNDMyZmdoXFx0XCJdIikKKyAgICAgICAgICAgICAgICAgWyJcbmFzZNGE0YvQsmZn aFx0Il0pKQorICAoc2hvdWxkIChlcXVhbCAoanNvbi1wYXJzZS1zdHJpbmcgIltcIlxcdUQ4MzRc XHVERDFFXCJdIikgWyJcVTAwMDFEMTFFIl0pKQorICAoc2hvdWxkLWVycm9yIChqc29uLXBhcnNl LXN0cmluZyAiZm9vIikgOnR5cGUgJ2pzb24tcGFyc2UtZXJyb3IpKQorCisoZXJ0LWRlZnRlc3Qg anNvbi1zZXJpYWxpemUvc3RyaW5nICgpCisgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6 ZSBbImZvbyJdKSAiW1wiZm9vXCJdIikpCisgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6 ZSBbImFcblxmYiJdKSAiW1wiYVxcblxcZmJcIl0iKSkKKyAgKHNob3VsZCAoZXF1YWwgKGpzb24t c2VyaWFsaXplIFsiXG5hc2TRhNGL0LJcdTAwMWZcdTAwN2ZmZ2hcdCJdKQorICAgICAgICAgICAg ICAgICAiW1wiXFxuYXNk0YTRi9CyXFx1MDAxRlx1MDA3ZmZnaFxcdFwiXSIpKSkKKworKGVydC1k ZWZ0ZXN0IGpzb24tcGFyc2Utc3RyaW5nL2luY29tcGxldGUgKCkKKyAgKHNob3VsZC1lcnJvciAo anNvbi1wYXJzZS1zdHJpbmcgIlsxMjMiKSA6dHlwZSAnanNvbi1lbmQtb2YtZmlsZSkpCisKKyhl cnQtZGVmdGVzdCBqc29uLXBhcnNlLXN0cmluZy90cmFpbGluZyAoKQorICAoc2hvdWxkLWVycm9y IChqc29uLXBhcnNlLXN0cmluZyAiWzEyM10gWzQ1Nl0iKSA6dHlwZSAnanNvbi10cmFpbGluZy1j b250ZW50KSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFyc2UtYnVmZmVyL2luY29tcGxldGUgKCkK KyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAoaW5zZXJ0ICJbMTIzIikKKyAgICAoZ290by1jaGFy IDEpCisgICAgKHNob3VsZC1lcnJvciAoanNvbi1wYXJzZS1idWZmZXIpIDp0eXBlICdqc29uLWVu ZC1vZi1maWxlKQorICAgIChzaG91bGQgKGJvYnApKSkpCisKKyhlcnQtZGVmdGVzdCBqc29uLXBh cnNlLWJ1ZmZlci90cmFpbGluZyAoKQorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChpbnNlcnQg IlsxMjNdIFs0NTZdIikKKyAgICAoZ290by1jaGFyIDEpCisgICAgKHNob3VsZCAoZXF1YWwgKGpz b24tcGFyc2UtYnVmZmVyKSBbMTIzXSkpCisgICAgKHNob3VsZC1ub3QgKGJvYnApKQorICAgIChz aG91bGQgKGxvb2tpbmctYXQtcCAocnggIiBbNDU2XSIgZW9zKSkpKSkKKworKHByb3ZpZGUgJ2pz b24tdGVzdHMpCis7OzsganNvbi10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIuMTQuMQoK --94eb2c1c10026361b3055a6f4e07--