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: Sun, 29 Oct 2017 22:49:56 +0000 Message-ID: References: <87poaqhc63.fsf@lifelogs.com> <8360ceh5f1.fsf@gnu.org> <83h8vl5lf9.fsf@gnu.org> <83r2um3fqi.fsf@gnu.org> <43520b71-9e25-926c-d744-78098dad6441@cs.ucla.edu> <83o9pnzddc.fsf@gnu.org> <472176ce-846b-1f24-716b-98eb95ceaa47@cs.ucla.edu> <83d163z6dy.fsf@gnu.org> <73477c99-1600-a53d-d84f-737837d0f91f@cs.ucla.edu> <83poa2ya8j.fsf@gnu.org> <21b0ba97-ed49-43ae-e86f-63fba762353a@cs.ucla.edu> <83lgkqxe3l.fsf@gnu.org> <903b4aaa-36e6-9985-7313-177d9d34b7ec@cs.ucla.edu> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="001a1144b3daf4b6aa055cb75728" X-Trace: blaine.gmane.org 1509317441 14992 195.159.176.226 (29 Oct 2017 22:50:41 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 29 Oct 2017 22:50:41 +0000 (UTC) Cc: Eli Zaretskii , emacs-devel@gnu.org To: Paul Eggert Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Oct 29 23:50:35 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 1e8wPX-0002sn-V8 for ged-emacs-devel@m.gmane.org; Sun, 29 Oct 2017 23:50:32 +0100 Original-Received: from localhost ([::1]:37943 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e8wPf-0007xK-9u for ged-emacs-devel@m.gmane.org; Sun, 29 Oct 2017 18:50:39 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56280) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e8wPL-0007x2-Pp for emacs-devel@gnu.org; Sun, 29 Oct 2017 18:50:24 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e8wPG-0004nO-OP for emacs-devel@gnu.org; Sun, 29 Oct 2017 18:50:19 -0400 Original-Received: from mail-qt0-x22a.google.com ([2607:f8b0:400d:c0d::22a]:56010) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e8wPA-0004h4-SY; Sun, 29 Oct 2017 18:50:09 -0400 Original-Received: by mail-qt0-x22a.google.com with SMTP id v41so14252953qtv.12; Sun, 29 Oct 2017 15:50:08 -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=5cAIRGHVVi+aPFlVXyJD2R4d7vitRccxmsJRi2OHXDU=; b=GsS3qUfNkVcc/san6/X/Ek2N+y+c0cInabTY9toKWJouq3qCHY+MHyDJSEL1Clr7Qu Z+/XEdu6Puwq1aYGN2N1GF9xLU1LDEKtUz79TsKtB2ATxpAfMoxBmrlf92p+v3cXWvun JbMwWoeWLRkqxVkZJmn5SpMYcFEA6FcAB2PEqd+kimmGetSkzgg5Eo7nSGlFvlwQok/J l2TvkHvdgvGP7Fw3745V9PdZi72a7TQK2/lQu7x0UJihudZ+u0Rlm4CpXi5S81BE108i KpMjFiO1sSARuQAm+nT5KUhbN+LRxBnwJK3LV7SP4V1ph6Gotja3rMhD7fZyDrKrGdJq lfIw== 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=5cAIRGHVVi+aPFlVXyJD2R4d7vitRccxmsJRi2OHXDU=; b=SUMr5cUfgHbPdXD/O967UQ6yrT/VfSa5MY3DMVo2ICazkKr+9OlolD6QUlzjR/S9Pv jShLi1mRpfAttT0lZUEpZ1EziObffFD/IZYcHEdm9Rmc1HG4l4GUeM9zRGOE0Td/sAes r8R7xFvrypD8VEtJRwxgcrDpazAuvN0B4crgf+YNt6W0neo8yGzi+rqqB3r/bUggUk3X PSEEXIPGPn54bWDgN5zAS5FMg5QetcKDC+rRwCIcdfXhIs6DOB9pbKZpeZWNtMX3WAMq uopZC6B2Uv9E9hh86WgYkUNVgAMEpkvXfR/Rrp124Q16AAcMD7m+zbGlzc86X9Yqdksy BJ6w== X-Gm-Message-State: AMCzsaVbXJK7qZqOCWe7ncduByuY3mKfS0ydbv4xOi/SCqA8t29MPqHJ Te5GKwVUjN3fa0Ac7gcAhyk5LMml2B62c//LdWs= X-Google-Smtp-Source: ABhQp+S10xeid+hPWqmeN4CPpMH4JEnkUi0uWLoVqGIwPUyxS16wCBzfJSkYw/ht14YVn6NWQomKaHHi/hk3t6j5Mms= X-Received: by 10.200.9.52 with SMTP id t49mr11529736qth.160.1509317407867; Sun, 29 Oct 2017 15:50:07 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::22a 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:219822 Archived-At: --001a1144b3daf4b6aa055cb75728 Content-Type: multipart/alternative; boundary="001a1144b3daf4b6a7055cb75726" --001a1144b3daf4b6a7055cb75726 Content-Type: text/plain; charset="UTF-8" Philipp Stephani schrieb am So., 29. Okt. 2017 um 21:48 Uhr: > Paul Eggert schrieb am Mo., 9. Okt. 2017 um > 08:19 Uhr: > >> Philipp Stephani wrote: >> > I don't think Jansson can use xmalloc because xmalloc can exit >> nonlocally, >> > which is not expected by a third-party library such as Jansson. It could >> > use a suitable wrapper of lmalloc, though. >> >> That would be overkill, as lmalloc arranges for Lisp alignment, which >> Jansson >> does not need. We could define new functions (smalloc and srealloc, say), >> that >> act like malloc and realloc except they return NULL for requests larger >> than >> PTRDIFF_MAX. Right now, I expect only the JSON code needs this sort of >> thing so >> we could put the new functions in json.c. If other code needs it later we >> could >> move these new functions to alloc.c. >> > > Yes, that sounds reasonable. > Here's a new patch that incorporates some of these changes. Specifically: - I've removed some of the assertions - I've installed a custom allocator, as you suggested - Reverted back to creating a temporary string and inserting that into the buffer. Anything else just doesn't seem to work or seems way too complex. - Introduced explicit encoding and decoding. I suspect that will lead to a massive performance hit, but I haven't done any benchmarks yet. - Added manual section and NEWS entry --001a1144b3daf4b6a7055cb75726 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Philip= p Stephani <p.stephani2@gmail.c= om> schrieb am So., 29. Okt. 2017 um 21:48=C2=A0Uhr:
Paul Eggert <eggert@cs.ucla.edu> schrieb am Mo., 9. Okt. 2017 um 08:19=C2= =A0Uhr:
Philipp Stephani wrote:
> I don't think Jansson can use xmalloc because xmalloc can exit non= locally,
> which is not expected by a third-party library such as Jansson. It cou= ld
> use a suitable wrapper of lmalloc, though.

That would be overkill, as lmalloc arranges for Lisp alignment, which Janss= on
does not need. We could define new functions (smalloc and srealloc, say), t= hat
act like malloc and realloc except they return NULL for requests larger tha= n
PTRDIFF_MAX. Right now, I expect only the JSON code needs this sort of thin= g so
we could put the new functions in json.c. If other code needs it later we c= ould
move these new functions to alloc.c.

<= /div>
Yes, that sounds reas= onable.=C2=A0

Here's = a new patch that incorporates some of these changes. Specifically:

- I've removed some of the assertions
- I= 9;ve installed a custom allocator, as you suggested
- Reverted ba= ck to creating a temporary string and inserting that into the buffer. Anyth= ing else just doesn't seem to work or seems way too complex.
= - Introduced explicit encoding and decoding. I suspect that will lead to a = massive performance hit, but I haven't done any benchmarks yet.
- Added manual section and NEWS entry=C2=A0
--001a1144b3daf4b6a7055cb75726-- --001a1144b3daf4b6aa055cb75728 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: <15f6a53b9111bd849ac1> X-Attachment-Id: 15f6a53b9111bd849ac1 RnJvbSBhN2E3NGNmYzQwYzRjYWNhYjA0N2Y1ZGEyMzljN2I3MTUwYmI5NTczIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IE1vbiwgMTggU2VwIDIwMTcgMTA6NTE6MzkgKzAyMDAKU3ViamVjdDogW1BBVENIXSBJbXBs ZW1lbnQgbmF0aXZlIEpTT04gc3VwcG9ydCB1c2luZyBKYW5zc29uCgoqIGNvbmZpZ3VyZS5hYzog TmV3IG9wdGlvbiAtLXdpdGgtanNvbi4KCiogc3JjL2pzb24uYyAoRmpzb25fc2VyaWFsaXplLCBG anNvbl9pbnNlcnQsIEZqc29uX3BhcnNlX3N0cmluZykKKEZqc29uX3BhcnNlX2J1ZmZlcik6IE5l dyBkZWZ1bnMuCihqc29uX21hbGxvYywganNvbl9mcmVlLCBqc29uX2hhc19wcmVmaXgsIGpzb25f aGFzX3N1ZmZpeCkKKGpzb25fbWFrZV9zdHJpbmcsIGpzb25fYnVpbGRfc3RyaW5nLCBqc29uX2Vu Y29kZSkKKGpzb25fb3V0X29mX21lbW9yeSwganNvbl9wYXJzZV9lcnJvcikKKGpzb25fcmVsZWFz ZV9vYmplY3QsIGNoZWNrX3N0cmluZ193aXRob3V0X2VtYmVkZGVkX251bGxzLCBqc29uX2NoZWNr KQoobGlzcF90b19qc29uLCBsaXNwX3RvX2pzb25fdG9wbGV2ZWwsIGxpc3BfdG9fanNvbl90b3Bs ZXZlbF8xKQooanNvbl9pbnNlcnQsIGpzb25faW5zZXJ0X2NhbGxiYWNrLCBqc29uX3RvX2xpc3Ap Cihqc29uX3JlYWRfYnVmZmVyX2NhbGxiYWNrLCBGanNvbl9wYXJzZV9idWZmZXIsIGRlZmluZV9l cnJvcik6IE5ldwpoZWxwZXIgZnVuY3Rpb25zLgooaW5pdF9qc29uLCBzeW1zX29mX2pzb24pOiBO ZXcgZmlsZS4KCiogc3JjL2xpc3AuaDogRGVjbGFyYXRpb24gZm9yIGluaXRfanNvbiBhbmQgc3lt c19vZl9qc29uLgoKKiBzcmMvZW1hY3MuYyAobWFpbik6IEVuYWJsZSBKU09OIGZ1bmN0aW9ucy4K Ciogc3JjL2V2YWwuYyAoaW50ZXJuYWxfY2F0Y2hfYWxsLCBpbnRlcm5hbF9jYXRjaF9hbGxfMSk6 IE5ldyBoZWxwZXIKZnVuY3Rpb25zIHRvIGNhdGNoIGFsbCBzaWduYWxzLgooc3ltc19vZl9ldmFs KTogQWRkIHVuaW50ZXJuZWQgc3ltYm9sIHRvIHNpZ25pZnkgb3V0IG9mIG1lbW9yeS4KCiogc3Jj L01ha2VmaWxlLmluIChKU09OX0xJQlMsIEpTT05fQ0ZMQUdTLCBKU09OX09CSiwgRU1BQ1NfQ0ZM QUdTKQooYmFzZV9vYmosIExJQkVTKTogQ29tcGlsZSBqc29uLmMgaWYgLS13aXRoLWpzb24gaXMg ZW5hYmxlZC4KCiogdGVzdC9zcmMvanNvbi10ZXN0cy5lbCAoanNvbi1zZXJpYWxpemUvcm91bmR0 cmlwKQooanNvbi1zZXJpYWxpemUvb2JqZWN0LCBqc29uLXBhcnNlLXN0cmluZy9vYmplY3QpCihq c29uLXBhcnNlLXN0cmluZy9zdHJpbmcsIGpzb24tc2VyaWFsaXplL3N0cmluZykKKGpzb24tcGFy c2Utc3RyaW5nL2luY29tcGxldGUsIGpzb24tcGFyc2Utc3RyaW5nL3RyYWlsaW5nKQooanNvbi1w YXJzZS1idWZmZXIvaW5jb21wbGV0ZSwganNvbi1wYXJzZS1idWZmZXIvdHJhaWxpbmcpOiBOZXcg dW5pdAp0ZXN0cy4KCiogZG9jL2xpc3ByZWYvdGV4dC50ZXhpIChQYXJzaW5nIEpTT04pOiBOZXcg bWFudWFsIHNlY3Rpb24uCi0tLQogY29uZmlndXJlLmFjICAgICAgICAgICB8ICAyMCArLQogZG9j L2xpc3ByZWYvdGV4dC50ZXhpICB8ICA4NyArKysrKysrKwogZXRjL05FV1MgICAgICAgICAgICAg ICB8ICAxMSArCiBzcmMvTWFrZWZpbGUuaW4gICAgICAgIHwgIDExICstCiBzcmMvZW1hY3MuYyAg ICAgICAgICAgIHwgICA4ICsKIHNyYy9ldmFsLmMgICAgICAgICAgICAgfCAgNTQgKysrKysKIHNy Yy9qc29uLmMgICAgICAgICAgICAgfCA1NzYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwogc3JjL2xpc3AuaCAgICAgICAgICAgICB8ICAgNyArCiB0ZXN0 L3NyYy9qc29uLXRlc3RzLmVsIHwgIDk3ICsrKysrKysrKwogOSBmaWxlcyBjaGFuZ2VkLCA4Njcg aW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvanNv bi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdC9zcmMvanNvbi10ZXN0cy5lbAoKZGlmZiAtLWdp dCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCA3NDM3ZWI5MGQyLi5iYTg2MDBj NjFhIDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0zNTUs NiArMzU1LDcgQEAgQUNfREVGVU4KIE9QVElPTl9ERUZBVUxUX09GRihbY2Fpcm9dLFtjb21waWxl IHdpdGggQ2Fpcm8gZHJhd2luZyAoZXhwZXJpbWVudGFsKV0pCiBPUFRJT05fREVGQVVMVF9PTihb eG1sMl0sW2Rvbid0IGNvbXBpbGUgd2l0aCBYTUwgcGFyc2luZyBzdXBwb3J0XSkKIE9QVElPTl9E RUZBVUxUX09OKFtpbWFnZW1hZ2lja10sW2Rvbid0IGNvbXBpbGUgd2l0aCBJbWFnZU1hZ2ljayBp bWFnZSBzdXBwb3J0XSkKK09QVElPTl9ERUZBVUxUX09OKFtqc29uXSwgW2Rvbid0IGNvbXBpbGUg d2l0aCBuYXRpdmUgSlNPTiBzdXBwb3J0XSkKIAogT1BUSU9OX0RFRkFVTFRfT04oW3hmdF0sW2Rv bid0IHVzZSBYRlQgZm9yIGFudGkgYWxpYXNlZCBmb250c10pCiBPUFRJT05fREVGQVVMVF9PTihb bGlib3RmXSxbZG9uJ3QgdXNlIGxpYm90ZiBmb3IgT3BlblR5cGUgZm9udCBzdXBwb3J0XSkKQEAg LTI4NTksNiArMjg2MCwyMiBAQCBBQ19ERUZVTgogQUNfU1VCU1QoTElCU1lTVEVNRF9MSUJTKQog QUNfU1VCU1QoTElCU1lTVEVNRF9DRkxBR1MpCiAKK0hBVkVfSlNPTj1ubworSlNPTl9PQko9CisK K2lmIHRlc3QgIiR7d2l0aF9qc29ufSIgPSB5ZXM7IHRoZW4KKyAgRU1BQ1NfQ0hFQ0tfTU9EVUxF UyhbSlNPTl0sIFtqYW5zc29uID49IDIuNV0sCisgICAgW0hBVkVfSlNPTj15ZXNdLCBbSEFWRV9K U09OPW5vXSkKKyAgaWYgdGVzdCAiJHtIQVZFX0pTT059IiA9IHllczsgdGhlbgorICAgIEFDX0RF RklORShIQVZFX0pTT04sIDEsIFtEZWZpbmUgaWYgdXNpbmcgSmFuc3Nvbi5dKQorICAgIEpTT05f T0JKPWpzb24ubworICBmaQorZmkKKworQUNfU1VCU1QoSlNPTl9MSUJTKQorQUNfU1VCU1QoSlNP Tl9DRkxBR1MpCitBQ19TVUJTVChKU09OX09CSikKKwogTk9USUZZX09CSj0KIE5PVElGWV9TVU1N QVJZPW5vCiAKQEAgLTUzNzAsNyArNTM4Nyw3IEBAIEFDX0RFRlVOCiBmb3Igb3B0IGluIFhBVzNE IFhQTSBKUEVHIFRJRkYgR0lGIFBORyBSU1ZHIENBSVJPIElNQUdFTUFHSUNLIFNPVU5EIEdQTSBE QlVTIFwKICAgR0NPTkYgR1NFVFRJTkdTIE5PVElGWSBBQ0wgTElCU0VMSU5VWCBHTlVUTFMgTElC WE1MMiBGUkVFVFlQRSBNMTdOX0ZMVCBcCiAgIExJQk9URiBYRlQgWkxJQiBUT09MS0lUX1NDUk9M TF9CQVJTIFhfVE9PTEtJVCBPTERYTUVOVSBYMTEgTlMgTU9EVUxFUyBcCi0gIFhXSURHRVRTIExJ QlNZU1RFTUQgQ0FOTk9UX0RVTVAgTENNUzI7IGRvCisgIFhXSURHRVRTIExJQlNZU1RFTUQgSlNP TiBDQU5OT1RfRFVNUCBMQ01TMjsgZG8KIAogICAgIGNhc2UgJG9wdCBpbgogICAgICAgQ0FOTk9U X0RVTVApIGV2YWwgdmFsPVwkeyRvcHR9IDs7CkBAIC01NDIwLDYgKzU0MzcsNyBAQCBBQ19ERUZV TgogICBEb2VzIEVtYWNzIHVzZSAtbG90Zj8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICR7SEFWRV9MSUJPVEZ9CiAgIERvZXMgRW1hY3MgdXNlIC1seGZ0PyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJHtIQVZFX1hGVH0KICAgRG9lcyBFbWFjcyB1c2UgLWxzeXN0 ZW1kPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0hBVkVfTElCU1lTVEVNRH0KKyAg RG9lcyBFbWFjcyB1c2UgLWxqYW5zc29uPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk e0hBVkVfSlNPTn0KICAgRG9lcyBFbWFjcyBkaXJlY3RseSB1c2UgemxpYj8gICAgICAgICAgICAg ICAgICAgICAgICAgICAke0hBVkVfWkxJQn0KICAgRG9lcyBFbWFjcyBoYXZlIGR5bmFtaWMgbW9k dWxlcyBzdXBwb3J0PyAgICAgICAgICAgICAgICAke0hBVkVfTU9EVUxFU30KICAgRG9lcyBFbWFj cyB1c2UgdG9vbGtpdCBzY3JvbGwgYmFycz8gICAgICAgICAgICAgICAgICAgICAke1VTRV9UT09M S0lUX1NDUk9MTF9CQVJTfQpkaWZmIC0tZ2l0IGEvZG9jL2xpc3ByZWYvdGV4dC50ZXhpIGIvZG9j L2xpc3ByZWYvdGV4dC50ZXhpCmluZGV4IGJhYTNjNzA4ZTkuLjIxN2E5YmE4OGIgMTAwNjQ0Ci0t LSBhL2RvYy9saXNwcmVmL3RleHQudGV4aQorKysgYi9kb2MvbGlzcHJlZi90ZXh0LnRleGkKQEAg LTYxLDYgKzYxLDcgQEAgVGV4dAogKiBDaGVja3N1bS9IYXNoOjogICAgQ29tcHV0aW5nIGNyeXB0 b2dyYXBoaWMgaGFzaGVzLgogKiBHbnVUTFMgQ3J5cHRvZ3JhcGh5OjogQ3J5cHRvZ3JhcGhpYyBh bGdvcml0aG1zIGltcG9ydGVkIGZyb20gR251VExTLgogKiBQYXJzaW5nIEhUTUwvWE1MOjogUGFy c2luZyBIVE1MIGFuZCBYTUwuCisqIFBhcnNpbmcgSlNPTjo6ICAgICBQYXJzaW5nIGFuZCBnZW5l cmF0aW5nIEpTT04gdmFsdWVzLgogKiBBdG9taWMgQ2hhbmdlczo6ICAgSW5zdGFsbGluZyBzZXZl cmFsIGJ1ZmZlciBjaGFuZ2VzIGF0b21pY2FsbHkuCiAqIENoYW5nZSBIb29rczo6ICAgICBTdXBw bHlpbmcgZnVuY3Rpb25zIHRvIGJlIHJ1biB3aGVuIHRleHQgaXMgY2hhbmdlZC4KIEBlbmQgbWVu dQpAQCAtNDkxMSw2ICs0OTEyLDkyIEBAIERvY3VtZW50IE9iamVjdCBNb2RlbAogQGVuZCB0YWJs ZQogCiAKK0Bub2RlIFBhcnNpbmcgSlNPTgorQHNlY3Rpb24gUGFyc2luZyBhbmQgZ2VuZXJhdGlu ZyBKU09OIHZhbHVlcworQGNpbmRleCBKU09OCisKKyAgV2hlbiBFbWFjcyBpcyBjb21waWxlZCB3 aXRoIEpTT04gc3VwcG9ydCwgaXQgcHJvdmlkZXMgYSBjb3VwbGUgb2YKK2Z1bmN0aW9ucyB0byBj b252ZXJ0IGJldHdlZW4gTGlzcCBvYmplY3RzIGFuZCBKU09OIHZhbHVlcy4gIEFueSBKU09OCit2 YWx1ZSBjYW4gYmUgY29udmVydGVkIHRvIGEgTGlzcCBvYmplY3QsIGJ1dCBub3QgdmljZSB2ZXJz YS4KK1NwZWNpZmljYWxseToKKworQGl0ZW1pemUKKworQGl0ZW0KK0pTT04gaGFzIGEgY291cGxl IG9mIGtleXdvcmRzOiBAY29kZXtudWxsfSwgQGNvZGV7ZmFsc2V9LCBhbmQKK0Bjb2Rle3RydWV9 LiAgVGhlc2UgYXJlIHJlcHJlc2VudGVkIGluIExpc3AgdXNpbmcgdGhlIGtleXdvcmRzCitAY29k ZXs6bnVsbH0sIEBjb2RlezpmYWxzZX0sIGFuZCBAY29kZXt0fSwgcmVzcGVjdGl2ZWx5LgorCitA aXRlbQorSlNPTiBvbmx5IGhhcyBmbG9hdGluZy1wb2ludCBudW1iZXJzLiAgVGhleSBjYW4gcmVw cmVzZW50IGJvdGggTGlzcAoraW50ZWdlcnMgYW5kIExpc3AgZmxvYXRpbmctcG9pbnQgbnVtYmVy cy4KKworQGl0ZW0KK0pTT04gc3RyaW5ncyBhcmUgYWx3YXlzIFVuaWNvZGUgc3RyaW5ncy4gIExp c3Agc3RyaW5ncyBjYW4gY29udGFpbgorbm9uLVVuaWNvZGUgY2hhcmFjdGVycy4KKworQGl0ZW0K K0pTT04gaGFzIG9ubHkgb25lIHNlcXVlbmNlIHR5cGUsIHRoZSBhcnJheS4gIEpTT04gYXJyYXlz IGFyZQorcmVwcmVzZW50ZWQgdXNpbmcgTGlzcCB2ZWN0b3JzLgorCitAaXRlbQorSlNPTiBoYXMg b25seSBvbmUgbWFwIHR5cGUsIHRoZSBvYmplY3QuICBKU09OIG9iamVjdHMgYXJlIHJlcHJlc2Vu dGVkCit1c2luZyBMaXNwIGhhc2h0YWJsZXMuCisKK0BlbmQgaXRlbWl6ZQorCitAbm9pbmRlbnQK K05vdGUgdGhhdCBAY29kZXtuaWx9IGRvZXNuJ3QgcmVwcmVzZW50IGFueSBKU09OIHZhbHVlczog dGhpcyBpcyB0bworYXZvaWQgY29uZnVzaW9uLCBiZWNhdXNlIEBjb2Rle25pbH0gY291bGQgZWl0 aGVyIHJlcHJlc2VudAorQGNvZGV7bnVsbH0sIEBjb2Rle2ZhbHNlfSwgb3IgYW4gZW1wdHkgYXJy YXksIGFsbCBvZiB3aGljaCBhcmUKK2RpZmZlcmVudCBKU09OIHZhbHVlcy4KKworICBJZiBzb21l IExpc3Agb2JqZWN0IGNhbid0IGJlIHJlcHJlc2VudGVkIGluIEpTT04sIHRoZSBzZXJpYWxpemF0 aW9uCitmdW5jdGlvbnMgd2lsbCBzaWduYWwgYW4gZXJyb3Igb2YgdHlwZSBAY29kZXt3cm9uZy10 eXBlLWFyZ3VtZW50fS4KK1RoZSBwYXJzaW5nIGZ1bmN0aW9ucyB3aWxsIHNpZ25hbCB0aGUgZm9s bG93aW5nIGVycm9yczoKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIGpzb24tZW5kLW9mLWZpbGUK KyAgICBTaWduYWxlZCB3aGVuIGVuY291bnRlcmluZyBhIHByZW1hdHVyZSBlbmQgb2YgdGhlIGlu cHV0IHRleHQuCisKK0BpdGVtIGpzb24tdHJhaWxpbmctY29udGVudAorICAgIFNpZ25hbGVkIHdo ZW4gZW5jb3VudGVyaW5nIHVuZXhwZWN0ZWQgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEpTT04KKyAg ICBvYmplY3QgcGFyc2VkLgorCitAaXRlbSBqc29uLXBhcnNlLWVycm9yCisgICAgU2lnbmFsZWQg d2hlbiBlbmNvdW50ZXJpbmcgaW52YWxpZCBKU09OIHN5bnRheC4KKworQGVuZCB0YWJsZQorCisg IE9ubHkgdG9wLWxldmVsIHZhbHVlcyAoYXJyYXlzIGFuZCBvYmplY3RzKSBjYW4gYmUgc2VyaWFs aXplZCB0bworSlNPTi4gIFRoZSBzdWJvYmplY3RzIHdpdGhpbiB0aGVzZSB0b3AtbGV2ZWwgdmFs dWVzIGNhbiBiZSBvZiBhbnkKK3R5cGUuICBMaWtld2lzZSwgdGhlIHBhcnNpbmcgZnVuY3Rpb25z IHdpbGwgb25seSByZXR1cm4gdmVjdG9ycyBhbmQKK2hhc2h0YWJsZXMuCisKK0BkZWZ1biBqc29u LXNlcmlhbGl6ZSBvYmplY3QKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBMaXNwIHN0cmlu ZyB3aGljaCBjb250YWlucyB0aGUgSlNPTgorcmVwcmVzZW50YXRpb24gb2YgQHZhcntvYmplY3R9 LgorQGVuZCBkZWZ1bgorCitAZGVmdW4ganNvbi1pbnNlcnQgb2JqZWN0CitUaGlzIGZ1bmN0aW9u IGluc2VydHMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQHZhcntvYmplY3R9IGludG8gdGhl CitjdXJyZW50IGJ1ZmZlciBiZWZvcmUgcG9pbnQuCitAZW5kIGRlZnVuCisKK0BkZWZ1biBqc29u LXBhcnNlLXN0cmluZyBzdHJpbmcKK1RoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBKU09OIHZhbHVl IGluIEB2YXJ7c3RyaW5nfSwgd2hpY2ggbXVzdCBiZSBhCitMaXNwIHN0cmluZy4KK0BlbmQgZGVm dW4KKworQGRlZnVuIGpzb24tcGFyc2UtYnVmZmVyCitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBu ZXh0IEpTT04gdmFsdWUgZnJvbSB0aGUgY3VycmVudCBidWZmZXIsCitzdGFydGluZyBhdCBwb2lu dC4gIEl0IG1vdmVzIHBvaW50IHRvIHRoZSBwb3NpdGlvbiBpbW1lZGlhdGVseSBhZnRlcgordGhl IHZhbHVlIGlmIGEgdmFsdWUgY291bGQgYmUgcmVhZCBhbmQgY29udmVydGVkIHRvIExpc3A7IG90 aGVyd2lzZSBpdAorZG9lc24ndCBtb3ZlIHBvaW50LgorQGVuZCBkZWZ1bgorCisKIEBub2RlIEF0 b21pYyBDaGFuZ2VzCiBAc2VjdGlvbiBBdG9taWMgQ2hhbmdlIEdyb3VwcwogQGNpbmRleCBhdG9t aWMgY2hhbmdlcwpkaWZmIC0tZ2l0IGEvZXRjL05FV1MgYi9ldGMvTkVXUwppbmRleCA5YWUzNmJk YjAzLi5jZjg0ZDgwMzk1IDEwMDY0NAotLS0gYS9ldGMvTkVXUworKysgYi9ldGMvTkVXUwpAQCAt MjQsNiArMjQsMTMgQEAgV2hlbiB5b3UgYWRkIGEgbmV3IGl0ZW0sIHVzZSB0aGUgYXBwcm9wcmlh dGUgbWFyayBpZiB5b3UgYXJlIHN1cmUgaXQgYXBwbGllcywKIAwKICogSW5zdGFsbGF0aW9uIENo YW5nZXMgaW4gRW1hY3MgMjcuMQogCisqKiBUaGUgbmV3IGNvbmZpZ3VyZSBvcHRpb24gJy0td2l0 aC1qc29uJyBhZGRzIHN1cHBvcnQgZm9yIEpTT04gdXNpbmcKK3RoZSBKYW5zc29uIGxpYnJhcnku ICBJdCBpcyBvbiBieSBkZWZhdWx0OyB1c2UgJ2NvbmZpZ3VyZQorLS13aXRoLWpzb249bm8nIHRv IGJ1aWxkIHdpdGhvdXQgSmFuc3NvbiBzdXBwb3J0LiAgVGhlIG5ldyBKU09OCitmdW5jdGlvbnMg J2pzb24tc2VyaWFsaXplJywgJ2pzb24taW5zZXJ0JywgJ2pzb24tcGFyc2Utc3RyaW5nJywgYW5k CisnanNvbi1wYXJzZS1idWZmZXInIGFyZSB0eXBpY2FsbHkgbXVjaCBmYXN0ZXIgdGhhbiB0aGVp ciBMaXNwCitjb3VudGVycGFydHMgZnJvbSBqc29uLmVsLgorCiAMCiAqIFN0YXJ0dXAgQ2hhbmdl cyBpbiBFbWFjcyAyNy4xCiAKQEAgLTEyMyw2ICsxMzAsMTAgQEAgYnVnIG9uIE9TIFggMTAuOCBh bmQgbGF0ZXIgKEJ1ZyMyODYzOSkuCiAqKiBUaGUgZnVuY3Rpb24gJ2dldC1mcmVlLWRpc2stc3Bh Y2UnIHJldHVybnMgbm93IGEgbm9uLW5pbCB2YWx1ZSBmb3IKIHJlbW90ZSBzeXN0ZW1zLCB3aGlj aCBzdXBwb3J0IHRoaXMgY2hlY2suCiAKKyoqIE5ldyBKU09OIHBhcnNpbmcgYW5kIHNlcmlhbGl6 YXRpb24gZnVuY3Rpb25zICdqc29uLXNlcmlhbGl6ZScsCisnanNvbi1pbnNlcnQnLCAnanNvbi1w YXJzZS1zdHJpbmcnLCBhbmQgJ2pzb24tcGFyc2UtYnVmZmVyJy4gIFRoZXNlCithcmUgaW1wbGVt ZW50ZWQgaW4gQyB1c2luZyB0aGUgSmFuc3NvbiBsaWJyYXJ5LgorCiAMCiAqIENoYW5nZXMgaW4g RW1hY3MgMjcuMSBvbiBOb24tRnJlZSBPcGVyYXRpbmcgU3lzdGVtcwogCmRpZmYgLS1naXQgYS9z cmMvTWFrZWZpbGUuaW4gYi9zcmMvTWFrZWZpbGUuaW4KaW5kZXggOWE4YzljODVmMC4uYjM5NTYy Nzg5MyAxMDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlLmluCisrKyBiL3NyYy9NYWtlZmlsZS5pbgpA QCAtMzEyLDYgKzMxMiwxMCBAQCBMSUJHTlVUTFNfQ0ZMQUdTID0KIExJQlNZU1RFTURfTElCUyA9 IEBMSUJTWVNURU1EX0xJQlNACiBMSUJTWVNURU1EX0NGTEFHUyA9IEBMSUJTWVNURU1EX0NGTEFH U0AKIAorSlNPTl9MSUJTID0gQEpTT05fTElCU0AKK0pTT05fQ0ZMQUdTID0gQEpTT05fQ0ZMQUdT QAorSlNPTl9PQkogPSBASlNPTl9PQkpACisKIElOVEVSVkFMU19IID0gZGlzcGV4dGVybi5oIGlu dGVydmFscy5oIGNvbXBvc2l0ZS5oCiAKIEdFVExPQURBVkdfTElCUyA9IEBHRVRMT0FEQVZHX0xJ QlNACkBAIC0zNjMsNyArMzY3LDcgQEAgRU1BQ1NfQ0ZMQUdTPQogICAkKFdFQktJVF9DRkxBR1Mp IFwKICAgJChTRVRUSU5HU19DRkxBR1MpICQoRlJFRVRZUEVfQ0ZMQUdTKSAkKEZPTlRDT05GSUdf Q0ZMQUdTKSBcCiAgICQoTElCT1RGX0NGTEFHUykgJChNMTdOX0ZMVF9DRkxBR1MpICQoREVQRkxB R1MpIFwKLSAgJChMSUJTWVNURU1EX0NGTEFHUykgXAorICAkKExJQlNZU1RFTURfQ0ZMQUdTKSAk KEpTT05fQ0ZMQUdTKSBcCiAgICQoTElCR05VVExTX0NGTEFHUykgJChOT1RJRllfQ0ZMQUdTKSAk KENBSVJPX0NGTEFHUykgXAogICAkKFdFUlJPUl9DRkxBR1MpCiBBTExfQ0ZMQUdTID0gJChFTUFD U19DRkxBR1MpICQoV0FSTl9DRkxBR1MpICQoQ0ZMQUdTKQpAQCAtMzk3LDcgKzQwMSw3IEBAIGJh c2Vfb2JqID0KIAl0aHJlYWQubyBzeXN0aHJlYWQubyBcCiAJJChpZiAkKEhZQlJJRF9NQUxMT0Mp LHNoZWFwLm8pIFwKIAkkKE1TRE9TX09CSikgJChNU0RPU19YX09CSikgJChOU19PQkopICQoQ1lH V0lOX09CSikgJChGT05UX09CSikgXAotCSQoVzMyX09CSikgJChXSU5ET1dfU1lTVEVNX09CSikg JChYR1NFTE9CSikKKwkkKFczMl9PQkopICQoV0lORE9XX1NZU1RFTV9PQkopICQoWEdTRUxPQkop ICQoSlNPTl9PQkopCiBvYmogPSAkKGJhc2Vfb2JqKSAkKE5TX09CSkNfT0JKKQogCiAjIyBPYmpl Y3QgZmlsZXMgdXNlZCBvbiBzb21lIG1hY2hpbmUgb3Igb3RoZXIuCkBAIC00OTMsNyArNDk3LDgg QEAgTElCRVMgPQogICAgJChMSUJTX1RFUk1DQVApICQoR0VUTE9BREFWR19MSUJTKSAkKFNFVFRJ TkdTX0xJQlMpICQoTElCU0VMSU5VWF9MSUJTKSBcCiAgICAkKEZSRUVUWVBFX0xJQlMpICQoRk9O VENPTkZJR19MSUJTKSAkKExJQk9URl9MSUJTKSAkKE0xN05fRkxUX0xJQlMpIFwKICAgICQoTElC R05VVExTX0xJQlMpICQoTElCX1BUSFJFQUQpICQoR0VUQUREUklORk9fQV9MSUJTKSAkKExJQkxD TVMyKSBcCi0gICAkKE5PVElGWV9MSUJTKSAkKExJQl9NQVRIKSAkKExJQlopICQoTElCTU9EVUxF UykgJChMSUJTWVNURU1EX0xJQlMpCisgICAkKE5PVElGWV9MSUJTKSAkKExJQl9NQVRIKSAkKExJ QlopICQoTElCTU9EVUxFUykgJChMSUJTWVNURU1EX0xJQlMpIFwKKyAgICQoSlNPTl9MSUJTKQog CiAjIyBGT1JDRSBpdCBzbyB0aGF0IGFkbWluL3VuaWRhdGEgY2FuIGRlY2lkZSB3aGV0aGVyIHRo ZXNlIGZpbGVzCiAjIyBhcmUgdXAtdG8tZGF0ZS4gIEFsdGhvdWdoIHNpbmNlIGNoYXJwcm9wIGRl cGVuZHMgb24gYm9vdHN0cmFwLWVtYWNzLApkaWZmIC0tZ2l0IGEvc3JjL2VtYWNzLmMgYi9zcmMv ZW1hY3MuYwppbmRleCAwZmU3ZDkxMTNiLi4yMDJlY2IwZWJiIDEwMDY0NAotLS0gYS9zcmMvZW1h Y3MuYworKysgYi9zcmMvZW1hY3MuYwpAQCAtMTI2Miw2ICsxMjYyLDEwIEBAIFVzaW5nIGFuIEVt YWNzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgteC10b29sa2l0PWx1Y2lkIGRvZXMgbm90IGhhdmUg dGhpcyBwcm9ibGVtCiAgIHJ1bm5pbmdfYXN5bmNoX2NvZGUgPSAwOwogICBpbml0X3JhbmRvbSAo KTsKIAorI2lmZGVmIEhBVkVfSlNPTgorICBpbml0X2pzb24gKCk7CisjZW5kaWYKKwogICBub19s b2FkdXAKICAgICA9IGFyZ21hdGNoIChhcmd2LCBhcmdjLCAiLW5sIiwgIi0tbm8tbG9hZHVwIiwg NiwgTlVMTCwgJnNraXBfYXJncyk7CiAKQEAgLTE2MTAsNiArMTYxNCwxMCBAQCBVc2luZyBhbiBF bWFjcyBjb25maWd1cmVkIHdpdGggLS13aXRoLXgtdG9vbGtpdD1sdWNpZCBkb2VzIG5vdCBoYXZl IHRoaXMgcHJvYmxlbQogICAgICAgc3ltc19vZl90aHJlYWRzICgpOwogICAgICAgc3ltc19vZl9w cm9maWxlciAoKTsKIAorI2lmZGVmIEhBVkVfSlNPTgorICAgICAgc3ltc19vZl9qc29uICgpOwor I2VuZGlmCisKICAgICAgIGtleXNfb2ZfY2FzZWZpZGRsZSAoKTsKICAgICAgIGtleXNfb2ZfY21k cyAoKTsKICAgICAgIGtleXNfb2ZfYnVmZmVyICgpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2YWwuYyBi L3NyYy9ldmFsLmMKaW5kZXggMDYzZGViNGJhMC4uNWNjNTIxYjlkZSAxMDA2NDQKLS0tIGEvc3Jj L2V2YWwuYworKysgYi9zcmMvZXZhbC5jCkBAIC0xNDE2LDYgKzE0MTYsNTcgQEAgaW50ZXJuYWxf Y29uZGl0aW9uX2Nhc2VfbiAoTGlzcF9PYmplY3QgKCpiZnVuKSAocHRyZGlmZl90LCBMaXNwX09i amVjdCAqKSwKICAgICB9CiB9CiAKK3N0YXRpYyBMaXNwX09iamVjdAoraW50ZXJuYWxfY2F0Y2hf YWxsXzEgKExpc3BfT2JqZWN0ICgqZnVuY3Rpb24pICh2b2lkICopLCB2b2lkICphcmd1bWVudCkK K3sKKyAgc3RydWN0IGhhbmRsZXIgKmMgPSBwdXNoX2hhbmRsZXJfbm9zaWduYWwgKFF0LCBDQVRD SEVSX0FMTCk7CisgIGlmIChjID09IE5VTEwpCisgICAgcmV0dXJuIFFjYXRjaF9hbGxfbWVtb3J5 X2Z1bGw7CisKKyAgaWYgKHN5c19zZXRqbXAgKGMtPmptcCkgPT0gMCkKKyAgICB7CisgICAgICBM aXNwX09iamVjdCB2YWwgPSBmdW5jdGlvbiAoYXJndW1lbnQpOworICAgICAgZWFzc2VydCAoaGFu ZGxlcmxpc3QgPT0gYyk7CisgICAgICBoYW5kbGVybGlzdCA9IGMtPm5leHQ7CisgICAgICByZXR1 cm4gdmFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVhc3NlcnQgKGhhbmRsZXJsaXN0 ID09IGMpOworICAgICAgTGlzcF9PYmplY3QgdmFsID0gYy0+dmFsOworICAgICAgaGFuZGxlcmxp c3QgPSBjLT5uZXh0OworICAgICAgRnNpZ25hbCAoUW5vX2NhdGNoLCB2YWwpOworICAgIH0KK30K KworLyogTGlrZSBhIGNvbWJpbmF0aW9uIG9mIGludGVybmFsX2NvbmRpdGlvbl9jYXNlXzEgYW5k IGludGVybmFsX2NhdGNoLgorICAgQ2F0Y2hlcyBhbGwgc2lnbmFscyBhbmQgdGhyb3dzLiAgTmV2 ZXIgZXhpdHMgbm9ubG9jYWxseTsgcmV0dXJucworICAgUWNhdGNoX2FsbF9tZW1vcnlfZnVsbCBp ZiBubyBoYW5kbGVyIGNvdWxkIGJlIGFsbG9jYXRlZC4gICovCisKK0xpc3BfT2JqZWN0CitpbnRl cm5hbF9jYXRjaF9hbGwgKExpc3BfT2JqZWN0ICgqZnVuY3Rpb24pICh2b2lkICopLCB2b2lkICph cmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgTGlzcF9PYmplY3QgKCpoYW5kbGVyKSAoTGlz cF9PYmplY3QpKQoreworICBzdHJ1Y3QgaGFuZGxlciAqYyA9IHB1c2hfaGFuZGxlcl9ub3NpZ25h bCAoUXQsIENPTkRJVElPTl9DQVNFKTsKKyAgaWYgKGMgPT0gTlVMTCkKKyAgICByZXR1cm4gUWNh dGNoX2FsbF9tZW1vcnlfZnVsbDsKKworICBpZiAoc3lzX3NldGptcCAoYy0+am1wKSA9PSAwKQor ICAgIHsKKyAgICAgIExpc3BfT2JqZWN0IHZhbCA9IGludGVybmFsX2NhdGNoX2FsbF8xIChmdW5j dGlvbiwgYXJndW1lbnQpOworICAgICAgZWFzc2VydCAoaGFuZGxlcmxpc3QgPT0gYyk7CisgICAg ICBoYW5kbGVybGlzdCA9IGMtPm5leHQ7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgZWxz ZQorICAgIHsKKyAgICAgIGVhc3NlcnQgKGhhbmRsZXJsaXN0ID09IGMpOworICAgICAgTGlzcF9P YmplY3QgdmFsID0gYy0+dmFsOworICAgICAgaGFuZGxlcmxpc3QgPSBjLT5uZXh0OworICAgICAg cmV0dXJuIGhhbmRsZXIgKHZhbCk7CisgICAgfQorfQorCiBzdHJ1Y3QgaGFuZGxlciAqCiBwdXNo X2hhbmRsZXIgKExpc3BfT2JqZWN0IHRhZ19jaF92YWwsIGVudW0gaGFuZGxlcnR5cGUgaGFuZGxl cnR5cGUpCiB7CkBAIC00MDY2LDYgKzQxMTcsOSBAQCBhbGlzdCBvZiBhY3RpdmUgbGV4aWNhbCBi aW5kaW5ncy4gICovKTsKIAogICBpbmhpYml0X2xpc3BfY29kZSA9IFFuaWw7CiAKKyAgREVGU1lN IChRY2F0Y2hfYWxsX21lbW9yeV9mdWxsLCAiY2F0Y2gtYWxsLW1lbW9yeS1mdWxsIik7CisgIEZ1 bmludGVybiAoUWNhdGNoX2FsbF9tZW1vcnlfZnVsbCwgUW5pbCk7CisKICAgZGVmc3ViciAoJlNv cik7CiAgIGRlZnN1YnIgKCZTYW5kKTsKICAgZGVmc3ViciAoJlNpZik7CmRpZmYgLS1naXQgYS9z cmMvanNvbi5jIGIvc3JjL2pzb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwLi5kYzQ0OWU0M2UxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2pzb24uYwpAQCAtMCwwICsx LDU3NiBAQAorLyogSlNPTiBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uLgorCitDb3B5cmlnaHQg KEMpIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBw YXJ0IG9mIEdOVSBFbWFjcy4KKworR05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQK K3lvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIEVtYWNzIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBo YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fs b25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGlj ZW5zZXMvPi4gICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+ CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3Rk bGliLmg+CisKKyNpbmNsdWRlIDxqYW5zc29uLmg+CisKKyNpbmNsdWRlICJsaXNwLmgiCisjaW5j bHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiY29kaW5nLmgiCisKKy8qIFdlIGluc3RhbGwgYSBj dXN0b20gYWxsb2NhdG9yIHNvIHRoYXQgd2UgY2FuIGF2b2lkIG9iamVjdHMgbGFyZ2VyCisgICB0 aGFuIFBUUkRJRkZfTUFYLiAgU3VjaCBvYmplY3RzIHdvdWxkbuKAmXQgcGxheSB3ZWxsIHdpdGgg dGhlIHJlc3Qgb2YKKyAgIEVtYWNz4oCZcyBjb2RlYmFzZSwgd2hpY2ggZ2VuZXJhbGx5IHVzZXMg cHRyZGlmZl90IGZvciBzaXplcyBhbmQKKyAgIGluZGljZXMuICBUaGUgb3RoZXIgZnVuY3Rpb25z IGluIHRoaXMgZmlsZSBhbHNvIGdlbmVyYWxseSBhc3N1bWUKKyAgIHRoYXQgc2l6ZV90IHZhbHVl cyBuZXZlciBleGNlZWQgUFRSRElGRl9NQVguICAqLworCitzdGF0aWMgdm9pZCAqCitqc29uX21h bGxvYyAoc2l6ZV90IHNpemUpCit7CisgIGlmIChzaXplID4gUFRSRElGRl9NQVgpCisgICAgewor ICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIHJldHVy biBtYWxsb2MgKHNpemUpOworfQorCitzdGF0aWMgdm9pZAoranNvbl9mcmVlICh2b2lkICpwdHIp Cit7CisgIGZyZWUgKHB0cik7Cit9CisKK3ZvaWQKK2luaXRfanNvbiAodm9pZCkKK3sKKyAganNv bl9zZXRfYWxsb2NfZnVuY3MgKGpzb25fbWFsbG9jLCBqc29uX2ZyZWUpOworfQorCisvKiBSZXR1 cm4gd2hldGhlciBTVFJJTkcgc3RhcnRzIHdpdGggUFJFRklYLiAgKi8KKworc3RhdGljIGJvb2wK K2pzb25faGFzX3ByZWZpeCAoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpwcmVmaXgp Cit7CisgIHNpemVfdCBzdHJpbmdfbGVuID0gc3RybGVuIChzdHJpbmcpOworICBzaXplX3QgcHJl Zml4X2xlbiA9IHN0cmxlbiAocHJlZml4KTsKKyAgcmV0dXJuIHN0cmluZ19sZW4gPj0gcHJlZml4 X2xlbiAmJiBtZW1jbXAgKHN0cmluZywgcHJlZml4LCBwcmVmaXhfbGVuKSA9PSAwOworfQorCisv KiBSZXR1cm4gd2hldGhlciBTVFJJTkcgZW5kcyB3aXRoIFNVRkZJWC4gICovCisKK3N0YXRpYyBi b29sCitqc29uX2hhc19zdWZmaXggKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqc3Vm Zml4KQoreworICBzaXplX3Qgc3RyaW5nX2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgc2l6ZV90 IHN1ZmZpeF9sZW4gPSBzdHJsZW4gKHN1ZmZpeCk7CisgIHJldHVybiBzdHJpbmdfbGVuID49IHN1 ZmZpeF9sZW4KKyAgICAmJiBtZW1jbXAgKHN0cmluZyArIHN0cmluZ19sZW4gLSBzdWZmaXhfbGVu LCBzdWZmaXgsIHN1ZmZpeF9sZW4pID09IDA7Cit9CisKKy8qIENyZWF0ZSBhIG11bHRpYnl0ZSBM aXNwIHN0cmluZyBmcm9tIHRoZSBVVEYtOCBzdHJpbmcgaW4KKyAgIFtEQVRBLCBEQVRBICsgU0la RSkuICBJZiB0aGUgcmFuZ2UgW0RBVEEsIERBVEEgKyBTSVpFKSBkb2VzIG5vdAorICAgY29udGFp biBhIHZhbGlkIFVURi04IHN0cmluZywgYW4gdW5zcGVjaWZpZWQgc3RyaW5nIGlzCisgICByZXR1 cm5lZC4gICovCisKK3N0YXRpYyBMaXNwX09iamVjdAoranNvbl9tYWtlX3N0cmluZyAoY29uc3Qg Y2hhciAqZGF0YSwgcHRyZGlmZl90IHNpemUpCit7CisgIHJldHVybiBjb2RlX2NvbnZlcnRfc3Ry aW5nIChtYWtlX3NwZWNpZmllZF9zdHJpbmcgKGRhdGEsIC0xLCBzaXplLCBmYWxzZSksCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRdXRmXzhfdW5peCwgUXQsIGZhbHNlLCB0cnVlLCB0 cnVlKTsKK30KKworLyogQ3JlYXRlIGEgbXVsdGlieXRlIExpc3Agc3RyaW5nIGZyb20gdGhlIG51 bGwtdGVybWluYXRlZCBVVEYtOAorICAgc3RyaW5nIGJlZ2lubmluZyBhdCBEQVRBLiAgSWYgdGhl IHN0cmluZyBpcyBub3QgYSB2YWxpZCBVVEYtOAorICAgc3RyaW5nLCBhbiB1bnNwZWNpZmllZCBz dHJpbmcgaXMgcmV0dXJuZWQuICAqLworCitzdGF0aWMgTGlzcF9PYmplY3QKK2pzb25fYnVpbGRf c3RyaW5nIChjb25zdCBjaGFyICpkYXRhKQoreworICByZXR1cm4ganNvbl9tYWtlX3N0cmluZyAo ZGF0YSwgc3RybGVuIChkYXRhKSk7Cit9CisKKy8qIFJldHVybiBhIHVuaWJ5dGUgc3RyaW5nIGNv bnRhaW5pbmcgdGhlIHNlcXVlbmNlIG9mIFVURi04IGVuY29kaW5nCisgICB1bml0cyBvZiB0aGUg VVRGLTggcmVwcmVzZW50YXRpb24gb2YgU1RSSU5HLiAgSWYgU1RSSU5HIGRvZXMgbm90CisgICBy ZXByZXNlbnQgYSBzZXF1ZW5jZSBvZiBVbmljb2RlIHNjYWxhciB2YWx1ZXMsIHJldHVybiBhIHN0 cmluZyB3aXRoCisgICB1bnNwZWNpZmllZCBjb250ZW50cy4gICovCisKK3N0YXRpYyBMaXNwX09i amVjdAoranNvbl9lbmNvZGUgKExpc3BfT2JqZWN0IHN0cmluZykKK3sKKyAgcmV0dXJuIGNvZGVf Y29udmVydF9zdHJpbmcgKHN0cmluZywgUXV0Zl84X3VuaXgsIFF0LCB0cnVlLCB0cnVlLCB0cnVl KTsKK30KKworc3RhdGljIF9Ob3JldHVybiB2b2lkCitqc29uX291dF9vZl9tZW1vcnkgKHZvaWQp Cit7CisgIHhzaWduYWwwIChRanNvbl9vdXRfb2ZfbWVtb3J5KTsKK30KKworLyogU2lnbmFsIGEg TGlzcCBlcnJvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU09OIEVSUk9SLiAgKi8KKworc3RhdGlj IF9Ob3JldHVybiB2b2lkCitqc29uX3BhcnNlX2Vycm9yIChjb25zdCBqc29uX2Vycm9yX3QgKmVy cm9yKQoreworICBMaXNwX09iamVjdCBzeW1ib2w7CisgIC8qIEZJWE1FOiBVcHN0cmVhbSBKYW5z c29uIHNob3VsZCBoYXZlIGEgd2F5IHRvIHJldHVybiBlcnJvciBjb2RlcworICAgICB3aXRob3V0 IHBhcnNpbmcgdGhlIGVycm9yIG1lc3NhZ2VzLiAgU2VlCisgICAgIGh0dHBzOi8vZ2l0aHViLmNv bS9ha2hlcm9uL2phbnNzb24vaXNzdWVzLzM1Mi4gICovCisgIGlmIChqc29uX2hhc19zdWZmaXgg KGVycm9yLT50ZXh0LCAiZXhwZWN0ZWQgbmVhciBlbmQgb2YgZmlsZSIpKQorICAgIHN5bWJvbCA9 IFFqc29uX2VuZF9vZl9maWxlOworICBlbHNlIGlmIChqc29uX2hhc19wcmVmaXggKGVycm9yLT50 ZXh0LCAiZW5kIG9mIGZpbGUgZXhwZWN0ZWQiKSkKKyAgICBzeW1ib2wgPSBRanNvbl90cmFpbGlu Z19jb250ZW50OworICBlbHNlCisgICAgc3ltYm9sID0gUWpzb25fcGFyc2VfZXJyb3I7CisgIHhz aWduYWwgKHN5bWJvbCwKKyAgICAgICAgICAgbGlzdDUgKGpzb25fYnVpbGRfc3RyaW5nIChlcnJv ci0+dGV4dCksCisgICAgICAgICAgICAgICAgICBqc29uX2J1aWxkX3N0cmluZyAoZXJyb3ItPnNv dXJjZSksIG1ha2VfbmF0bnVtIChlcnJvci0+bGluZSksCisgICAgICAgICAgICAgICAgICBtYWtl X25hdG51bSAoZXJyb3ItPmNvbHVtbiksIG1ha2VfbmF0bnVtIChlcnJvci0+cG9zaXRpb24pKSk7 Cit9CisKK3N0YXRpYyB2b2lkCitqc29uX3JlbGVhc2Vfb2JqZWN0ICh2b2lkICpvYmplY3QpCit7 CisgIGpzb25fZGVjcmVmIChvYmplY3QpOworfQorCisvKiBTaWduYWwgYW4gZXJyb3IgaWYgT0JK RUNUIGlzIG5vdCBhIHN0cmluZywgb3IgaWYgT0JKRUNUIGNvbnRhaW5zCisgICBlbWJlZGRlZCBu dWxsIGNoYXJhY3RlcnMuICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfc3RyaW5nX3dpdGhvdXRf ZW1iZWRkZWRfbnVsbHMgKExpc3BfT2JqZWN0IG9iamVjdCkKK3sKKyAgQ0hFQ0tfU1RSSU5HIChv YmplY3QpOworICBDSEVDS19UWVBFIChtZW1jaHIgKFNEQVRBIChvYmplY3QpLCAnXDAnLCBTQllU RVMgKG9iamVjdCkpID09IE5VTEwsCisgICAgICAgICAgICAgIFFzdHJpbmdfd2l0aG91dF9lbWJl ZGRlZF9udWxsc19wLCBvYmplY3QpOworfQorCisvKiBTaWduYWwgYW4gZXJyb3Igb2YgdHlwZSBg anNvbi1vdXQtb2YtbWVtb3J5JyBpZiBPQkpFQ1QgaXMKKyAgIE5VTEwuICAqLworCitzdGF0aWMg anNvbl90ICoKK2pzb25fY2hlY2sgKGpzb25fdCAqb2JqZWN0KQoreworICBpZiAob2JqZWN0ID09 IE5VTEwpCisgICAganNvbl9vdXRfb2ZfbWVtb3J5ICgpOworICByZXR1cm4gb2JqZWN0OworfQor CitzdGF0aWMganNvbl90ICpsaXNwX3RvX2pzb24gKExpc3BfT2JqZWN0KTsKKworLyogQ29udmVy dCBhIExpc3Agb2JqZWN0IHRvIGEgdG9wbGV2ZWwgSlNPTiBvYmplY3QgKGFycmF5IG9yIG9iamVj dCkuCisgICBUaGlzIHJldHVybnMgTGlzcF9PYmplY3Qgc28gd2UgY2FuIHVzZSB1bmJpbmRfdG8u ICBUaGUgcmV0dXJuIHZhbHVlCisgICBpcyBhbHdheXMgbmlsLiAgKi8KKworc3RhdGljIF9HTF9B UkdfTk9OTlVMTCAoKDIpKSBMaXNwX09iamVjdAorbGlzcF90b19qc29uX3RvcGxldmVsXzEgKExp c3BfT2JqZWN0IGxpc3AsIGpzb25fdCAqKmpzb24pCit7CisgIGlmIChWRUNUT1JQIChsaXNwKSkK KyAgICB7CisgICAgICBwdHJkaWZmX3Qgc2l6ZSA9IEFTSVpFIChsaXNwKTsKKyAgICAgICpqc29u ID0ganNvbl9jaGVjayAoanNvbl9hcnJheSAoKSk7CisgICAgICBwdHJkaWZmX3QgY291bnQgPSBT UEVDUERMX0lOREVYICgpOworICAgICAgcmVjb3JkX3Vud2luZF9wcm90ZWN0X3B0ciAoanNvbl9y ZWxlYXNlX29iamVjdCwganNvbik7CisgICAgICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHNp emU7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGludCBzdGF0dXMKKyAgICAgICAgICAgID0g anNvbl9hcnJheV9hcHBlbmRfbmV3ICgqanNvbiwgbGlzcF90b19qc29uIChBUkVGIChsaXNwLCBp KSkpOworICAgICAgICAgIGlmIChzdGF0dXMgPT0gLTEpCisgICAgICAgICAgICBqc29uX291dF9v Zl9tZW1vcnkgKCk7CisgICAgICAgIH0KKyAgICAgIGVhc3NlcnQgKGpzb25fYXJyYXlfc2l6ZSAo Kmpzb24pID09IHNpemUpOworICAgICAgY2xlYXJfdW53aW5kX3Byb3RlY3QgKGNvdW50KTsKKyAg ICAgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBRbmlsKTsKKyAgICB9CisgIGVsc2UgaWYgKEhB U0hfVEFCTEVfUCAobGlzcCkpCisgICAgeworICAgICAgc3RydWN0IExpc3BfSGFzaF9UYWJsZSAq aCA9IFhIQVNIX1RBQkxFIChsaXNwKTsKKyAgICAgICpqc29uID0ganNvbl9jaGVjayAoanNvbl9v YmplY3QgKCkpOworICAgICAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKyAg ICAgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIgKGpzb25fcmVsZWFzZV9vYmplY3QsICpqc29u KTsKKyAgICAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgSEFTSF9UQUJMRV9TSVpFIChoKTsg KytpKQorICAgICAgICBpZiAoIU5JTFAgKEhBU0hfSEFTSCAoaCwgaSkpKQorICAgICAgICAgIHsK KyAgICAgICAgICAgIExpc3BfT2JqZWN0IGtleSA9IGpzb25fZW5jb2RlIChIQVNIX0tFWSAoaCwg aSkpOworICAgICAgICAgICAgLyogV2UgY2Fu4oCZdCBzcGVjaWZ5IHRoZSBsZW5ndGgsIHNvIHRo ZSBzdHJpbmcgbXVzdCBiZQorICAgICAgICAgICAgICAgbnVsbC10ZXJtaW5hdGVkLiAgKi8KKyAg ICAgICAgICAgIGNoZWNrX3N0cmluZ193aXRob3V0X2VtYmVkZGVkX251bGxzIChrZXkpOworICAg ICAgICAgICAgaW50IHN0YXR1cyA9IGpzb25fb2JqZWN0X3NldF9uZXcgKCpqc29uLCBTU0RBVEEg KGtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlz cF90b19qc29uIChIQVNIX1ZBTFVFIChoLCBpKSkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9 PSAtMSkKKyAgICAgICAgICAgICAganNvbl9vdXRfb2ZfbWVtb3J5ICgpOworICAgICAgICAgIH0K KyAgICAgIGNsZWFyX3Vud2luZF9wcm90ZWN0IChjb3VudCk7CisgICAgICByZXR1cm4gdW5iaW5k X3RvIChjb3VudCwgUW5pbCk7CisgICAgfQorICB3cm9uZ190eXBlX2FyZ3VtZW50IChRanNvbl92 YWx1ZV9wLCBsaXNwKTsKK30KKworLyogQ29udmVydCBMSVNQIHRvIGEgdG9wbGV2ZWwgSlNPTiBv YmplY3QgKGFycmF5IG9yIG9iamVjdCkuICBTaWduYWwKKyAgIGFuIGVycm9yIG9mIHR5cGUgYHdy b25nLXR5cGUtYXJndW1lbnQnIGlmIExJU1AgaXMgbm90IGEgdmVjdG9yIG9yCisgICBoYXNodGFi bGUuICAqLworCitzdGF0aWMganNvbl90ICoKK2xpc3BfdG9fanNvbl90b3BsZXZlbCAoTGlzcF9P YmplY3QgbGlzcCkKK3sKKyAgaWYgKCsrbGlzcF9ldmFsX2RlcHRoID4gbWF4X2xpc3BfZXZhbF9k ZXB0aCkKKyAgICB4c2lnbmFsMCAoUWpzb25fb2JqZWN0X3Rvb19kZWVwKTsKKyAganNvbl90ICpq c29uOworICBsaXNwX3RvX2pzb25fdG9wbGV2ZWxfMSAobGlzcCwgJmpzb24pOworICAtLWxpc3Bf ZXZhbF9kZXB0aDsKKyAgcmV0dXJuIGpzb247Cit9CisKKy8qIENvbnZlcnQgTElTUCB0byBhbnkg SlNPTiBvYmplY3QuICBTaWduYWwgYW4gZXJyb3Igb2YgdHlwZQorICAgYHdyb25nLXR5cGUtYXJn dW1lbnQnIGlmIHRoZSB0eXBlIG9mIExJU1AgY2FuJ3QgYmUgY29udmVydGVkIHRvIGEKKyAgIEpT T04gb2JqZWN0LiAgKi8KKworc3RhdGljIGpzb25fdCAqCitsaXNwX3RvX2pzb24gKExpc3BfT2Jq ZWN0IGxpc3ApCit7CisgIGlmIChFUSAobGlzcCwgUUNudWxsKSkKKyAgICByZXR1cm4ganNvbl9j aGVjayAoanNvbl9udWxsICgpKTsKKyAgZWxzZSBpZiAoRVEgKGxpc3AsIFFDZmFsc2UpKQorICAg IHJldHVybiBqc29uX2NoZWNrIChqc29uX2ZhbHNlICgpKTsKKyAgZWxzZSBpZiAoRVEgKGxpc3As IFF0KSkKKyAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl90cnVlICgpKTsKKyAgZWxzZSBpZiAo SU5URUdFUlAgKGxpc3ApKQorICAgIHsKKyAgICAgIENIRUNLX1RZUEVfUkFOR0VEX0lOVEVHRVIg KGpzb25faW50X3QsIGxpc3ApOworICAgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpzb25faW50ZWdl ciAoWElOVCAobGlzcCkpKTsKKyAgICB9CisgIGVsc2UgaWYgKEZMT0FUUCAobGlzcCkpCisgICAg cmV0dXJuIGpzb25fY2hlY2sgKGpzb25fcmVhbCAoWEZMT0FUX0RBVEEgKGxpc3ApKSk7CisgIGVs c2UgaWYgKFNUUklOR1AgKGxpc3ApKQorICAgIHsKKyAgICAgIExpc3BfT2JqZWN0IGVuY29kZWQg PSBqc29uX2VuY29kZSAobGlzcCk7CisgICAgICBwdHJkaWZmX3Qgc2l6ZSA9IFNCWVRFUyAoZW5j b2RlZCk7CisgICAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl9zdHJpbmduIChTU0RBVEEgKGVu Y29kZWQpLCBzaXplKSk7CisgICAgfQorCisgIC8qIExJU1Agbm93IG11c3QgYmUgYSB2ZWN0b3Ig b3IgaGFzaHRhYmxlLiAgKi8KKyAgcmV0dXJuIGxpc3BfdG9fanNvbl90b3BsZXZlbCAobGlzcCk7 Cit9CisKK0RFRlVOICgianNvbi1zZXJpYWxpemUiLCBGanNvbl9zZXJpYWxpemUsIFNqc29uX3Nl cmlhbGl6ZSwgMSwgMSwgTlVMTCwKKyAgICAgICBkb2M6IC8qIFJldHVybiB0aGUgSlNPTiByZXBy ZXNlbnRhdGlvbiBvZiBPQkpFQ1QgYXMgYSBzdHJpbmcuCitPQkpFQ1QgbXVzdCBiZSBhIHZlY3Rv ciBvciBoYXNodGFibGUsIGFuZCBpdHMgZWxlbWVudHMgY2FuIHJlY3Vyc2l2ZWx5Citjb250YWlu IGA6bnVsbCcsIGA6ZmFsc2UnLCB0LCBudW1iZXJzLCBzdHJpbmdzLCBvciBvdGhlciB2ZWN0b3Jz IGFuZAoraGFzaHRhYmxlcy4gIGA6bnVsbCcsIGA6ZmFsc2UnLCBhbmQgdCB3aWxsIGJlIGNvbnZl cnRlZCB0byBKU09OIG51bGwsCitmYWxzZSwgYW5kIHRydWUgdmFsdWVzLCByZXNwZWN0aXZlbHku ICBWZWN0b3JzIHdpbGwgYmUgY29udmVydGVkIHRvCitKU09OIGFycmF5cywgYW5kIGhhc2h0YWJs ZXMgdG8gSlNPTiBvYmplY3RzLiAgSGFzaHRhYmxlIGtleXMgbXVzdCBiZQorc3RyaW5ncyB3aXRo b3V0IGVtYmVkZGVkIG51bGwgY2hhcmFjdGVycyBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluCitl YWNoIG9iamVjdC4gICovKQorICAoTGlzcF9PYmplY3Qgb2JqZWN0KQoreworICBwdHJkaWZmX3Qg Y291bnQgPSBTUEVDUERMX0lOREVYICgpOworCisgIGpzb25fdCAqanNvbiA9IGxpc3BfdG9fanNv bl90b3BsZXZlbCAob2JqZWN0KTsKKyAgcmVjb3JkX3Vud2luZF9wcm90ZWN0X3B0ciAoanNvbl9y ZWxlYXNlX29iamVjdCwganNvbik7CisKKyAgY2hhciAqc3RyaW5nID0ganNvbl9kdW1wcyAoanNv biwgSlNPTl9DT01QQUNUKTsKKyAgaWYgKHN0cmluZyA9PSBOVUxMKQorICAgIGpzb25fb3V0X29m X21lbW9yeSAoKTsKKyAgcmVjb3JkX3Vud2luZF9wcm90ZWN0X3B0ciAoZnJlZSwgc3RyaW5nKTsK KworICByZXR1cm4gdW5iaW5kX3RvIChjb3VudCwganNvbl9idWlsZF9zdHJpbmcgKHN0cmluZykp OworfQorCitzdHJ1Y3QganNvbl9idWZmZXJfYW5kX3NpemUKK3sKKyAgY29uc3QgY2hhciAqYnVm ZmVyOworICBwdHJkaWZmX3Qgc2l6ZTsKK307CisKK3N0YXRpYyBMaXNwX09iamVjdAoranNvbl9p bnNlcnQgKHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBqc29uX2J1ZmZlcl9hbmRfc2l6ZSAqYnVm ZmVyX2FuZF9zaXplID0gZGF0YTsKKyAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIHBvc3NpYmxl IHdpdGhvdXQgY3JlYXRpbmcgYW4gaW50ZXJtZWRpYXRlCisgICAgIHN0cmluZyBvYmplY3QuICAq LworICBMaXNwX09iamVjdCBzdHJpbmcKKyAgICA9IGpzb25fbWFrZV9zdHJpbmcgKGJ1ZmZlcl9h bmRfc2l6ZS0+YnVmZmVyLCBidWZmZXJfYW5kX3NpemUtPnNpemUpOworICBpbnNlcnQxIChzdHJp bmcpOworICByZXR1cm4gUW5pbDsKK30KKworc3RydWN0IGpzb25faW5zZXJ0X2RhdGEKK3sKKyAg LyogbmlsIGlmIGpzb25faW5zZXJ0IHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIHRoZSBzeW1ib2wKKyAg ICAgUWNhdGNoX2FsbF9tZW1vcnlfZnVsbCBvciBhIGNvbnMgKEVSUk9SLVNZTUJPTCAuIEVSUk9S LURBVEEpLiAgKi8KKyAgTGlzcF9PYmplY3QgZXJyb3I7Cit9OworCisvKiBDYWxsYmFjayBmb3Ig anNvbl9kdW1wX2NhbGxiYWNrIHRoYXQgaW5zZXJ0cyB0aGUgVVRGLTggc3RyaW5nIGluCisgICBb QlVGRkVSLCBCVUZGRVIgKyBTSVpFKSBpbnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KKyAgIElmIFtC VUZGRVIsIEJVRkZFUiArIFNJWkUpIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBVVEYtOCBzdHJp bmcsCisgICBhbiB1bnNwZWNpZmllZCBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYnVmZmVy LiAgREFUQSBtdXN0IHBvaW50CisgICB0byBhIHN0cnVjdHVyZSBvZiB0eXBlIGpzb25faW5zZXJ0 X2RhdGEuICBUaGlzIGZ1bmN0aW9uIG1heSBub3QKKyAgIGV4aXQgbm9ubG9jYWxseS4gIEl0IGNh dGNoZXMgYWxsIG5vbmxvY2FsIGV4aXRzIGFuZCBzdG9yZXMgdGhlbSBpbgorICAgZGF0YS0+ZXJy b3IgZm9yIHJlcmFpc2luZy4gICovCisKK3N0YXRpYyBpbnQKK2pzb25faW5zZXJ0X2NhbGxiYWNr IChjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpkYXRhKQoreworICBzdHJ1 Y3QganNvbl9pbnNlcnRfZGF0YSAqZCA9IGRhdGE7CisgIHN0cnVjdCBqc29uX2J1ZmZlcl9hbmRf c2l6ZSBidWZmZXJfYW5kX3NpemUKKyAgICA9IHsuYnVmZmVyID0gYnVmZmVyLCAuc2l6ZSA9IHNp emV9OworICBkLT5lcnJvciA9IGludGVybmFsX2NhdGNoX2FsbCAoanNvbl9pbnNlcnQsICZidWZm ZXJfYW5kX3NpemUsIEZpZGVudGl0eSk7CisgIHJldHVybiBOSUxQIChkLT5lcnJvcikgPyAwIDog LTE7Cit9CisKK0RFRlVOICgianNvbi1pbnNlcnQiLCBGanNvbl9pbnNlcnQsIFNqc29uX2luc2Vy dCwgMSwgMSwgTlVMTCwKKyAgICAgICBkb2M6IC8qIEluc2VydCB0aGUgSlNPTiByZXByZXNlbnRh dGlvbiBvZiBPQkpFQ1QgYmVmb3JlIHBvaW50LgorVGhpcyBpcyB0aGUgc2FtZSBhcyAoaW5zZXJ0 IChqc29uLXNlcmlhbGl6ZSBPQkpFQ1QpKSwgYnV0IHBvdGVudGlhbGx5CitmYXN0ZXIuICBTZWUg dGhlIGZ1bmN0aW9uIGBqc29uLXNlcmlhbGl6ZScgZm9yIGFsbG93ZWQgdmFsdWVzIG9mCitPQkpF Q1QuICAqLykKKyAgKExpc3BfT2JqZWN0IG9iamVjdCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0g U1BFQ1BETF9JTkRFWCAoKTsKKworICBqc29uX3QgKmpzb24gPSBsaXNwX3RvX2pzb24gKG9iamVj dCk7CisgIHJlY29yZF91bndpbmRfcHJvdGVjdF9wdHIgKGpzb25fcmVsZWFzZV9vYmplY3QsIGpz b24pOworCisgIHN0cnVjdCBqc29uX2luc2VydF9kYXRhIGRhdGE7CisgIGludCBzdGF0dXMKKyAg ICA9IGpzb25fZHVtcF9jYWxsYmFjayAoanNvbiwganNvbl9pbnNlcnRfY2FsbGJhY2ssICZkYXRh LCBKU09OX0NPTVBBQ1QpOworICBpZiAoc3RhdHVzID09IC0xKQorICAgIHsKKyAgICAgIGlmIChD T05TUCAoZGF0YS5lcnJvcikpCisgICAgICAgIHhzaWduYWwgKFhDQVIgKGRhdGEuZXJyb3IpLCBY Q0RSIChkYXRhLmVycm9yKSk7CisgICAgICBlbHNlCisgICAgICAgIGpzb25fb3V0X29mX21lbW9y eSAoKTsKKyAgICB9CisKKyAgcmV0dXJuIHVuYmluZF90byAoY291bnQsIFFuaWwpOworfQorCisv KiBDb252ZXJ0IGEgSlNPTiBvYmplY3QgdG8gYSBMaXNwIG9iamVjdC4gICovCisKK3N0YXRpYyBf R0xfQVJHX05PTk5VTEwgKCgxKSkgTGlzcF9PYmplY3QKK2pzb25fdG9fbGlzcCAoanNvbl90ICpq c29uKQoreworICBzd2l0Y2ggKGpzb25fdHlwZW9mIChqc29uKSkKKyAgICB7CisgICAgY2FzZSBK U09OX05VTEw6CisgICAgICByZXR1cm4gUUNudWxsOworICAgIGNhc2UgSlNPTl9GQUxTRToKKyAg ICAgIHJldHVybiBRQ2ZhbHNlOworICAgIGNhc2UgSlNPTl9UUlVFOgorICAgICAgcmV0dXJuIFF0 OworICAgIGNhc2UgSlNPTl9JTlRFR0VSOgorICAgICAgLyogUmV0dXJuIGFuIGludGVnZXIgaWYg cG9zc2libGUsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyCisgICAgICAgICBvdGhlcndpc2UuICBU aGlzIGxvc2VzIHByZWNpc2lvbiBmb3IgaW50ZWdlcnMgd2l0aCBsYXJnZQorICAgICAgICAgbWFn bml0dWRlOyBob3dldmVyLCBzdWNoIGludGVnZXJzIHRlbmQgdG8gYmUgbm9ucG9ydGFibGUKKyAg ICAgICAgIGFueXdheSBiZWNhdXNlIG1hbnkgSlNPTiBpbXBsZW1lbnRhdGlvbnMgdXNlIG9ubHkg NjQtYml0CisgICAgICAgICBmbG9hdGluZy1wb2ludCBudW1iZXJzIHdpdGggNTMgbWFudGlzc2Eg Yml0cy4gIFNlZQorICAgICAgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcxNTkj c2VjdGlvbi02IGZvciBzb21lCisgICAgICAgICBkaXNjdXNzaW9uLiAgKi8KKyAgICAgIHJldHVy biBtYWtlX2ZpeG51bV9vcl9mbG9hdCAoanNvbl9pbnRlZ2VyX3ZhbHVlIChqc29uKSk7CisgICAg Y2FzZSBKU09OX1JFQUw6CisgICAgICByZXR1cm4gbWFrZV9mbG9hdCAoanNvbl9yZWFsX3ZhbHVl IChqc29uKSk7CisgICAgY2FzZSBKU09OX1NUUklORzoKKyAgICAgIHJldHVybiBqc29uX21ha2Vf c3RyaW5nIChqc29uX3N0cmluZ192YWx1ZSAoanNvbiksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAganNvbl9zdHJpbmdfbGVuZ3RoIChqc29uKSk7CisgICAgY2FzZSBKU09OX0FSUkFZ OgorICAgICAgeworICAgICAgICBpZiAoKytsaXNwX2V2YWxfZGVwdGggPiBtYXhfbGlzcF9ldmFs X2RlcHRoKQorICAgICAgICAgIHhzaWduYWwwIChRanNvbl9vYmplY3RfdG9vX2RlZXApOworICAg ICAgICBzaXplX3Qgc2l6ZSA9IGpzb25fYXJyYXlfc2l6ZSAoanNvbik7CisgICAgICAgIGlmIChG SVhOVU1fT1ZFUkZMT1dfUCAoc2l6ZSkpCisgICAgICAgICAgeHNpZ25hbDAgKFFvdmVyZmxvd19l cnJvcik7CisgICAgICAgIExpc3BfT2JqZWN0IHJlc3VsdCA9IEZtYWtlX3ZlY3RvciAobWFrZV9u YXRudW0gKHNpemUpLCBRdW5ib3VuZCk7CisgICAgICAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBp IDwgc2l6ZTsgKytpKQorICAgICAgICAgIEFTRVQgKHJlc3VsdCwgaSwKKyAgICAgICAgICAgICAg ICBqc29uX3RvX2xpc3AgKGpzb25fYXJyYXlfZ2V0IChqc29uLCBpKSkpOworICAgICAgICAtLWxp c3BfZXZhbF9kZXB0aDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNl IEpTT05fT0JKRUNUOgorICAgICAgeworICAgICAgICBpZiAoKytsaXNwX2V2YWxfZGVwdGggPiBt YXhfbGlzcF9ldmFsX2RlcHRoKQorICAgICAgICAgIHhzaWduYWwwIChRanNvbl9vYmplY3RfdG9v X2RlZXApOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGpzb25fb2JqZWN0X3NpemUgKGpzb24pOwor ICAgICAgICBpZiAoRklYTlVNX09WRVJGTE9XX1AgKHNpemUpKQorICAgICAgICAgIHhzaWduYWww IChRb3ZlcmZsb3dfZXJyb3IpOworICAgICAgICBMaXNwX09iamVjdCByZXN1bHQgPSBDQUxMTiAo Rm1ha2VfaGFzaF90YWJsZSwgUUN0ZXN0LCBRZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRQ3NpemUsIG1ha2VfbmF0bnVtIChzaXplKSk7CisgICAgICAgIHN0cnVj dCBMaXNwX0hhc2hfVGFibGUgKmggPSBYSEFTSF9UQUJMRSAocmVzdWx0KTsKKyAgICAgICAgY29u c3QgY2hhciAqa2V5X3N0cjsKKyAgICAgICAganNvbl90ICp2YWx1ZTsKKyAgICAgICAganNvbl9v YmplY3RfZm9yZWFjaCAoanNvbiwga2V5X3N0ciwgdmFsdWUpCisgICAgICAgICAgeworICAgICAg ICAgICAgTGlzcF9PYmplY3Qga2V5ID0ganNvbl9idWlsZF9zdHJpbmcgKGtleV9zdHIpOworICAg ICAgICAgICAgRU1BQ1NfVUlOVCBoYXNoOworICAgICAgICAgICAgcHRyZGlmZl90IGkgPSBoYXNo X2xvb2t1cCAoaCwga2V5LCAmaGFzaCk7CisgICAgICAgICAgICAvKiBLZXlzIGluIEpTT04gb2Jq ZWN0cyBhcmUgdW5pcXVlLCBzbyB0aGUga2V5IGNhbuKAmXQgYmUKKyAgICAgICAgICAgICAgIHBy ZXNlbnQgeWV0LiAgKi8KKyAgICAgICAgICAgIGVhc3NlcnQgKGkgPCAwKTsKKyAgICAgICAgICAg IGhhc2hfcHV0IChoLCBrZXksIGpzb25fdG9fbGlzcCAodmFsdWUpLCBoYXNoKTsKKyAgICAgICAg ICB9CisgICAgICAgIC0tbGlzcF9ldmFsX2RlcHRoOworICAgICAgICByZXR1cm4gcmVzdWx0Owor ICAgICAgfQorICAgIH0KKyAgLyogQ2Fu4oCZdCBnZXQgaGVyZS4gICovCisgIGVtYWNzX2Fib3J0 ICgpOworfQorCitERUZVTiAoImpzb24tcGFyc2Utc3RyaW5nIiwgRmpzb25fcGFyc2Vfc3RyaW5n LCBTanNvbl9wYXJzZV9zdHJpbmcsIDEsIDEsIE5VTEwsCisgICAgICAgZG9jOiAvKiBQYXJzZSB0 aGUgSlNPTiBTVFJJTkcgaW50byBhIExpc3Agb2JqZWN0LgorVGhpcyBpcyBlc3NlbnRpYWxseSB0 aGUgcmV2ZXJzZSBvcGVyYXRpb24gb2YgYGpzb24tc2VyaWFsaXplJywgd2hpY2gKK3NlZS4gIFRo ZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBhIHZlY3RvciBvciBoYXNodGFibGUuICBJdHMgZWxl bWVudHMKK3dpbGwgYmUgYDpudWxsJywgYDpmYWxzZScsIHQsIG51bWJlcnMsIHN0cmluZ3MsIG9y IGZ1cnRoZXIgdmVjdG9ycyBhbmQKK2hhc2h0YWJsZXMuICBJZiB0aGVyZSBhcmUgZHVwbGljYXRl IGtleXMgaW4gYW4gb2JqZWN0LCBhbGwgYnV0IHRoZQorbGFzdCBvbmUgYXJlIGlnbm9yZWQuICBJ ZiBTVFJJTkcgZG9lc24ndCBjb250YWluIGEgdmFsaWQgSlNPTiBvYmplY3QsCithbiBlcnJvciBv ZiB0eXBlIGBqc29uLXBhcnNlLWVycm9yJyBpcyBzaWduYWxlZC4gICovKQorICAoTGlzcF9PYmpl Y3Qgc3RyaW5nKQoreworICBwdHJkaWZmX3QgY291bnQgPSBTUEVDUERMX0lOREVYICgpOworICBM aXNwX09iamVjdCBlbmNvZGVkID0ganNvbl9lbmNvZGUgKHN0cmluZyk7CisgIGNoZWNrX3N0cmlu Z193aXRob3V0X2VtYmVkZGVkX251bGxzIChlbmNvZGVkKTsKKworICBqc29uX2Vycm9yX3QgZXJy b3I7CisgIGpzb25fdCAqb2JqZWN0ID0ganNvbl9sb2FkcyAoU1NEQVRBIChlbmNvZGVkKSwgMCwg JmVycm9yKTsKKyAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAgIGpzb25fcGFyc2VfZXJyb3IgKCZl cnJvcik7CisKKyAgLyogQXZvaWQgbGVha2luZyB0aGUgb2JqZWN0IGluIGNhc2Ugb2YgZnVydGhl ciBlcnJvcnMuICAqLworICBpZiAob2JqZWN0ICE9IE5VTEwpCisgICAgcmVjb3JkX3Vud2luZF9w cm90ZWN0X3B0ciAoanNvbl9yZWxlYXNlX29iamVjdCwgb2JqZWN0KTsKKworICByZXR1cm4gdW5i aW5kX3RvIChjb3VudCwganNvbl90b19saXNwIChvYmplY3QpKTsKK30KKworc3RydWN0IGpzb25f cmVhZF9idWZmZXJfZGF0YQoreworICAvKiBCeXRlIHBvc2l0aW9uIG9mIHBvc2l0aW9uIHRvIHJl YWQgdGhlIG5leHQgY2h1bmsgZnJvbS4gICovCisgIHB0cmRpZmZfdCBwb2ludDsKK307CisKKy8q IENhbGxiYWNrIGZvciBqc29uX2xvYWRfY2FsbGJhY2sgdGhhdCByZWFkcyBmcm9tIHRoZSBjdXJy ZW50IGJ1ZmZlci4KKyAgIERBVEEgbXVzdCBwb2ludCB0byBhIHN0cnVjdHVyZSBvZiB0eXBlIGpz b25fcmVhZF9idWZmZXJfZGF0YS4KKyAgIGRhdGEtPnBvaW50IG11c3QgcG9pbnQgdG8gdGhlIGJ5 dGUgcG9zaXRpb24gdG8gcmVhZCBmcm9tOyBhZnRlcgorICAgcmVhZGluZywgZGF0YS0+cG9pbnQg aXMgYWR2YW5jZWQgYWNjb3JkaW5nbHkuICBUaGUgYnVmZmVyIHBvaW50CisgICBpdHNlbGYgaXMg aWdub3JlZC4gIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBleGl0IG5vbmxvY2FsbHkuICAqLworCitz dGF0aWMgc2l6ZV90Citqc29uX3JlYWRfYnVmZmVyX2NhbGxiYWNrICh2b2lkICpidWZmZXIsIHNp emVfdCBidWZsZW4sIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBqc29uX3JlYWRfYnVmZmVyX2Rh dGEgKmQgPSBkYXRhOworCisgIC8qIEZpcnN0LCBwYXJzZSBmcm9tIHBvaW50IHRvIHRoZSBnYXAg b3IgdGhlIGVuZCBvZiB0aGUgYWNjZXNzaWJsZQorICAgICBwb3J0aW9uLCB3aGF0ZXZlciBpcyBj bG9zZXIuICAqLworICBwdHJkaWZmX3QgcG9pbnQgPSBkLT5wb2ludDsKKyAgcHRyZGlmZl90IGVu ZCA9IEJVRkZFUl9DRUlMSU5HX09GIChwb2ludCkgKyAxOworICBwdHJkaWZmX3QgY291bnQgPSBl bmQgLSBwb2ludDsKKyAgaWYgKGJ1ZmxlbiA8IGNvdW50KQorICAgIGNvdW50ID0gYnVmbGVuOwor ICBtZW1jcHkgKGJ1ZmZlciwgQllURV9QT1NfQUREUiAocG9pbnQpLCBjb3VudCk7CisgIGQtPnBv aW50ICs9IGNvdW50OworICByZXR1cm4gY291bnQ7Cit9CisKK0RFRlVOICgianNvbi1wYXJzZS1i dWZmZXIiLCBGanNvbl9wYXJzZV9idWZmZXIsIFNqc29uX3BhcnNlX2J1ZmZlciwKKyAgICAgICAw LCAwLCBOVUxMLAorICAgICAgIGRvYzogLyogUmVhZCBKU09OIG9iamVjdCBmcm9tIGN1cnJlbnQg YnVmZmVyIHN0YXJ0aW5nIGF0IHBvaW50LgorVGhpcyBpcyBzaW1pbGFyIHRvIGBqc29uLXBhcnNl LXN0cmluZycsIHdoaWNoIHNlZS4gIE1vdmUgcG9pbnQgYWZ0ZXIKK3RoZSBlbmQgb2YgdGhlIG9i amVjdCBpZiBwYXJzaW5nIHdhcyBzdWNjZXNzZnVsLiAgT24gZXJyb3IsIHBvaW50IGlzCitub3Qg bW92ZWQuICAqLykKKyAgKHZvaWQpCit7CisgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQRExfSU5E RVggKCk7CisKKyAgcHRyZGlmZl90IHBvaW50ID0gUFRfQllURTsKKyAgc3RydWN0IGpzb25fcmVh ZF9idWZmZXJfZGF0YSBkYXRhID0gey5wb2ludCA9IHBvaW50fTsKKyAganNvbl9lcnJvcl90IGVy cm9yOworICBqc29uX3QgKm9iamVjdCA9IGpzb25fbG9hZF9jYWxsYmFjayAoanNvbl9yZWFkX2J1 ZmZlcl9jYWxsYmFjaywgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBKU09OX0RJU0FCTEVfRU9GX0NIRUNLLCAmZXJyb3IpOworCisgIGlmIChvYmplY3QgPT0g TlVMTCkKKyAgICBqc29uX3BhcnNlX2Vycm9yICgmZXJyb3IpOworCisgIC8qIEF2b2lkIGxlYWtp bmcgdGhlIG9iamVjdCBpbiBjYXNlIG9mIGZ1cnRoZXIgZXJyb3JzLiAgKi8KKyAgcmVjb3JkX3Vu d2luZF9wcm90ZWN0X3B0ciAoanNvbl9yZWxlYXNlX29iamVjdCwgb2JqZWN0KTsKKworICAvKiBD b252ZXJ0IGFuZCB0aGVuIG1vdmUgcG9pbnQgb25seSBpZiBldmVyeXRoaW5nIHN1Y2NlZWRlZC4g ICovCisgIExpc3BfT2JqZWN0IGxpc3AgPSBqc29uX3RvX2xpc3AgKG9iamVjdCk7CisKKyAgLyog QWRqdXN0IHBvaW50IGJ5IGhvdyBtdWNoIHdlIGp1c3QgcmVhZC4gICovCisgIHBvaW50ICs9IGVy cm9yLnBvc2l0aW9uOworICBTRVRfUFRfQk9USCAoQllURV9UT19DSEFSIChwb2ludCksIHBvaW50 KTsKKworICByZXR1cm4gdW5iaW5kX3RvIChjb3VudCwgbGlzcCk7Cit9CisKKy8qIFNpbXBsaWZp ZWQgdmVyc2lvbiBvZiDigJhkZWZpbmUtZXJyb3LigJkgdGhhdCB3b3JrcyB3aXRoIHB1cmUKKyAg IG9iamVjdHMuICAqLworCitzdGF0aWMgdm9pZAorZGVmaW5lX2Vycm9yIChMaXNwX09iamVjdCBu YW1lLCBjb25zdCBjaGFyICptZXNzYWdlLCBMaXNwX09iamVjdCBwYXJlbnQpCit7CisgIGVhc3Nl cnQgKFNZTUJPTFAgKG5hbWUpKTsKKyAgZWFzc2VydCAoU1lNQk9MUCAocGFyZW50KSk7CisgIExp c3BfT2JqZWN0IHBhcmVudF9jb25kaXRpb25zID0gRmdldCAocGFyZW50LCBRZXJyb3JfY29uZGl0 aW9ucyk7CisgIGVhc3NlcnQgKENPTlNQIChwYXJlbnRfY29uZGl0aW9ucykpOworICBlYXNzZXJ0 ICghTklMUCAoRm1lbXEgKHBhcmVudCwgcGFyZW50X2NvbmRpdGlvbnMpKSk7CisgIGVhc3NlcnQg KE5JTFAgKEZtZW1xIChuYW1lLCBwYXJlbnRfY29uZGl0aW9ucykpKTsKKyAgRnB1dCAobmFtZSwg UWVycm9yX2NvbmRpdGlvbnMsIHB1cmVfY29ucyAobmFtZSwgcGFyZW50X2NvbmRpdGlvbnMpKTsK KyAgRnB1dCAobmFtZSwgUWVycm9yX21lc3NhZ2UsIGJ1aWxkX3B1cmVfY19zdHJpbmcgKG1lc3Nh Z2UpKTsKK30KKwordm9pZAorc3ltc19vZl9qc29uICh2b2lkKQoreworICBERUZTWU0gKFFDbnVs bCwgIjpudWxsIik7CisgIERFRlNZTSAoUUNmYWxzZSwgIjpmYWxzZSIpOworCisgIERFRlNZTSAo UXN0cmluZ193aXRob3V0X2VtYmVkZGVkX251bGxzX3AsICJzdHJpbmctd2l0aG91dC1lbWJlZGRl ZC1udWxscy1wIik7CisgIERFRlNZTSAoUWpzb25fdmFsdWVfcCwgImpzb24tdmFsdWUtcCIpOwor CisgIERFRlNZTSAoUXV0Zl84X3VuaXgsICJ1dGYtOC11bml4Iik7CisKKyAgREVGU1lNIChRanNv bl9lcnJvciwgImpzb24tZXJyb3IiKTsKKyAgREVGU1lNIChRanNvbl9vdXRfb2ZfbWVtb3J5LCAi anNvbi1vdXQtb2YtbWVtb3J5Iik7CisgIERFRlNZTSAoUWpzb25fcGFyc2VfZXJyb3IsICJqc29u LXBhcnNlLWVycm9yIik7CisgIERFRlNZTSAoUWpzb25fZW5kX29mX2ZpbGUsICJqc29uLWVuZC1v Zi1maWxlIik7CisgIERFRlNZTSAoUWpzb25fdHJhaWxpbmdfY29udGVudCwgImpzb24tdHJhaWxp bmctY29udGVudCIpOworICBERUZTWU0gKFFqc29uX29iamVjdF90b29fZGVlcCwgImpzb24tb2Jq ZWN0LXRvby1kZWVwIik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fZXJyb3IsICJnZW5lcmljIEpT T04gZXJyb3IiLCBRZXJyb3IpOworICBkZWZpbmVfZXJyb3IgKFFqc29uX291dF9vZl9tZW1vcnks CisgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBjcmVhdGluZyBKU09OIG9i amVjdCIsIFFqc29uX2Vycm9yKTsKKyAgZGVmaW5lX2Vycm9yIChRanNvbl9wYXJzZV9lcnJvciwg ImNvdWxkIG5vdCBwYXJzZSBKU09OIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgUWpzb25fZXJy b3IpOworICBkZWZpbmVfZXJyb3IgKFFqc29uX2VuZF9vZl9maWxlLCAiZW5kIG9mIEpTT04gc3Ry ZWFtIiwgUWpzb25fcGFyc2VfZXJyb3IpOworICBkZWZpbmVfZXJyb3IgKFFqc29uX3RyYWlsaW5n X2NvbnRlbnQsICJ0cmFpbGluZyBjb250ZW50IGFmdGVyIEpTT04gc3RyZWFtIiwKKyAgICAgICAg ICAgICAgICBRanNvbl9wYXJzZV9lcnJvcik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fb2JqZWN0 X3Rvb19kZWVwLAorICAgICAgICAgICAgICAgICJvYmplY3QgY3ljbGljIG9yIExpc3AgZXZhbHVh dGlvbiB0b28gZGVlcCIsIFFqc29uX2Vycm9yKTsKKworICBERUZTWU0gKFFwdXJlLCAicHVyZSIp OworICBERUZTWU0gKFFzaWRlX2VmZmVjdF9mcmVlLCAic2lkZS1lZmZlY3QtZnJlZSIpOworCisg IERFRlNZTSAoUWpzb25fc2VyaWFsaXplLCAianNvbi1zZXJpYWxpemUiKTsKKyAgREVGU1lNIChR anNvbl9wYXJzZV9zdHJpbmcsICJqc29uLXBhcnNlLXN0cmluZyIpOworICBGcHV0IChRanNvbl9z ZXJpYWxpemUsIFFwdXJlLCBRdCk7CisgIEZwdXQgKFFqc29uX3NlcmlhbGl6ZSwgUXNpZGVfZWZm ZWN0X2ZyZWUsIFF0KTsKKyAgRnB1dCAoUWpzb25fcGFyc2Vfc3RyaW5nLCBRcHVyZSwgUXQpOwor ICBGcHV0IChRanNvbl9wYXJzZV9zdHJpbmcsIFFzaWRlX2VmZmVjdF9mcmVlLCBRdCk7CisKKyAg ZGVmc3ViciAoJlNqc29uX3NlcmlhbGl6ZSk7CisgIGRlZnN1YnIgKCZTanNvbl9pbnNlcnQpOwor ICBkZWZzdWJyICgmU2pzb25fcGFyc2Vfc3RyaW5nKTsKKyAgZGVmc3ViciAoJlNqc29uX3BhcnNl X2J1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGlzcC5oIGIvc3JjL2xpc3AuaAppbmRleCAy NjYzNzAzMzNmLi44Y2NhZDJjMjI0IDEwMDY0NAotLS0gYS9zcmMvbGlzcC5oCisrKyBiL3NyYy9s aXNwLmgKQEAgLTM0NDEsNiArMzQ0MSwxMiBAQCBleHRlcm4gaW50IHhfYml0bWFwX21hc2sgKHN0 cnVjdCBmcmFtZSAqLCBwdHJkaWZmX3QpOwogZXh0ZXJuIHZvaWQgcmVzZXRfaW1hZ2VfdHlwZXMg KHZvaWQpOwogZXh0ZXJuIHZvaWQgc3ltc19vZl9pbWFnZSAodm9pZCk7CiAKKyNpZmRlZiBIQVZF X0pTT04KKy8qIERlZmluZWQgaW4ganNvbi5jLiAgKi8KK2V4dGVybiB2b2lkIGluaXRfanNvbiAo dm9pZCk7CitleHRlcm4gdm9pZCBzeW1zX29mX2pzb24gKHZvaWQpOworI2VuZGlmCisKIC8qIERl ZmluZWQgaW4gaW5zZGVsLmMuICAqLwogZXh0ZXJuIHZvaWQgbW92ZV9nYXBfYm90aCAocHRyZGlm Zl90LCBwdHJkaWZmX3QpOwogZXh0ZXJuIF9Ob3JldHVybiB2b2lkIGJ1ZmZlcl9vdmVyZmxvdyAo dm9pZCk7CkBAIC0zODY0LDYgKzM4NzAsNyBAQCBleHRlcm4gTGlzcF9PYmplY3QgaW50ZXJuYWxf Y29uZGl0aW9uX2Nhc2VfMiAoTGlzcF9PYmplY3QgKCopIChMaXNwX09iamVjdCwgTGlzcAogZXh0 ZXJuIExpc3BfT2JqZWN0IGludGVybmFsX2NvbmRpdGlvbl9jYXNlX24KICAgICAoTGlzcF9PYmpl Y3QgKCopIChwdHJkaWZmX3QsIExpc3BfT2JqZWN0ICopLCBwdHJkaWZmX3QsIExpc3BfT2JqZWN0 ICosCiAgICAgIExpc3BfT2JqZWN0LCBMaXNwX09iamVjdCAoKikgKExpc3BfT2JqZWN0LCBwdHJk aWZmX3QsIExpc3BfT2JqZWN0ICopKTsKK2V4dGVybiBMaXNwX09iamVjdCBpbnRlcm5hbF9jYXRj aF9hbGwgKExpc3BfT2JqZWN0ICgqKSAodm9pZCAqKSwgdm9pZCAqLCBMaXNwX09iamVjdCAoKikg KExpc3BfT2JqZWN0KSk7CiBleHRlcm4gc3RydWN0IGhhbmRsZXIgKnB1c2hfaGFuZGxlciAoTGlz cF9PYmplY3QsIGVudW0gaGFuZGxlcnR5cGUpOwogZXh0ZXJuIHN0cnVjdCBoYW5kbGVyICpwdXNo X2hhbmRsZXJfbm9zaWduYWwgKExpc3BfT2JqZWN0LCBlbnVtIGhhbmRsZXJ0eXBlKTsKIGV4dGVy biB2b2lkIHNwZWNiaW5kIChMaXNwX09iamVjdCwgTGlzcF9PYmplY3QpOwpkaWZmIC0tZ2l0IGEv dGVzdC9zcmMvanNvbi10ZXN0cy5lbCBiL3Rlc3Qvc3JjL2pzb24tdGVzdHMuZWwKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNWQzYzg0YTEzNgotLS0gL2Rldi9udWxsCisr KyBiL3Rlc3Qvc3JjL2pzb24tdGVzdHMuZWwKQEAgLTAsMCArMSw5NyBAQAorOzs7IGpzb24tdGVz dHMuZWwgLS0tIHVuaXQgdGVzdHMgZm9yIGpzb24uYyAgICAgICAgICAtKi0gbGV4aWNhbC1iaW5k aW5nOiB0OyAtKi0KKworOzsgQ29weXJpZ2h0IChDKSAyMDE3IEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLgorCis7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgRW1hY3MuCisKKzs7IEdO VSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5Cis7OyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg ZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKzs7IChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisKKzs7IEdOVSBFbWFjcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7IE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKzs7IEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKzs7IFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7 OyBhbG9uZyB3aXRoIEdOVSBFbWFjcy4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBVbml0IHRlc3RzIGZvciBzcmMv anNvbi5jLgorCis7OzsgQ29kZToKKworKHJlcXVpcmUgJ2NsLWxpYikKKyhyZXF1aXJlICdtYXAp CisKKyhlcnQtZGVmdGVzdCBqc29uLXNlcmlhbGl6ZS9yb3VuZHRyaXAgKCkKKyAgKGxldCAoKGxp c3AgWzpudWxsIDpmYWxzZSB0IDAgMTIzIC00NTYgMy43NSAiYWJjzrHOss6zIl0pCisgICAgICAg IChqc29uICJbbnVsbCxmYWxzZSx0cnVlLDAsMTIzLC00NTYsMy43NSxcImFiY86xzrLOs1wiXSIp KQorICAgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6ZSBsaXNwKSBqc29uKSkKKyAgICAo d2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKGpzb24taW5zZXJ0IGxpc3ApCisgICAgICAoc2hvdWxk IChlcXVhbCAoYnVmZmVyLXN0cmluZykganNvbikpCisgICAgICAoc2hvdWxkIChlb2JwKSkpCisg ICAgKHNob3VsZCAoZXF1YWwgKGpzb24tcGFyc2Utc3RyaW5nIGpzb24pIGxpc3ApKQorICAgICh3 aXRoLXRlbXAtYnVmZmVyCisgICAgICAoaW5zZXJ0IGpzb24pCisgICAgICAoZ290by1jaGFyIDEp CisgICAgICAoc2hvdWxkIChlcXVhbCAoanNvbi1wYXJzZS1idWZmZXIpIGxpc3ApKQorICAgICAg KHNob3VsZCAoZW9icCkpKSkpCisKKyhlcnQtZGVmdGVzdCBqc29uLXNlcmlhbGl6ZS9vYmplY3Qg KCkKKyAgKGxldCAoKHRhYmxlIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpKQorICAg IChwdXRoYXNoICJhYmMiIFsxIDIgdF0gdGFibGUpCisgICAgKHB1dGhhc2ggImRlZiIgOm51bGwg dGFibGUpCisgICAgKHNob3VsZCAoZXF1YWwgKGpzb24tc2VyaWFsaXplIHRhYmxlKQorICAgICAg ICAgICAgICAgICAgICJ7XCJhYmNcIjpbMSwyLHRydWVdLFwiZGVmXCI6bnVsbH0iKSkpKQorCiso ZXJ0LWRlZnRlc3QganNvbi1wYXJzZS1zdHJpbmcvb2JqZWN0ICgpCisgIChsZXQgKChhY3R1YWwK KyAgICAgICAgIChqc29uLXBhcnNlLXN0cmluZworICAgICAgICAgICJ7IFwiYWJjXCIgOiBbMSwg MiwgdHJ1ZV0sIFwiZGVmXCIgOiBudWxsLCBcImFiY1wiIDogWzksIGZhbHNlXSB9XG4iKSkpCisg ICAgKHNob3VsZCAoaGFzaC10YWJsZS1wIGFjdHVhbCkpCisgICAgKHNob3VsZCAoZXF1YWwgKGhh c2gtdGFibGUtY291bnQgYWN0dWFsKSAyKSkKKyAgICAoc2hvdWxkIChlcXVhbCAoY2wtc29ydCAo bWFwLXBhaXJzIGFjdHVhbCkgIydzdHJpbmc8IDprZXkgIydjYXIpCisgICAgICAgICAgICAgICAg ICAgJygoImFiYyIgLiBbOSA6ZmFsc2VdKSAoImRlZiIgLiA6bnVsbCkpKSkpKQorCisoZXJ0LWRl ZnRlc3QganNvbi1wYXJzZS1zdHJpbmcvc3RyaW5nICgpCisgIChzaG91bGQtZXJyb3IgKGpzb24t cGFyc2Utc3RyaW5nICJbXCJmb3JtZmVlZFxmXCJdIikgOnR5cGUgJ2pzb24tcGFyc2UtZXJyb3Ip CisgIChzaG91bGQgKGVxdWFsIChqc29uLXBhcnNlLXN0cmluZyAiW1wiZm9vIFxcXCJiYXJcXFwi XCJdIikgWyJmb28gXCJiYXJcIiJdKSkKKyAgKHNob3VsZCAoZXF1YWwgKGpzb24tcGFyc2Utc3Ry aW5nICJbXCJhYmPOsc6yzrNcIl0iKSBbImFiY86xzrLOsyJdKSkKKyAgKHNob3VsZCAoZXF1YWwg KGpzb24tcGFyc2Utc3RyaW5nICJbXCJcXG5hc2RcXHUwNDQ0XFx1MDQ0YlxcdTA0MzJmZ2hcXHRc Il0iKQorICAgICAgICAgICAgICAgICBbIlxuYXNk0YTRi9CyZmdoXHQiXSkpCisgIChzaG91bGQg KGVxdWFsIChqc29uLXBhcnNlLXN0cmluZyAiW1wiXFx1RDgzNFxcdUREMUVcIl0iKSBbIlxVMDAw MUQxMUUiXSkpCisgIChzaG91bGQtZXJyb3IgKGpzb24tcGFyc2Utc3RyaW5nICJmb28iKSA6dHlw ZSAnanNvbi1wYXJzZS1lcnJvcikpCisKKyhlcnQtZGVmdGVzdCBqc29uLXNlcmlhbGl6ZS9zdHJp bmcgKCkKKyAgKHNob3VsZCAoZXF1YWwgKGpzb24tc2VyaWFsaXplIFsiZm9vIl0pICJbXCJmb29c Il0iKSkKKyAgKHNob3VsZCAoZXF1YWwgKGpzb24tc2VyaWFsaXplIFsiYVxuXGZiIl0pICJbXCJh XFxuXFxmYlwiXSIpKQorICAoc2hvdWxkIChlcXVhbCAoanNvbi1zZXJpYWxpemUgWyJcbmFzZNGE 0YvQslx1MDAxZlx1MDA3ZmZnaFx0Il0pCisgICAgICAgICAgICAgICAgICJbXCJcXG5hc2TRhNGL 0LJcXHUwMDFGXHUwMDdmZmdoXFx0XCJdIikpKQorCisoZXJ0LWRlZnRlc3QganNvbi1wYXJzZS1z dHJpbmcvaW5jb21wbGV0ZSAoKQorICAoc2hvdWxkLWVycm9yIChqc29uLXBhcnNlLXN0cmluZyAi WzEyMyIpIDp0eXBlICdqc29uLWVuZC1vZi1maWxlKSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFy c2Utc3RyaW5nL3RyYWlsaW5nICgpCisgIChzaG91bGQtZXJyb3IgKGpzb24tcGFyc2Utc3RyaW5n ICJbMTIzXSBbNDU2XSIpIDp0eXBlICdqc29uLXRyYWlsaW5nLWNvbnRlbnQpKQorCisoZXJ0LWRl ZnRlc3QganNvbi1wYXJzZS1idWZmZXIvaW5jb21wbGV0ZSAoKQorICAod2l0aC10ZW1wLWJ1ZmZl cgorICAgIChpbnNlcnQgIlsxMjMiKQorICAgIChnb3RvLWNoYXIgMSkKKyAgICAoc2hvdWxkLWVy cm9yIChqc29uLXBhcnNlLWJ1ZmZlcikgOnR5cGUgJ2pzb24tZW5kLW9mLWZpbGUpCisgICAgKHNo b3VsZCAoYm9icCkpKSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFyc2UtYnVmZmVyL3RyYWlsaW5n ICgpCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGluc2VydCAiWzEyM10gWzQ1Nl0iKQorICAg IChnb3RvLWNoYXIgMSkKKyAgICAoc2hvdWxkIChlcXVhbCAoanNvbi1wYXJzZS1idWZmZXIpIFsx MjNdKSkKKyAgICAoc2hvdWxkLW5vdCAoYm9icCkpCisgICAgKHNob3VsZCAobG9va2luZy1hdC1w IChyeCAiIFs0NTZdIiBlb3MpKSkpKQorCisocHJvdmlkZSAnanNvbi10ZXN0cykKKzs7OyBqc29u LXRlc3RzLmVsIGVuZHMgaGVyZQotLSAKMi4xNC4yCgo= --001a1144b3daf4b6aa055cb75728--