Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1szP4w-005rP3-7q for pgsql-hackers@arkaria.postgresql.org; Fri, 11 Oct 2024 23:29:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1szP4t-00Dnvg-Nh for pgsql-hackers@arkaria.postgresql.org; Fri, 11 Oct 2024 23:29:48 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1szP4t-00Dntg-3M for pgsql-hackers@lists.postgresql.org; Fri, 11 Oct 2024 23:29:47 +0000 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1szP4l-000aV6-PO for pgsql-hackers@lists.postgresql.org; Fri, 11 Oct 2024 23:29:46 +0000 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-37d49a7207cso1428999f8f.0 for ; Fri, 11 Oct 2024 16:29:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1728689378; x=1729294178; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ZpMqvKQroiVCilStxsl5TPBzx/9psliG5aH+Z4Bok8s=; b=x40WDnHLkO/20jPnPawSRR8TgA5AhHyEtNWFPyUB+B8Ph6oyxQ8ontfDY3B9BWe73H WKKk7KFKgRW0CL+hOT9oewkONEpTKCfeR2q7u8vKjnGA3gMWEGr5qgY3AlAyp6+rzaPv NePKzePwMjIujmc4NHMU0Rxz134kBwGArQn8D7iawj2E8RDhLCSXmSQY1CemLF5kQgWu 24EqDSQ+lBn3e8gTnfidQXOm0rCjNB7XdWnHnr7LRsJO8XdzX/n+NR1s2LGuqL15JzKJ mbkw7T+UFecxsLAiXRuoHe2UD+svFBDX3KgZ/Q4RGk+IAL1yGTJtJrplg2EUj9FnrYk1 PMZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728689378; x=1729294178; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZpMqvKQroiVCilStxsl5TPBzx/9psliG5aH+Z4Bok8s=; b=IqGARMFWusWkokkk0zErEAn3oKobWw9bY6QBbHJFplc1VD3vQc3PT+RPLRBRursSGr fkh8jMglULYiyiLQPbprpWl7IyB7EZQ4BhJqhk5Fb9P6ODFW9em4bzv9KM4BHb03mIB4 R1u/T/hP/7mah72RRmjjCn/MMHQhyOqdYe2nYLFCZRug6npKkaJxnA3HeRj3aR2KGn8j 1XvBFEHIBThUf03rhjdE9mAe6nXNcXZXX+kRPDLlFVGyzBeNjb3LjDlw5if5wZToaxLj luWw1j+p0NgrMxuGVu0VmVbGG4Bg2NYIzXqsOOrlbWhXnjY/v5svuTIyoeRe0/Ig4yDX ZIFg== X-Gm-Message-State: AOJu0Yzt2MwQ/i22sfKHubKQccBC8esRU3UgFk45imgJbDMoLHKbjyjo cGGbE4VBu4aOG7Yn8OQhfE7g6jQJd5kuAC6nsqqd1MsVU7CnLWa0HWP3oqt1lrLksrY21u/bXsj ezta9wUZf05snH1Iq0h50wAzWU6SZSng0GcW8myevG5YFId58 X-Google-Smtp-Source: AGHT+IE9IQjao11u/tSCei2/2FjuW++crFaX1rbYGvt5sNpx5+VKHKAI/7IooMazzmtpfrQOB4KPznAzBw0/I4NBaxc= X-Received: by 2002:adf:fccf:0:b0:37d:39c8:ecca with SMTP id ffacd0b85a97d-37d601cd041mr648699f8f.55.1728689378351; Fri, 11 Oct 2024 16:29:38 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Fri, 11 Oct 2024 19:29:12 -0400 Message-ID: Subject: Re: Avoiding superfluous buffer locking during nbtree backwards scans To: PostgreSQL Hackers Cc: Matthias van de Meent , Tomas Vondra Content-Type: multipart/mixed; boundary="00000000000053113606243bdc06" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000053113606243bdc06 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Oct 10, 2024 at 1:41=E2=80=AFPM Peter Geoghegan wrote: > The main simplification new to v4 is that v4 isolates the need to call > _bt_drop_lock_and_maybe_pin to only 2 functions: _bt_readnextpage, and > its new _bt_readfirstpage "sibling" function. The functions have > similar preconditions, and identical postconditions -- all of which > are now clearly documented. Worked on this a little more today. Attached is v5, which goes even further than v4 did. Highlights: * Completely gets rid of _bt_initialize_more_data by moving its code into the new _bt_readfirstpage function. * Adds similar "initialize moreLeft/moreRight" code to the corresponding point within _bt_readnextpage (that is, at the start of _bt_readnextpage) -- meaning I moved a bit more code from _bt_steppage into _bt_readnextpage. Again, _bt_readnextpage and the new _bt_readfirstpage function are intended to be "sibling" functions (while _bt_steppage is demoted to a helper that sets up a call to _bt_readfirstpage). The matching handling of currPos initialization within _bt_readnextpage and the _bt_readfirstpage pushes this further than in v4. * We now reset currPos state (including even its moreLeft/moreRight fields) within _bt_parallel_seize, automatically and regardless of any other details. It doesn't really make sense that (up until now) we've trusted the shared state that we seized from the parallel scan to kinda be in sync with the local currPos state (at least its moreLeft/moreRight need to be in sync, to avoid confusion within _bt_readnextpage). This allowed me to remove several parallel-only BTScanPosInvalidate calls from _bt_readnextpage. This "currPos must be kept in sync with parallel scan state" confusion is exemplified by the following code snippet (which FWIW was already removed by earlier revisions of the patch), that appears in the backwards scan block of _bt_readnextpage on master: """ /* * Should only happen in parallel cases, when some other backend * advanced the scan. */ if (so->currPos.currPage !=3D blkno) { BTScanPosUnpinIfPinned(so->currPos); so->currPos.currPage =3D blkno; } """ Why should the parallel scan have any concern for what currPos is, in gener= al? * Now nbtree has only one PredicateLockPage call, inside _bt_readpage. This saves us an extra BufferGetBlockNumber call. (v4 pushed PredicateLockPage calls down one layer, v5 pushes them down another layer still.) * Improved precondition/postcondition comments, and generally cleaner separation between _bt_steppage and _bt_readnextpage. -- Peter Geoghegan --00000000000053113606243bdc06 Content-Type: application/x-patch; name="v5-0001-Optimize-and-simplify-nbtree-backwards-scans.patch" Content-Disposition: attachment; filename="v5-0001-Optimize-and-simplify-nbtree-backwards-scans.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m25cxjwx0 RnJvbSBiM2M4OTJkNDI4Njg4MDU3Mzc4YzVhNzRlMmJiMzEzYzFhNmI0YzJlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFR1 ZSwgOCBPY3QgMjAyNCAxMTo0MDo1NCAtMDQwMApTdWJqZWN0OiBbUEFUQ0ggdjVdIE9wdGltaXpl IGFuZCBzaW1wbGlmeSBuYnRyZWUgYmFja3dhcmRzIHNjYW5zLgoKQXV0aG9yOiBNYXR0aGlhcyB2 YW4gZGUgTWVlbnQgPGJvZWtld3VybStwb3N0Z3Jlc0BnbWFpbC5jb20+CkF1dGhvcjogUGV0ZXIg R2VvZ2hlZ2FuIDxwZ0Bib3d0LmllPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NB RXplMldncEJHUmdUVHhUV1ZQWGM5K1BCNmZjMWE3dCtWeUdYSHpmbnJGWGNRVnhuQUBtYWlsLmdt YWlsLmNvbQpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NBSDItV3prQlR1RnY3VzIr ODRqSlQ4bVdaTFhWTDBHSHEyaE1VVG42YzlWdz1lWXJDd0BtYWlsLmdtYWlsLmNvbQotLS0KIHNy Yy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaCAgICAgICAgICAgfCAgMjEgKy0KIHNyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMgICAgfCAgNDkgKystCiBzcmMvYmFja2VuZC9hY2Nlc3Mv bmJ0cmVlL25idHNlYXJjaC5jIHwgNjAzICsrKysrKysrKysrKystLS0tLS0tLS0tLS0tCiBzcmMv YmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgIHwgICAyICstCiA0IGZpbGVzIGNoYW5n ZWQsIDM0NyBpbnNlcnRpb25zKCspLCAzMjggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvYWNjZXNzL25idHJlZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCmlu ZGV4IGQ2NDMwMGZiOS4uNTk0ZWRkYWVjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv bmJ0cmVlLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCkBAIC05NTQsNiArOTU0 LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRTY2FuUG9zRGF0YQogCiAJWExvZ1JlY1B0cglsc247CQkJ LyogcG9zIGluIHRoZSBXQUwgc3RyZWFtIHdoZW4gcGFnZSB3YXMgcmVhZCAqLwogCUJsb2NrTnVt YmVyIGN1cnJQYWdlOwkJLyogcGFnZSByZWZlcmVuY2VkIGJ5IGl0ZW1zIGFycmF5ICovCisJQmxv Y2tOdW1iZXIgcHJldlBhZ2U7CQkvKiBwYWdlJ3MgbGVmdCBsaW5rIHdoZW4gd2Ugc2Nhbm5lZCBp dCAqLwogCUJsb2NrTnVtYmVyIG5leHRQYWdlOwkJLyogcGFnZSdzIHJpZ2h0IGxpbmsgd2hlbiB3 ZSBzY2FubmVkIGl0ICovCiAKIAkvKgpAQCAtOTY1LDE1ICs5NjYsNiBAQCB0eXBlZGVmIHN0cnVj dCBCVFNjYW5Qb3NEYXRhCiAJYm9vbAkJbW9yZUxlZnQ7CiAJYm9vbAkJbW9yZVJpZ2h0OwogCi0J LyoKLQkgKiBEaXJlY3Rpb24gb2YgdGhlIHNjYW4gYXQgdGhlIHRpbWUgdGhhdCBfYnRfcmVhZHBh Z2Ugd2FzIGNhbGxlZC4KLQkgKgotCSAqIFVzZWQgYnkgYnRyZXN0cnBvcyB0byAicmVzdG9yZSIg dGhlIHNjYW4ncyBhcnJheSBrZXlzIGJ5IHJlc2V0dGluZyBlYWNoCi0JICogYXJyYXkgdG8gaXRz IGZpcnN0IGVsZW1lbnQncyB2YWx1ZSAoZmlyc3QgaW4gdGhpcyBzY2FuIGRpcmVjdGlvbikuIFRo aXMKLQkgKiBhdm9pZHMgdGhlIG5lZWQgdG8gZGlyZWN0bHkgdHJhY2sgdGhlIGFycmF5IGtleXMg aW4gYnRtYXJrcG9zLgotCSAqLwotCVNjYW5EaXJlY3Rpb24gZGlyOwotCiAJLyoKIAkgKiBJZiB3 ZSBhcmUgZG9pbmcgYW4gaW5kZXgtb25seSBzY2FuLCBuZXh0VHVwbGVPZmZzZXQgaXMgdGhlIGZp cnN0IGZyZWUKIAkgKiBsb2NhdGlvbiBpbiB0aGUgYXNzb2NpYXRlZCB0dXBsZSBzdG9yYWdlIHdv cmtzcGFjZS4KQEAgLTEwMjIsNiArMTAxNCw3IEBAIHR5cGVkZWYgQlRTY2FuUG9zRGF0YSAqQlRT Y2FuUG9zOwogI2RlZmluZSBCVFNjYW5Qb3NJbnZhbGlkYXRlKHNjYW5wb3MpIFwKIAlkbyB7IFwK IAkJKHNjYW5wb3MpLmN1cnJQYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOyBcCisJCShzY2FucG9z KS5wcmV2UGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsgXAogCQkoc2NhbnBvcykubmV4dFBhZ2Ug PSBJbnZhbGlkQmxvY2tOdW1iZXI7IFwKIAkJKHNjYW5wb3MpLmJ1ZiA9IEludmFsaWRCdWZmZXI7 IFwKIAkJKHNjYW5wb3MpLmxzbiA9IEludmFsaWRYTG9nUmVjUHRyOyBcCkBAIC0xMDcxLDYgKzEw NjQsNyBAQCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5PcGFxdWVEYXRhCiAJICogZGV0ZXJtaW5lIGlm IHRoZXJlIGlzIGEgbWFyaywgZmlyc3QgbG9vayBhdCBtYXJrSXRlbUluZGV4LCB0aGVuIGF0CiAJ ICogbWFya1Bvcy4KIAkgKi8KKwlTY2FuRGlyZWN0aW9uIG1hcmtEaXI7CQkvKiBkaXJlY3Rpb24g b2Ygc2NhbiB3aXRoIG1hcmsgKi8KIAlpbnQJCQltYXJrSXRlbUluZGV4OwkvKiBpdGVtSW5kZXgs IG9yIC0xIGlmIG5vdCB2YWxpZCAqLwogCiAJLyoga2VlcCB0aGVzZSBsYXN0IGluIHN0cnVjdCBm b3IgZWZmaWNpZW5jeSAqLwpAQCAtMTA5MCw3ICsxMDg0LDYgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRS ZWFkUGFnZVN0YXRlCiAJT2Zmc2V0TnVtYmVyIG1pbm9mZjsJCS8qIExvd2VzdCBub24tcGl2b3Qg dHVwbGUncyBvZmZzZXQgKi8KIAlPZmZzZXROdW1iZXIgbWF4b2ZmOwkJLyogSGlnaGVzdCBub24t cGl2b3QgdHVwbGUncyBvZmZzZXQgKi8KIAlJbmRleFR1cGxlCWZpbmFsdHVwOwkJLyogTmVlZGVk IGJ5IHNjYW5zIHdpdGggYXJyYXkga2V5cyAqLwotCUJsb2NrTnVtYmVyIHByZXZfc2Nhbl9wYWdl OyAvKiBwcmV2aW91cyBfYnRfcGFyYWxsZWxfcmVsZWFzZSBibG9jayAqLwogCVBhZ2UJCXBhZ2U7 CQkJLyogUGFnZSBiZWluZyByZWFkICovCiAKIAkvKiBQZXItdHVwbGUgaW5wdXQgcGFyYW1ldGVy cywgc2V0IGJ5IF9idF9yZWFkcGFnZSBmb3IgX2J0X2NoZWNra2V5cyAqLwpAQCAtMTE5MiwxMSAr MTE4NSwxMyBAQCBleHRlcm4gaW50CWJ0Z2V0dHJlZWhlaWdodChSZWxhdGlvbiByZWwpOwogICog cHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zIGluIG5idHJlZS5jCiAgKi8KIGV4dGVy biBib29sIF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVy ICpwYWdlbm8sCi0JCQkJCQkJICAgYm9vbCBmaXJzdCk7Ci1leHRlcm4gdm9pZCBfYnRfcGFyYWxs ZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyIHNjYW5fcGFnZSk7CisJ CQkJCQkJICAgQmxvY2tOdW1iZXIgKmN1cnJibGtubywgYm9vbCBmaXJzdCk7CitleHRlcm4gdm9p ZCBfYnRfcGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sCisJCQkJCQkJCSBCbG9j a051bWJlciBuZXh0X3NjYW5fcGFnZSwKKwkJCQkJCQkJIEJsb2NrTnVtYmVyIGN1cnJfcGFnZSk7 CiBleHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pOwogZXh0 ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX3ByaW1zY2FuX3NjaGVkdWxlKEluZGV4U2NhbkRlc2Mgc2Nh biwKLQkJCQkJCQkJCQkgICBCbG9ja051bWJlciBwcmV2X3NjYW5fcGFnZSk7CisJCQkJCQkJCQkJ ICAgQmxvY2tOdW1iZXIgY3Vycl9wYWdlKTsKIAogLyoKICAqIHByb3RvdHlwZXMgZm9yIGZ1bmN0 aW9ucyBpbiBuYnRkZWR1cC5jCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idHJlZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwppbmRleCA1NmU1 MDJjNGYuLmRiMjBiMTEzOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnRyZWUuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jCkBAIC02Niw3 ICs2Niw5IEBAIHR5cGVkZWYgZW51bQogICovCiB0eXBlZGVmIHN0cnVjdCBCVFBhcmFsbGVsU2Nh bkRlc2NEYXRhCiB7Ci0JQmxvY2tOdW1iZXIgYnRwc19zY2FuUGFnZTsJLyogbGF0ZXN0IG9yIG5l eHQgcGFnZSB0byBiZSBzY2FubmVkICovCisJQmxvY2tOdW1iZXIgYnRwc19uZXh0U2NhblBhZ2U7 CS8qIG5leHQgcGFnZSB0byBiZSBzY2FubmVkICovCisJQmxvY2tOdW1iZXIgYnRwc19sYXN0Q3Vy clBhZ2U7CS8qIHBhZ2Ugd2hvc2Ugc2libGluZyBsaW5rIHdhcyBjb3BpZWQgaW50bworCQkJCQkJ CQkJICogYnRwc19zY2FuUGFnZSAqLwogCUJUUFNfU3RhdGUJYnRwc19wYWdlU3RhdHVzOwkvKiBp bmRpY2F0ZXMgd2hldGhlciBuZXh0IHBhZ2UgaXMKIAkJCQkJCQkJCSAqIGF2YWlsYWJsZSBmb3Ig c2Nhbi4gc2VlIGFib3ZlIGZvcgogCQkJCQkJCQkJICogcG9zc2libGUgc3RhdGVzIG9mIHBhcmFs bGVsIHNjYW4uICovCkBAIC01MjAsNyArNTIyLDcgQEAgYnRyZXN0cnBvcyhJbmRleFNjYW5EZXNj IHNjYW4pCiAJCQkvKiBSZXNldCB0aGUgc2NhbidzIGFycmF5IGtleXMgKHNlZSBfYnRfc3RlcHBh Z2UgZm9yIHdoeSkgKi8KIAkJCWlmIChzby0+bnVtQXJyYXlLZXlzKQogCQkJewotCQkJCV9idF9z dGFydF9hcnJheV9rZXlzKHNjYW4sIHNvLT5jdXJyUG9zLmRpcik7CisJCQkJX2J0X3N0YXJ0X2Fy cmF5X2tleXMoc2Nhbiwgc28tPm1hcmtEaXIpOwogCQkJCXNvLT5uZWVkUHJpbVNjYW4gPSBmYWxz ZTsKIAkJCX0KIAkJfQpAQCAtNTQ4LDcgKzU1MCw4IEBAIGJ0aW5pdHBhcmFsbGVsc2Nhbih2b2lk ICp0YXJnZXQpCiAJQlRQYXJhbGxlbFNjYW5EZXNjIGJ0X3RhcmdldCA9IChCVFBhcmFsbGVsU2Nh bkRlc2MpIHRhcmdldDsKIAogCVNwaW5Mb2NrSW5pdCgmYnRfdGFyZ2V0LT5idHBzX211dGV4KTsK LQlidF90YXJnZXQtPmJ0cHNfc2NhblBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CisJYnRfdGFy Z2V0LT5idHBzX25leHRTY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsKKwlidF90YXJnZXQt PmJ0cHNfbGFzdEN1cnJQYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCWJ0X3RhcmdldC0+YnRw c19wYWdlU3RhdHVzID0gQlRQQVJBTExFTF9OT1RfSU5JVElBTElaRUQ7CiAJQ29uZGl0aW9uVmFy aWFibGVJbml0KCZidF90YXJnZXQtPmJ0cHNfY3YpOwogfQpAQCAtNTczLDcgKzU3Niw4IEBAIGJ0 cGFyYWxsZWxyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuKQogCSAqIGNvbnNpc3RlbmN5LgogCSAq LwogCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKLQlidHNjYW4tPmJ0cHNf c2NhblBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CisJYnRzY2FuLT5idHBzX25leHRTY2FuUGFn ZSA9IEludmFsaWRCbG9ja051bWJlcjsKKwlidHNjYW4tPmJ0cHNfbGFzdEN1cnJQYWdlID0gSW52 YWxpZEJsb2NrTnVtYmVyOwogCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0gQlRQQVJBTExFTF9O T1RfSU5JVElBTElaRUQ7CiAJU3BpbkxvY2tSZWxlYXNlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwog fQpAQCAtNjAwLDcgKzYwNCw4IEBAIGJ0cGFyYWxsZWxyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2Fu KQogICogQ2FsbGVycyBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZSBvZiBwYWdlbm8gaWYgdGhlIHJl dHVybiB2YWx1ZSBpcyBmYWxzZS4KICAqLwogYm9vbAotX2J0X3BhcmFsbGVsX3NlaXplKEluZGV4 U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2VubywgYm9vbCBmaXJzdCkKK19idF9wYXJh bGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8sCisJCQkJ ICAgQmxvY2tOdW1iZXIgKmN1cnJibGtubywgYm9vbCBmaXJzdCkKIHsKIAlCVFNjYW5PcGFxdWUg c28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJYm9vbAkJZXhpdF9sb29wID0gZmFs c2U7CkBAIC02MDksNiArNjE0LDE0IEBAIF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNj IHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8sIGJvb2wgZmlyc3QpCiAJQlRQYXJhbGxlbFNjYW5E ZXNjIGJ0c2NhbjsKIAogCSpwYWdlbm8gPSBQX05PTkU7CisJKmN1cnJibGtubyA9IEludmFsaWRC bG9ja051bWJlcjsKKworCS8qCisJICogUmVzZXQgbW9yZUxlZnQvbW9yZVJpZ2h0LiAgV2UgZG9u J3Qgd2FudCB0byByZXRhaW4gaW5mb3JtYXRpb24gZnJvbSB0aGUKKwkgKiBsYXN0IHRpbWUgdGhl IGJhY2tlbmQgc2VpemVkIHRoZSBzY2FuLgorCSAqLworCUJUU2NhblBvc0ludmFsaWRhdGUoc28t PmN1cnJQb3MpOworCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gc28tPmN1cnJQb3MubW9yZVJpZ2h0 ID0gdHJ1ZTsKIAogCWlmIChmaXJzdCkKIAl7CkBAIC02ODQsNyArNjk3LDggQEAgX2J0X3BhcmFs bGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2VubywgYm9vbCBm aXJzdCkKIAkJCSAqIG9mIGFkdmFuY2luZyBpdCB0byBhIG5ldyBwYWdlIQogCQkJICovCiAJCQli dHNjYW4tPmJ0cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfQURWQU5DSU5HOwotCQkJKnBhZ2Vu byA9IGJ0c2Nhbi0+YnRwc19zY2FuUGFnZTsKKwkJCSpwYWdlbm8gPSBidHNjYW4tPmJ0cHNfbmV4 dFNjYW5QYWdlOworCQkJKmN1cnJibGtubyA9IGJ0c2Nhbi0+YnRwc19sYXN0Q3VyclBhZ2U7CiAJ CQlleGl0X2xvb3AgPSB0cnVlOwogCQl9CiAJCVNwaW5Mb2NrUmVsZWFzZSgmYnRzY2FuLT5idHBz X211dGV4KTsKQEAgLTY5OSwxNyArNzEzLDIyIEBAIF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNj YW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8sIGJvb2wgZmlyc3QpCiAKIC8qCiAgKiBf YnRfcGFyYWxsZWxfcmVsZWFzZSgpIC0tIENvbXBsZXRlIHRoZSBwcm9jZXNzIG9mIGFkdmFuY2lu ZyB0aGUgc2NhbiB0byBhCi0gKgkJbmV3IHBhZ2UuICBXZSBub3cgaGF2ZSB0aGUgbmV3IHZhbHVl IGJ0cHNfc2NhblBhZ2U7IHNvbWUgb3RoZXIgYmFja2VuZAorICoJCW5ldyBwYWdlLiAgV2Ugbm93 IGhhdmUgdGhlIG5ldyB2YWx1ZSBidHBzX25leHRTY2FuUGFnZTsgYW5vdGhlciBiYWNrZW5kCiAg KgkJY2FuIG5vdyBiZWdpbiBhZHZhbmNpbmcgdGhlIHNjYW4uCiAgKgotICogQ2FsbGVycyB3aG9z ZSBzY2FuIHVzZXMgYXJyYXkga2V5cyBtdXN0IHNhdmUgdGhlaXIgc2Nhbl9wYWdlIGFyZ3VtZW50 IHNvCisgKiBDYWxsZXJzIHdob3NlIHNjYW4gdXNlcyBhcnJheSBrZXlzIG11c3Qgc2F2ZSB0aGVp ciBjdXJyX3BhZ2UgYXJndW1lbnQgc28KICAqIHRoYXQgaXQgY2FuIGJlIHBhc3NlZCB0byBfYnRf cGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUsIHNob3VsZCBjYWxsZXIKICAqIGRldGVybWluZSB0 aGF0IGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gaXMgcmVxdWlyZWQuICBJZiB0aGF0IGhh cHBlbnMsCiAgKiBzY2FuX3BhZ2Ugd29uJ3QgYmUgc2Nhbm5lZCBieSBhbnkgYmFja2VuZCAodW5s ZXNzIHRoZSBuZXh0IHByaW1pdGl2ZSBpbmRleAogICogc2NhbiBsYW5kcyBvbiBzY2FuX3BhZ2Up LgorICoKKyAqIE5vdGU6IHVubGlrZSB0aGUgc2VyaWFsIGNhc2UsIHBhcmFsbGVsIHNjYW5zIGRv bid0IG5lZWQgdG8gcmVtZW1iZXIgYm90aAorICogc2libGluZyBsaW5rcy4gIENhbGxlciBjYW4g anVzdCBwYXNzIHVzIHdoaWNoZXZlciBsaW5rIGlzIG5leHQgZm9yIHRoZSBzY2FuCisgKiBkaXJl Y3Rpb24gYmVjYXVzZSB0aGUgZGlyZWN0aW9uIGNhbm5vdCBjaGFuZ2Ugd2hlbiBwYXJhbGxlbGlz bSBpcyBpbiB1c2UuCiAgKi8KIHZvaWQKLV9idF9wYXJhbGxlbF9yZWxlYXNlKEluZGV4U2NhbkRl c2Mgc2NhbiwgQmxvY2tOdW1iZXIgc2Nhbl9wYWdlKQorX2J0X3BhcmFsbGVsX3JlbGVhc2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBuZXh0X3NjYW5fcGFnZSwKKwkJCQkJIEJsb2Nr TnVtYmVyIGN1cnJfcGFnZSkKIHsKIAlQYXJhbGxlbEluZGV4U2NhbkRlc2MgcGFyYWxsZWxfc2Nh biA9IHNjYW4tPnBhcmFsbGVsX3NjYW47CiAJQlRQYXJhbGxlbFNjYW5EZXNjIGJ0c2NhbjsKQEAg LTcxOCw3ICs3MzcsOCBAQCBfYnRfcGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4s IEJsb2NrTnVtYmVyIHNjYW5fcGFnZSkKIAkJCQkJCQkJCQkJCSAgcGFyYWxsZWxfc2Nhbi0+cHNf b2Zmc2V0KTsKIAogCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKLQlidHNj YW4tPmJ0cHNfc2NhblBhZ2UgPSBzY2FuX3BhZ2U7CisJYnRzY2FuLT5idHBzX25leHRTY2FuUGFn ZSA9IG5leHRfc2Nhbl9wYWdlOworCWJ0c2Nhbi0+YnRwc19sYXN0Q3VyclBhZ2UgPSBjdXJyX3Bh Z2U7CiAJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX0lETEU7CiAJU3Bpbkxv Y2tSZWxlYXNlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCUNvbmRpdGlvblZhcmlhYmxlU2lnbmFs KCZidHNjYW4tPmJ0cHNfY3YpOwpAQCAtNzc0LDEzICs3OTQsMTMgQEAgX2J0X3BhcmFsbGVsX2Rv bmUoSW5kZXhTY2FuRGVzYyBzY2FuKQogLyoKICAqIF9idF9wYXJhbGxlbF9wcmltc2Nhbl9zY2hl ZHVsZSgpIC0tIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4uCiAgKgotICog Q2FsbGVyIHBhc3NlcyB0aGUgYmxvY2sgbnVtYmVyIG1vc3QgcmVjZW50bHkgcGFzc2VkIHRvIF9i dF9wYXJhbGxlbF9yZWxlYXNlCisgKiBDYWxsZXIgcGFzc2VzIHRoZSBjdXJyX3BhZ2UgbW9zdCBy ZWNlbnRseSBwYXNzZWQgdG8gX2J0X3BhcmFsbGVsX3JlbGVhc2UKICAqIGJ5IGl0cyBiYWNrZW5k LiAgQ2FsbGVyIHN1Y2Nlc3NmdWxseSBzY2hlZHVsZXMgdGhlIG5leHQgcHJpbWl0aXZlIGluZGV4 IHNjYW4KICAqIGlmIHRoZSBzaGFyZWQgcGFyYWxsZWwgc3RhdGUgaGFzbid0IGJlZW4gc2VpemVk IHNpbmNlIGNhbGxlcidzIGJhY2tlbmQgbGFzdAogICogYWR2YW5jZWQgdGhlIHNjYW4uCiAgKi8K IHZvaWQKLV9idF9wYXJhbGxlbF9wcmltc2Nhbl9zY2hlZHVsZShJbmRleFNjYW5EZXNjIHNjYW4s IEJsb2NrTnVtYmVyIHByZXZfc2Nhbl9wYWdlKQorX2J0X3BhcmFsbGVsX3ByaW1zY2FuX3NjaGVk dWxlKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgY3Vycl9wYWdlKQogewogCUJUU2Nh bk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAlQYXJhbGxlbEluZGV4 U2NhbkRlc2MgcGFyYWxsZWxfc2NhbiA9IHNjYW4tPnBhcmFsbGVsX3NjYW47CkBAIC03OTIsMTAg KzgxMiwxMSBAQCBfYnRfcGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUoSW5kZXhTY2FuRGVzYyBz Y2FuLCBCbG9ja051bWJlciBwcmV2X3NjYW5fcGFnZSkKIAkJCQkJCQkJCQkJCSAgcGFyYWxsZWxf c2Nhbi0+cHNfb2Zmc2V0KTsKIAogCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4 KTsKLQlpZiAoYnRzY2FuLT5idHBzX3NjYW5QYWdlID09IHByZXZfc2Nhbl9wYWdlICYmCisJaWYg KGJ0c2Nhbi0+YnRwc19sYXN0Q3VyclBhZ2UgPT0gY3Vycl9wYWdlICYmCiAJCWJ0c2Nhbi0+YnRw c19wYWdlU3RhdHVzID09IEJUUEFSQUxMRUxfSURMRSkKIAl7Ci0JCWJ0c2Nhbi0+YnRwc19zY2Fu UGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsKKwkJYnRzY2FuLT5idHBzX25leHRTY2FuUGFnZSA9 IEludmFsaWRCbG9ja051bWJlcjsKKwkJYnRzY2FuLT5idHBzX2xhc3RDdXJyUGFnZSA9IEludmFs aWRCbG9ja051bWJlcjsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX05F RURfUFJJTVNDQU47CiAKIAkJLyogU2VyaWFsaXplIHNjYW4ncyBjdXJyZW50IGFycmF5IGtleXMg Ki8KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMgYi9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jCmluZGV4IGZmZjdjODllYS4uY2Q5 MDkyMTMwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKQEAgLTQzLDEyICs0 MywxMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgX2J0X3NhdmVwb3N0aW5naXRlbShCVFNjYW5PcGFx dWUgc28sIGludCBpdGVtSW5kZXgsCiAJCQkJCQkJCQkgICBPZmZzZXROdW1iZXIgb2ZmbnVtLAog CQkJCQkJCQkJICAgSXRlbVBvaW50ZXIgaGVhcFRpZCwgaW50IHR1cGxlT2Zmc2V0KTsKIHN0YXRp YyBib29sIF9idF9zdGVwcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGly KTsKLXN0YXRpYyBib29sIF9idF9yZWFkbmV4dHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9j a051bWJlciBibGtubywgU2NhbkRpcmVjdGlvbiBkaXIpOwotc3RhdGljIGJvb2wgX2J0X3BhcmFs bGVsX3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgYmxrbm8sCi0JCQkJ CQkJCSAgU2NhbkRpcmVjdGlvbiBkaXIpOwotc3RhdGljIEJ1ZmZlciBfYnRfd2Fsa19sZWZ0KFJl bGF0aW9uIHJlbCwgQnVmZmVyIGJ1Zik7CitzdGF0aWMgYm9vbCBfYnRfcmVhZGZpcnN0cGFnZShJ bmRleFNjYW5EZXNjIHNjYW4sIE9mZnNldE51bWJlciBvZmZudW0sCisJCQkJCQkJICBTY2FuRGly ZWN0aW9uIGRpcik7CitzdGF0aWMgYm9vbCBfYnRfcmVhZG5leHRwYWdlKEluZGV4U2NhbkRlc2Mg c2NhbiwgQmxvY2tOdW1iZXIgYmxrbm8sCisJCQkJCQkJIEJsb2NrTnVtYmVyIGxhc3RjdXJyYmxr bm8sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyBCdWZmZXIgX2J0X2xvY2tfYW5kX3ZhbGlk YXRlX2xlZnQoUmVsYXRpb24gcmVsLCBCbG9ja051bWJlciAqYmxrbm8sCisJCQkJCQkJCQkJIEJs b2NrTnVtYmVyIGxhc3RjdXJyYmxrbm8pOwogc3RhdGljIGJvb2wgX2J0X2VuZHBvaW50KEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpOwotc3RhdGljIGlubGluZSB2b2lkIF9i dF9pbml0aWFsaXplX21vcmVfZGF0YShCVFNjYW5PcGFxdWUgc28sIFNjYW5EaXJlY3Rpb24gZGly KTsKIAogCiAvKgpAQCAtODg5LDcgKzg5MCw2IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCVNjYW5LZXlEYXRhIG5vdG51bGxrZXlzW0lOREVYX01B WF9LRVlTXTsKIAlpbnQJCQlrZXlzeiA9IDA7CiAJaW50CQkJaTsKLQlib29sCQlzdGF0dXM7CiAJ U3RyYXRlZ3lOdW1iZXIgc3RyYXRfdG90YWw7CiAJQlRTY2FuUG9zSXRlbSAqY3Vyckl0ZW07CiAJ QmxvY2tOdW1iZXIgYmxrbm87CkBAIC05MjQsNyArOTI0LDEwIEBAIF9idF9maXJzdChJbmRleFNj YW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCSAqLwogCWlmIChzY2FuLT5wYXJhbGxl bF9zY2FuICE9IE5VTEwpCiAJewotCQlzdGF0dXMgPSBfYnRfcGFyYWxsZWxfc2VpemUoc2Nhbiwg JmJsa25vLCB0cnVlKTsKKwkJYm9vbAkJc3RhdHVzOworCQlCbG9ja051bWJlciBsYXN0Y3VycmJs a25vOworCisJCXN0YXR1cyA9IF9idF9wYXJhbGxlbF9zZWl6ZShzY2FuLCAmYmxrbm8sICZsYXN0 Y3VycmJsa25vLCB0cnVlKTsKIAogCQkvKgogCQkgKiBJbml0aWFsaXplIGFycmF5cyAod2hlbiBf YnRfcGFyYWxsZWxfc2VpemUgZGlkbid0IGFscmVhZHkgc2V0IHVwCkBAIC05NDIsNyArOTQ1LDE0 IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCQl9 CiAJCWVsc2UgaWYgKGJsa25vICE9IEludmFsaWRCbG9ja051bWJlcikKIAkJewotCQkJaWYgKCFf YnRfcGFyYWxsZWxfcmVhZHBhZ2Uoc2NhbiwgYmxrbm8sIGRpcikpCisJCQlBc3NlcnQoIXNvLT5u ZWVkUHJpbVNjYW4pOworCisJCQkvKgorCQkJICogV2UgYW50aWNpcGF0ZWQgc3RhcnRpbmcgYW5v dGhlciBwcmltaXRpdmUgc2NhbiwgYnV0IHNvbWUgb3RoZXIKKwkJCSAqIHdvcmtlciBiZXQgdXMg dG8gaXQuICBCeXBhc3MgX2J0X3JlYWRmaXJzdHBhZ2UgYnkgY2FsbGluZworCQkJICogX2J0X3Jl YWRuZXh0cGFnZSBkaXJlY3RseS4KKwkJCSAqLworCQkJaWYgKCFfYnRfcmVhZG5leHRwYWdlKHNj YW4sIGJsa25vLCBsYXN0Y3VycmJsa25vLCBkaXIpKQogCQkJCXJldHVybiBmYWxzZTsKIAkJCWdv dG8gcmVhZGNvbXBsZXRlOwogCQl9CkBAIC0xNDI3LDEwICsxNDM3LDYgQEAgX2J0X2ZpcnN0KElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCX0KIAl9CiAKLQlQcmVkaWNh dGVMb2NrUGFnZShyZWwsIEJ1ZmZlckdldEJsb2NrTnVtYmVyKGJ1ZiksIHNjYW4tPnhzX3NuYXBz aG90KTsKLQotCV9idF9pbml0aWFsaXplX21vcmVfZGF0YShzbywgZGlyKTsKLQogCS8qIHBvc2l0 aW9uIHRvIHRoZSBwcmVjaXNlIGl0ZW0gb24gdGhlIHBhZ2UgKi8KIAlvZmZudW0gPSBfYnRfYmlu c3JjaChyZWwsICZpbnNrZXksIGJ1Zik7CiAJQXNzZXJ0KCFCVFNjYW5Qb3NJc1ZhbGlkKHNvLT5j dXJyUG9zKSk7CkBAIC0xNDU1LDIxICsxNDYxLDggQEAgX2J0X2ZpcnN0KEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJICogZm9yIHRoZSBwYWdlLiAgRm9yIGV4YW1wbGUs IHdoZW4gaW5za2V5IGlzIGJvdGggPCB0aGUgbGVhZiBwYWdlJ3MgaGlnaAogCSAqIGtleSBhbmQg PiBhbGwgb2YgaXRzIG5vbi1waXZvdCB0dXBsZXMsIG9mZm51bSB3aWxsIGJlICJtYXhvZmYgKyAx Ii4KIAkgKi8KLQlpZiAoIV9idF9yZWFkcGFnZShzY2FuLCBkaXIsIG9mZm51bSwgdHJ1ZSkpCi0J ewotCQkvKgotCQkgKiBUaGVyZSdzIG5vIGFjdHVhbGx5LW1hdGNoaW5nIGRhdGEgb24gdGhpcyBw YWdlLiAgVHJ5IHRvIGFkdmFuY2UgdG8KLQkJICogdGhlIG5leHQgcGFnZS4gIFJldHVybiBmYWxz ZSBpZiB0aGVyZSdzIG5vIG1hdGNoaW5nIGRhdGEgYXQgYWxsLgotCQkgKi8KLQkJX2J0X3VubG9j a2J1ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBzby0+Y3VyclBvcy5idWYpOwotCQlpZiAoIV9idF9z dGVwcGFnZShzY2FuLCBkaXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQllbHNlCi0JewotCQkv KiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtIHRvIHJldHVybiBhcyBzY2FuJ3MgZmlyc3QgaXRl bSAqLwotCQlfYnRfZHJvcF9sb2NrX2FuZF9tYXliZV9waW4oc2NhbiwgJnNvLT5jdXJyUG9zKTsK LQl9CisJaWYgKCFfYnRfcmVhZGZpcnN0cGFnZShzY2FuLCBvZmZudW0sIGRpcikpCisJCXJldHVy biBmYWxzZTsKIAogcmVhZGNvbXBsZXRlOgogCS8qIE9LLCBpdGVtSW5kZXggc2F5cyB3aGF0IHRv IHJldHVybiAqLwpAQCAtMTU0NSwxNCArMTUzOCw2IEBAIF9idF9uZXh0KEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAgKiB0aGF0IHRoZXJlIGNhbiBiZSBubyBtb3JlIG1h dGNoaW5nIHR1cGxlcyBpbiB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbgogICogKGNvdWxkIGp1 c3QgYmUgZm9yIHRoZSBjdXJyZW50IHByaW1pdGl2ZSBpbmRleCBzY2FuIHdoZW4gc2NhbiBoYXMg YXJyYXlzKS4KICAqCi0gKiBfYnRfZmlyc3QgY2FsbGVyIHBhc3NlcyB1cyBhbiBvZmZudW0gcmV0 dXJuZWQgYnkgX2J0X2JpbnNyY2gsIHdoaWNoIG1pZ2h0Ci0gKiBiZSBhbiBvdXQgb2YgYm91bmRz IG9mZm51bSBzdWNoIGFzICJtYXhvZmYgKyAxIiBpbiBjZXJ0YWluIGNvcm5lciBjYXNlcy4KLSAq IF9idF9jaGVja2tleXMgd2lsbCBzdG9wIHRoZSBzY2FuIGFzIHNvb24gYXMgYW4gZXF1YWxpdHkg cXVhbCBmYWlscyAod2hlbgotICogaXRzIHNjYW4ga2V5IHdhcyBtYXJrZWQgcmVxdWlyZWQpLCBz byBfYnRfZmlyc3QgX211c3RfIHBhc3MgdXMgYW4gb2ZmbnVtCi0gKiBleGFjdGx5IGF0IHRoZSBi ZWdpbm5pbmcgb2Ygd2hlcmUgZXF1YWwgdHVwbGVzIGFyZSB0byBiZSBmb3VuZC4gIFdoZW4gd2Un cmUKLSAqIHBhc3NlZCBhbiBvZmZudW0gcGFzdCB0aGUgZW5kIG9mIHRoZSBwYWdlLCB3ZSBtaWdo dCBzdGlsbCBtYW5hZ2UgdG8gc3RvcAotICogdGhlIHNjYW4gb24gdGhpcyBwYWdlIGJ5IGNhbGxp bmcgX2J0X2NoZWNra2V5cyBhZ2FpbnN0IHRoZSBoaWdoIGtleS4KLSAqCiAgKiBJbiB0aGUgY2Fz ZSBvZiBhIHBhcmFsbGVsIHNjYW4sIGNhbGxlciBtdXN0IGhhdmUgY2FsbGVkIF9idF9wYXJhbGxl bF9zZWl6ZQogICogcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uOyB0aGlzIGZ1bmN0aW9u IHdpbGwgaW52b2tlCiAgKiBfYnRfcGFyYWxsZWxfcmVsZWFzZSBiZWZvcmUgcmV0dXJuaW5nLgpA QCAtMTU2Myw2ICsxNTQ4LDcgQEAgc3RhdGljIGJvb2wKIF9idF9yZWFkcGFnZShJbmRleFNjYW5E ZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtLAogCQkJIGJv b2wgZmlyc3RQYWdlKQogeworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247CiAJ QlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhZ2UJCXBh Z2U7CiAJQlRQYWdlT3BhcXVlIG9wYXF1ZTsKQEAgLTE1ODIsMTggKzE1NjgsNyBAQCBfYnRfcmVh ZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVy IG9mZm51bSwKIAlwYWdlID0gQnVmZmVyR2V0UGFnZShzby0+Y3VyclBvcy5idWYpOwogCW9wYXF1 ZSA9IEJUUGFnZUdldE9wYXF1ZShwYWdlKTsKIAotCS8qIGFsbG93IG5leHQgcGFnZSBiZSBwcm9j ZXNzZWQgYnkgcGFyYWxsZWwgd29ya2VyICovCi0JaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4pCi0J ewotCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQotCQkJcHN0YXRlLnByZXZfc2Nh bl9wYWdlID0gb3BhcXVlLT5idHBvX25leHQ7Ci0JCWVsc2UKLQkJCXBzdGF0ZS5wcmV2X3NjYW5f cGFnZSA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKHNvLT5jdXJyUG9zLmJ1Zik7Ci0KLQkJX2J0X3Bh cmFsbGVsX3JlbGVhc2Uoc2NhbiwgcHN0YXRlLnByZXZfc2Nhbl9wYWdlKTsKLQl9Ci0KLQlpbmRu YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0ZXMoc2Nhbi0+aW5kZXhSZWxh dGlvbik7CisJaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHJl bCk7CiAJYXJyYXlLZXlzID0gc28tPm51bUFycmF5S2V5cyAhPSAwOwogCW1pbm9mZiA9IFBfRklS U1REQVRBS0VZKG9wYXF1ZSk7CiAJbWF4b2ZmID0gUGFnZUdldE1heE9mZnNldE51bWJlcihwYWdl KTsKQEAgLTE2MTUsOCArMTU5MCwxMiBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKIAkvKgogCSAqIFdlIG5v dGUgdGhlIGJ1ZmZlcidzIGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZWxlYXNlIHRoZSBw aW4gbGF0ZXIuCiAJICogVGhpcyBhbGxvd3MgdXMgdG8gcmUtcmVhZCB0aGUgYnVmZmVyIGlmIGl0 IGlzIG5lZWRlZCBhZ2FpbiBmb3IgaGludGluZy4KKwkgKiBBbHNvIHNhdmUgdGhlIHBhZ2UncyBz aWJsaW5nIGxpbmtzOyB0aGlzIHRlbGxzIHVzIHdoZXJlIHRvIHN0ZXAKKwkgKiByaWdodC9sZWZ0 IHRvIGFmdGVyIHdlJ3JlIGRvbmUgcmVhZGluZyBpdGVtcyBmcm9tIHRoaXMgcGFnZS4KIAkgKi8K IAlzby0+Y3VyclBvcy5jdXJyUGFnZSA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKHNvLT5jdXJyUG9z LmJ1Zik7CisJc28tPmN1cnJQb3MucHJldlBhZ2UgPSBvcGFxdWUtPmJ0cG9fcHJldjsKKwlzby0+ Y3VyclBvcy5uZXh0UGFnZSA9IG9wYXF1ZS0+YnRwb19uZXh0OwogCiAJLyoKIAkgKiBXZSBzYXZl IHRoZSBMU04gb2YgdGhlIHBhZ2UgYXMgd2UgcmVhZCBpdCwgc28gdGhhdCB3ZSBrbm93IHdoZXRo ZXIgaXQKQEAgLTE2MjUsMTMgKzE2MDQsNiBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKIAkgKi8KIAlzby0+ Y3VyclBvcy5sc24gPSBCdWZmZXJHZXRMU05BdG9taWMoc28tPmN1cnJQb3MuYnVmKTsKIAotCS8q Ci0JICogd2UgbXVzdCBzYXZlIHRoZSBwYWdlJ3MgcmlnaHQtbGluayB3aGlsZSBzY2FubmluZyBp dDsgdGhpcyB0ZWxscyB1cwotCSAqIHdoZXJlIHRvIHN0ZXAgcmlnaHQgdG8gYWZ0ZXIgd2UncmUg ZG9uZSB3aXRoIHRoZXNlIGl0ZW1zLiAgVGhlcmUgaXMgbm8KLQkgKiBjb3JyZXNwb25kaW5nIG5l ZWQgZm9yIHRoZSBsZWZ0LWxpbmssIHNpbmNlIHNwbGl0cyBhbHdheXMgZ28gcmlnaHQuCi0JICov Ci0Jc28tPmN1cnJQb3MubmV4dFBhZ2UgPSBvcGFxdWUtPmJ0cG9fbmV4dDsKLQogCS8qIGluaXRp YWxpemUgdHVwbGUgd29ya3NwYWNlIHRvIGVtcHR5ICovCiAJc28tPmN1cnJQb3MubmV4dFR1cGxl T2Zmc2V0ID0gMDsKIApAQCAtMTY0MCw2ICsxNjEyLDIwIEBAIF9idF9yZWFkcGFnZShJbmRleFNj YW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtLAogCSAq IGdvb2QuCiAJICovCiAJQXNzZXJ0KEJUU2NhblBvc0lzUGlubmVkKHNvLT5jdXJyUG9zKSk7CisJ QXNzZXJ0KCFQX0lHTk9SRShvcGFxdWUpKTsKKworCS8qIGFsbG93IG5leHQgcGFnZSB0byBiZSBw cm9jZXNzZWQgYnkgcGFyYWxsZWwgd29ya2VyICovCisJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4p CisJeworCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJX2J0X3BhcmFsbGVs X3JlbGVhc2Uoc2Nhbiwgc28tPmN1cnJQb3MubmV4dFBhZ2UsCisJCQkJCQkJCSBzby0+Y3VyclBv cy5jdXJyUGFnZSk7CisJCWVsc2UKKwkJCV9idF9wYXJhbGxlbF9yZWxlYXNlKHNjYW4sIHNvLT5j dXJyUG9zLnByZXZQYWdlLAorCQkJCQkJCQkgc28tPmN1cnJQb3MuY3VyclBhZ2UpOworCX0KKwor CVByZWRpY2F0ZUxvY2tQYWdlKHJlbCwgc28tPmN1cnJQb3MuY3VyclBhZ2UsIHNjYW4tPnhzX3Nu YXBzaG90KTsKIAogCS8qCiAJICogUHJlY2hlY2tpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb250aW51 ZXNjYW4gZmxhZyBmb3IgdGhlIGxhc3QgaXRlbSBvbiB0aGUKQEAgLTE4MDQsNyArMTc5MCw3IEBA IF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZz ZXROdW1iZXIgb2ZmbnVtLAogCQkJSW5kZXhUdXBsZQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VH ZXRJdGVtKHBhZ2UsIGlpZCk7CiAJCQlpbnQJCQl0cnVuY2F0dDsKIAotCQkJdHJ1bmNhdHQgPSBC VHJlZVR1cGxlR2V0TkF0dHMoaXR1cCwgc2Nhbi0+aW5kZXhSZWxhdGlvbik7CisJCQl0cnVuY2F0 dCA9IEJUcmVlVHVwbGVHZXROQXR0cyhpdHVwLCByZWwpOwogCQkJcHN0YXRlLnByZWNoZWNrZWQg PSBmYWxzZTsJLyogcHJlY2hlY2sgZGlkbid0IGNvdmVyIEhJS0VZICovCiAJCQlfYnRfY2hlY2tr ZXlzKHNjYW4sICZwc3RhdGUsIGFycmF5S2V5cywgaXR1cCwgdHJ1bmNhdHQpOwogCQl9CkBAIC0x OTM0LDcgKzE5MjAsNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGly ZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKIAkJICogV2UgZG9uJ3QgbmVlZCB0byB2 aXNpdCBwYWdlIHRvIHRoZSBsZWZ0IHdoZW4gbm8gbW9yZSBtYXRjaGVzIHdpbGwKIAkJICogYmUg Zm91bmQgdGhlcmUKIAkJICovCi0JCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbiB8fCBQX0xFRlRN T1NUKG9wYXF1ZSkpCisJCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXNvLT5jdXJyUG9z Lm1vcmVMZWZ0ID0gZmFsc2U7CiAKIAkJQXNzZXJ0KGl0ZW1JbmRleCA+PSAwKTsKQEAgLTIwMzUs MjAgKzIwMjEsMjEgQEAgX2J0X3NhdmVwb3N0aW5naXRlbShCVFNjYW5PcGFxdWUgc28sIGludCBp dGVtSW5kZXgsIE9mZnNldE51bWJlciBvZmZudW0sCiAvKgogICoJX2J0X3N0ZXBwYWdlKCkgLS0g U3RlcCB0byBuZXh0IHBhZ2UgY29udGFpbmluZyB2YWxpZCBkYXRhIGZvciBzY2FuCiAgKgotICog T24gZW50cnksIGlmIHNvLT5jdXJyUG9zLmJ1ZiBpcyB2YWxpZCB0aGUgYnVmZmVyIGlzIHBpbm5l ZCBidXQgbm90IGxvY2tlZDsKLSAqIGlmIHBpbm5lZCwgd2UnbGwgZHJvcCB0aGUgcGluIGJlZm9y ZSBtb3ZpbmcgdG8gbmV4dCBwYWdlLiAgVGhlIGJ1ZmZlciBpcwotICogbm90IGxvY2tlZCBvbiBl bnRyeS4KKyAqIE9uIGVudHJ5LCBpZiBzby0+Y3VyclBvcy5idWYgaXMgdmFsaWQgdGhlIGJ1ZmZl ciBpcyBwaW5uZWQgYnV0IG5vdCBsb2NrZWQuCisgKiBUaGlzIGlzIGEgd3JhcHBlciBvbiBfYnRf cmVhZG5leHRwYWdlIHRoYXQgcGVyZm9ybXMgZmluYWwgc3RlcHMgZm9yIHRoZQorICogY3VycmVu dCBwYWdlIChpbmNsdWRpbmcgZHJvcHBpbmcgaXRzIHBpbikuICBJdCBzZXRzIHVwIHRoZSBfYnRf cmVhZG5leHRwYWdlCisgKiBjYWxsIHVzaW5nIGVpdGhlciBsb2NhbCBzdGF0ZSBzYXZlZCBieSB0 aGUgbGFzdCBfYnRfcmVhZHBhZ2UgY2FsbCwgb3IgdXNpbmcKKyAqIHNoYXJlZCBwYXJhbGxlbCBz Y2FuIHN0YXRlIChieSBzZWl6aW5nIHRoZSBwYXJhbGxlbCBzY2FuKS4KICAqCi0gKiBGb3Igc3Vj Y2VzcyBvbiBhIHNjYW4gdXNpbmcgYSBub24tTVZDQyBzbmFwc2hvdCB3ZSBob2xkIGEgcGluLCBi dXQgbm90IGEKLSAqIHJlYWQgbG9jaywgb24gdGhhdCBwYWdlLiAgSWYgd2UgZG8gbm90IGhvbGQg dGhlIHBpbiwgd2Ugc2V0IHNvLT5jdXJyUG9zLmJ1ZgotICogdG8gSW52YWxpZEJ1ZmZlci4gIFdl IHJldHVybiB0cnVlIHRvIGluZGljYXRlIHN1Y2Nlc3MuCisgKiBQYXJhbGxlbCBzY2FuIGNhbGxl cnMgdGhhdCBoYXZlIGFscmVhZHkgc2VpemVkIHRoZSBzY2FuIHNob3VsZCBkaXJlY3RseQorICog Y2FsbCBfYnRfcmVhZG5leHRwYWdlLCByYXRoZXIgdGhhbiBjYWxsaW5nIGhlcmUuCiAgKi8KIHN0 YXRpYyBib29sCiBfYnRfc3RlcHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9u IGRpcikKIHsKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7 Ci0JQmxvY2tOdW1iZXIgYmxrbm8gPSBJbnZhbGlkQmxvY2tOdW1iZXI7Ci0JYm9vbAkJc3RhdHVz OworCUJsb2NrTnVtYmVyIGJsa25vLAorCQkJCWxhc3RjdXJyYmxrbm87CiAKIAlBc3NlcnQoQlRT Y2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOwogCkBAIC0yMDkwLDcgKzIwNzcsNyBAQCBfYnRf c3RlcHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkJICogSW4g ZWZmZWN0LCBidHJlc3Rwb3MgbGVhdmVzIGFkdmFuY2luZyB0aGUgYXJyYXlzIHVwIHRvIHRoZSBm aXJzdAogCQkgKiBfYnRfcmVhZHBhZ2UgY2FsbCAodGhhdCB0YWtlcyBwbGFjZSBhZnRlciBpdCBo YXMgcmVzdG9yZWQgbWFya1BvcykuCiAJCSAqLwotCQlBc3NlcnQoc28tPm1hcmtQb3MuZGlyID09 IGRpcik7CisJCUFzc2VydChzby0+bWFya0RpciA9PSBkaXIpOwogCQlpZiAoc28tPm5lZWRQcmlt U2NhbikKIAkJewogCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKQEAgLTIwOTgs OTMgKzIwODUsMTkzIEBAIF9idF9zdGVwcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKQogCQkJZWxzZQogCQkJCXNvLT5tYXJrUG9zLm1vcmVMZWZ0ID0gdHJ1ZTsKIAkJ fQorCisJCS8qIG1hcmsvcmVzdG9yZSBub3Qgc3VwcG9ydGVkIGJ5IHBhcmFsbGVsIHNjYW5zICov CisJCUFzc2VydCghc2Nhbi0+cGFyYWxsZWxfc2Nhbik7CiAJfQogCi0JaWYgKFNjYW5EaXJlY3Rp b25Jc0ZvcndhcmQoZGlyKSkKKwkvKiByZWxlYXNlIHRoZSBwcmV2aW91c2x5IHBpbm5lZCBsZWFm IHBhZ2UgYnVmZmVyLCBpZiBhbnkgKi8KKwlCVFNjYW5Qb3NVbnBpbklmUGlubmVkKHNvLT5jdXJy UG9zKTsKKworCS8qIFdhbGsgdG8gdGhlIG5leHQgcGFnZSB3aXRoIGRhdGEgKi8KKwlpZiAoIXNj YW4tPnBhcmFsbGVsX3NjYW4pCiAJewotCQkvKiBXYWxrIHJpZ2h0IHRvIHRoZSBuZXh0IHBhZ2Ug d2l0aCBkYXRhICovCi0JCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwpCi0JCXsKLQkJ CS8qCi0JCQkgKiBTZWl6ZSB0aGUgc2NhbiB0byBnZXQgdGhlIG5leHQgYmxvY2sgbnVtYmVyOyBp ZiB0aGUgc2NhbiBoYXMKLQkJCSAqIGVuZGVkIGFscmVhZHksIGJhaWwgb3V0LgotCQkJICovCi0J CQlzdGF0dXMgPSBfYnRfcGFyYWxsZWxfc2VpemUoc2NhbiwgJmJsa25vLCBmYWxzZSk7Ci0JCQlp ZiAoIXN0YXR1cykKLQkJCXsKLQkJCQkvKiByZWxlYXNlIHRoZSBwcmV2aW91cyBidWZmZXIsIGlm IHBpbm5lZCAqLwotCQkJCUJUU2NhblBvc1VucGluSWZQaW5uZWQoc28tPmN1cnJQb3MpOwotCQkJ CUJUU2NhblBvc0ludmFsaWRhdGUoc28tPmN1cnJQb3MpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJ CX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qIE5vdCBwYXJhbGxlbCwgc28gdXNlIHRoZSBwcmV2 aW91c2x5LXNhdmVkIG5leHRQYWdlIGxpbmsuICovCisJCS8qIE5vdCBwYXJhbGxlbCwgc28gdXNl IG5leHRQYWdlL3ByZXZQYWdlIGZyb20gbG9jYWwgc2NhbiBzdGF0ZSAqLworCQlpZiAoU2NhbkRp cmVjdGlvbklzRm9yd2FyZChkaXIpKQogCQkJYmxrbm8gPSBzby0+Y3VyclBvcy5uZXh0UGFnZTsK LQkJfQotCi0JCS8qIFJlbWVtYmVyIHdlIGxlZnQgYSBwYWdlIHdpdGggZGF0YSAqLwotCQlzby0+ Y3VyclBvcy5tb3JlTGVmdCA9IHRydWU7Ci0KLQkJLyogcmVsZWFzZSB0aGUgcHJldmlvdXMgYnVm ZmVyLCBpZiBwaW5uZWQgKi8KLQkJQlRTY2FuUG9zVW5waW5JZlBpbm5lZChzby0+Y3VyclBvcyk7 CisJCWVsc2UKKwkJCWJsa25vID0gc28tPmN1cnJQb3MucHJldlBhZ2U7CisJCWxhc3RjdXJyYmxr bm8gPSBzby0+Y3VyclBvcy5jdXJyUGFnZTsKIAl9CiAJZWxzZQogCXsKLQkJLyogUmVtZW1iZXIg d2UgbGVmdCBhIHBhZ2Ugd2l0aCBkYXRhICovCi0JCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IHRy dWU7Ci0KLQkJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKKwkJLyoKKwkJICogU2Vp emUgdGhlIHNjYW4gdG8gZ2V0IHRoZSBuZXh0UGFnZSBhbmQgY3VyclBhZ2UgZnJvbSBzaGFyZWQK KwkJICogcGFyYWxsZWwgc3RhdGUKKwkJICovCisJCWlmICghX2J0X3BhcmFsbGVsX3NlaXplKHNj YW4sICZibGtubywgJmxhc3RjdXJyYmxrbm8sIGZhbHNlKSkKIAkJewotCQkJLyoKLQkJCSAqIFNl aXplIHRoZSBzY2FuIHRvIGdldCB0aGUgY3VycmVudCBibG9jayBudW1iZXI7IGlmIHRoZSBzY2Fu IGhhcwotCQkJICogZW5kZWQgYWxyZWFkeSwgYmFpbCBvdXQuCi0JCQkgKi8KLQkJCXN0YXR1cyA9 IF9idF9wYXJhbGxlbF9zZWl6ZShzY2FuLCAmYmxrbm8sIGZhbHNlKTsKLQkJCUJUU2NhblBvc1Vu cGluSWZQaW5uZWQoc28tPmN1cnJQb3MpOwotCQkJaWYgKCFzdGF0dXMpCi0JCQl7Ci0JCQkJQlRT Y2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQot CQl9Ci0JCWVsc2UKLQkJewotCQkJLyogTm90IHBhcmFsbGVsLCBzbyBqdXN0IHVzZSBvdXIgb3du IG5vdGlvbiBvZiB0aGUgY3VycmVudCBwYWdlICovCi0JCQlibGtubyA9IHNvLT5jdXJyUG9zLmN1 cnJQYWdlOworCQkJLyogZG9uJ3QgY2FsbCBfYnRfcGFyYWxsZWxfZG9uZSAqLworCQkJcmV0dXJu IGZhbHNlOwogCQl9CiAJfQogCi0JaWYgKCFfYnRfcmVhZG5leHRwYWdlKHNjYW4sIGJsa25vLCBk aXIpKQotCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgKiBfYnRfcmVhZG5leHRwYWdlIGp1c3Qgd29y a3Mgb2ZmIG9mIGJsa25vL2xhc3RjdXJyYmxrbm8gbm93CisJICoKKwkgKiAoSXQgZG9lcyBzdGls bCBleHBlY3Qgc28tPmN1cnJQb3MubW9yZUxlZnQvc28tPmN1cnJQb3MubW9yZUxlZnQgdG8KKwkg KiByZW1haW4gaG93ZXZlciB0aGUgbGFzdCBfYnRfcmVhZHBhZ2UgY2FsbCBmb3IgbGFzdGN1cnJi bGtubyBzZXQgdGhlbS4pCisJICovCisJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7 CiAKLQkvKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtIHRvIHJldHVybiBhcyBzY2FuJ3MgbmV4 dCBpdGVtICovCi0JX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluKHNjYW4sICZzby0+Y3VyclBv cyk7CisJaWYgKCFfYnRfcmVhZG5leHRwYWdlKHNjYW4sIGJsa25vLCBsYXN0Y3VycmJsa25vLCBk aXIpKQorCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoKLSAqCV9idF9y ZWFkbmV4dHBhZ2UoKSAtLSBSZWFkIG5leHQgcGFnZSBjb250YWluaW5nIHZhbGlkIGRhdGEgZm9y IHNjYW4KKyAqCV9idF9yZWFkZmlyc3RwYWdlKCkgLS0gUmVhZCBmaXJzdCBwYWdlIGNvbnRhaW5p bmcgdmFsaWQgZGF0YSBmb3IgX2J0X2ZpcnN0CisgKgorICogX2J0X2ZpcnN0IGNhbGxlciBwYXNz ZXMgdXMgYW4gb2ZmbnVtIHJldHVybmVkIGJ5IF9idF9iaW5zcmNoLCB3aGljaCBtaWdodAorICog YmUgYW4gb3V0IG9mIGJvdW5kcyBvZmZudW0gc3VjaCBhcyAibWF4b2ZmICsgMSIgaW4gY2VydGFp biBjb3JuZXIgY2FzZXMuCisgKiBfYnRfY2hlY2trZXlzIHdpbGwgc3RvcCB0aGUgc2NhbiBhcyBz b29uIGFzIGFuIGVxdWFsaXR5IHF1YWwgZmFpbHMgKHdoZW4KKyAqIGl0cyBzY2FuIGtleSB3YXMg bWFya2VkIHJlcXVpcmVkKSwgc28gX2J0X2ZpcnN0IF9tdXN0XyBwYXNzIHVzIGFuIG9mZm51bQor ICogZXhhY3RseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHdoZXJlIGVxdWFsIHR1cGxlcyBhcmUgdG8g YmUgZm91bmQuICBXaGVuIHdlJ3JlCisgKiBwYXNzZWQgYW4gb2ZmbnVtIHBhc3QgdGhlIGVuZCBv ZiB0aGUgcGFnZSwgd2UgbWlnaHQgc3RpbGwgbWFuYWdlIHRvIHN0b3AKKyAqIHRoZSBzY2FuIG9u IHRoaXMgcGFnZSBieSBjYWxsaW5nIF9idF9jaGVja2tleXMgYWdhaW5zdCB0aGUgaGlnaCBrZXku ICBTZWUKKyAqIF9idF9yZWFkcGFnZSBmb3IgZnVsbCBkZXRhaWxzLgorICoKKyAqIE9uIGVudHJ5 LCBzby0+Y3VyclBvcy5idWYgbXVzdCBiZSBwaW5uZWQgYW5kIGxvY2tlZC4gIEFsc28sIHBhcmFs bGVsIHNjYW4KKyAqIGNhbGxlcnMgbXVzdCBoYXZlIHNlaXplZCB0aGUgc2NhbiBiZWZvcmUgY2Fs bGluZyBoZXJlLgogICoKICAqIE9uIHN1Y2Nlc3MgZXhpdCwgc28tPmN1cnJQb3MgaXMgdXBkYXRl ZCB0byBjb250YWluIGRhdGEgZnJvbSB0aGUgbmV4dAotICogaW50ZXJlc3RpbmcgcGFnZSwgYW5k IHdlIHJldHVybiB0cnVlLiAgQ2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgbG9jayAoYW5kCi0gKiBt YXliZSB0aGUgcGluKSBvbiB0aGUgYnVmZmVyIG9uIHN1Y2Nlc3MgZXhpdC4KKyAqIGludGVyZXN0 aW5nIHBhZ2UsIGFuZCB3ZSByZXR1cm4gdHJ1ZS4gIFdlIGhvbGQgYSBwaW4gb24gdGhlIGJ1ZmZl ciBvbgorICogc3VjY2VzcyBleGl0LCBleGNlcHQgZm9yIHNjYW5zIHRoYXQgX2J0X2Ryb3BfbG9j a19hbmRfbWF5YmVfcGluIGluZGljYXRlcworICogY2FuIHNhZmVseSBoYXZlIHRoZWlyIHBpbiBk cm9wcGVkIHRvIGF2b2lkIGJsb2NraW5nIHByb2dyZXNzIGJ5IFZBQ1VVTS4KICAqCi0gKiBJZiB0 aGVyZSBhcmUgbm8gbW9yZSBtYXRjaGluZyByZWNvcmRzIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24s IHdlIGRyb3AgYWxsCi0gKiBsb2NrcyBhbmQgcGlucywgc2V0IHNvLT5jdXJyUG9zLmJ1ZiB0byBJ bnZhbGlkQnVmZmVyLCBhbmQgcmV0dXJuIGZhbHNlLgorICogSWYgdGhlcmUgYXJlIG5vIG1vcmUg bWF0Y2hpbmcgcmVjb3JkcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCB3ZSBzZXQKKyAqIHNvLT5j dXJyUG9zLmJ1ZiB0byBJbnZhbGlkQnVmZmVyLCBhbmQgcmV0dXJuIGZhbHNlLiAgTm90ZSB0aGF0 IHRoaXMgY291bGQKKyAqIGp1c3Qgc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcHJpbWl0 aXZlIGluZGV4IHNjYW4uCisgKgorICogV2UgYWx3YXlzIHJlbGVhc2UgdGhlIHNjYW4gZm9yIGEg cGFyYWxsZWwgc2NhbiBjYWxsZXIsIHJlZ2FyZGxlc3Mgb2YKKyAqIHN1Y2Nlc3Mgb3IgZmFpbHVy ZTsgd2UgZG8gdGhpcyBieSBjYWxsaW5nIF9idF9wYXJhbGxlbF9yZWxlYXNlIGF0IHRoZQorICog ZWFybGllc3Qgb3Bwb3J0dW5pdHkuCiAgKi8KIHN0YXRpYyBib29sCi1fYnRfcmVhZG5leHRwYWdl KEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgYmxrbm8sIFNjYW5EaXJlY3Rpb24gZGly KQorX2J0X3JlYWRmaXJzdHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBPZmZzZXROdW1iZXIgb2Zm bnVtLCBTY2FuRGlyZWN0aW9uIGRpcikKIHsKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3Bh cXVlKSBzY2FuLT5vcGFxdWU7Ci0JUmVsYXRpb24JcmVsOworCisJQXNzZXJ0KEJ1ZmZlcklzVmFs aWQoc28tPmN1cnJQb3MuYnVmKSk7CisKKwkvKiBJbml0aWFsaXplIGN1cnJQb3MgZm9yIHNvLT5j dXJyUG9zLmJ1ZiAqLworCWlmIChzby0+bmVlZFByaW1TY2FuKQorCXsKKwkJQXNzZXJ0KHNvLT5u dW1BcnJheUtleXMpOworCisJCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gdHJ1ZTsKKwkJc28tPmN1 cnJQb3MubW9yZVJpZ2h0ID0gdHJ1ZTsKKwkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCX0K KwllbHNlIGlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJeworCQlzby0+Y3VyclBv cy5tb3JlTGVmdCA9IGZhbHNlOworCQlzby0+Y3VyclBvcy5tb3JlUmlnaHQgPSB0cnVlOworCX0K KwllbHNlCisJeworCQlzby0+Y3VyclBvcy5tb3JlTGVmdCA9IHRydWU7CisJCXNvLT5jdXJyUG9z Lm1vcmVSaWdodCA9IGZhbHNlOworCX0KKwlzby0+bWFya0RpciA9IGRpcjsKKwlzby0+bnVtS2ls bGVkID0gMDsJCQkvKiBqdXN0IHBhcmFub2lhICovCisJc28tPm1hcmtJdGVtSW5kZXggPSAtMTsJ CS8qIGRpdHRvICovCisKKwlpZiAoX2J0X3JlYWRwYWdlKHNjYW4sIGRpciwgb2ZmbnVtLCB0cnVl KSkKKwl7CisJCS8qCisJCSAqIF9idF9yZWFkcGFnZSBzdWNjZWVkZWQuICBEcm9wIHRoZSBsb2Nr IChhbmQgbWF5YmUgdGhlIHBpbikgb24KKwkJICogc28tPmN1cnJQb3MuYnVmIGluIHByZXBhcmF0 aW9uIGZvciBidGdldHR1cGxlIHJldHVybmluZyB0dXBsZXMuCisJCSAqLworCQlBc3NlcnQoQlRT Y2FuUG9zSXNQaW5uZWQoc28tPmN1cnJQb3MpKTsKKwkJX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVf cGluKHNjYW4sICZzby0+Y3VyclBvcyk7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qIFRoZXJl J3Mgbm8gYWN0dWFsbHktbWF0Y2hpbmcgZGF0YSBvbiB0aGUgcGFnZSBpbiBzby0+Y3VyclBvcy5i dWYgKi8KKwlfYnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIHNvLT5jdXJyUG9zLmJ1 Zik7CisKKwkvKiBDYWxsIF9idF9yZWFkbmV4dHBhZ2UgdGhyb3VnaCBpdHMgX2J0X3N0ZXBwYWdl IHdyYXBwZXIgZnVuY3Rpb24gKi8KKwlpZiAoIV9idF9zdGVwcGFnZShzY2FuLCBkaXIpKQorCQly ZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIF9idF9yZWFkcGFnZSBmb3IgYSBsYXRlciBwYWdlIHN1 Y2NlZWRlZC4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsCisJICogX2J0X2Ryb3BfbG9ja19hbmRf bWF5YmVfcGluIGhlcmUsIHRob3VnaDsgX2J0X3JlYWRuZXh0cGFnZSBhbHJlYWR5IGRpZAorCSAq IHRoYXQgZm9yIHVzLgorCSAqLworCXJldHVybiB0cnVlOworfQorCisvKgorICoJX2J0X3JlYWRu ZXh0cGFnZSgpIC0tIFJlYWQgbmV4dCBwYWdlIGNvbnRhaW5pbmcgdmFsaWQgZGF0YSBmb3IgX2J0 X25leHQKKyAqCisgKiBDYWxsZXIncyBibGtubyBpcyB0aGUgbmV4dCBpbnRlcmVzdGluZyBwYWdl J3MgbGluaywgdGFrZW4gZnJvbSBlaXRoZXIgdGhlCisgKiBwcmV2aW91c2x5LXNhdmVkIHJpZ2h0 IGxpbmsgb3IgbGVmdCBsaW5rLiAgbGFzdGN1cnJibGtubyBpcyB0aGUgcGFnZSB0aGF0CisgKiB3 YXMgY3VycmVudCBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGJsa25vIGxpbmsgd2FzIHNhdmVkLCB3 aGljaCB3ZSB1c2UgdG8KKyAqIHJlYXNvbiBhYm91dCBjb25jdXJyZW50IHBhZ2Ugc3BsaXRzL3Bh Z2UgZGVsZXRpb25zIGR1cmluZyBiYWNrd2FyZHMgc2NhbnMKKyAqIChfYnRfcGFyYWxsZWxfc2Vp emUgYWxzbyByZXF1aXJlcyBpdCwgcmVnYXJkbGVzcyBvZiBzY2FuIGRpcmVjdGlvbikuCisgKgor ICogV2Ugd29yayBvZmYgb2YgYmxrbm8gYW5kIGxhc3RjdXJyYmxrbm8uICBPbiBlbnRyeSwgc28t PmN1cnJQb3MgbXVzdCBiZQorICogaW52YWxpZDsgY2FsbGVyIHNob3VsZG4ndCBob2xkIGFueSBs b2NrcyBvciBwaW5zIG9uIGFueSBwYWdlLiAgUGFyYWxsZWwKKyAqIHNjYW4gY2FsbGVycyBtdXN0 IGhhdmUgc2VpemVkIHRoZSBzY2FuIGJlZm9yZSBjYWxsaW5nIGhlcmUgKGFuZCBtdXN0IHBhc3MK KyAqIHVzIHRoZSBibGtubyArIGxhc3RjdXJyYmxrbm8gdGhleSBvYnRhaW5lZCBhcyBwYXJ0IG9m IHNlaXppbmcgdGhlIHNjYW4pLgorICogSG93ZXZlciwgd2Ugc3RpbGwgZXhwZWN0IHNvLT5jdXJy UG9zLm1vcmVMZWZ0L3NvLT5jdXJyUG9zLm1vcmVMZWZ0IHRvCisgKiByZW1haW4gaG93ZXZlciB0 aGUgbGFzdCBfYnRfcmVhZHBhZ2UgY2FsbCAoZm9yIGxhc3RjdXJyYmxrbm8pIHNldCB0aGVtLgor ICoKKyAqIE9uIHN1Y2Nlc3MgZXhpdCwgc28tPmN1cnJQb3MgaXMgdXBkYXRlZCB0byBjb250YWlu IGRhdGEgZnJvbSB0aGUgbmV4dAorICogaW50ZXJlc3RpbmcgcGFnZSwgYW5kIHdlIHJldHVybiB0 cnVlLiAgV2UgaG9sZCBhIHBpbiBvbiB0aGUgYnVmZmVyIG9uCisgKiBzdWNjZXNzIGV4aXQsIGV4 Y2VwdCBmb3Igc2NhbnMgdGhhdCBfYnRfZHJvcF9sb2NrX2FuZF9tYXliZV9waW4gaW5kaWNhdGVz CisgKiBjYW4gc2FmZWx5IGhhdmUgdGhlaXIgcGluIGRyb3BwZWQgdG8gYXZvaWQgYmxvY2tpbmcg cHJvZ3Jlc3MgYnkgVkFDVVVNLgorICoKKyAqIElmIHRoZXJlIGFyZSBubyBtb3JlIG1hdGNoaW5n IHJlY29yZHMgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgd2UgbGVhdmUKKyAqIHNvLT5jdXJyUG9z LmJ1ZiBzZXQgdG8gSW52YWxpZEJ1ZmZlciwgYW5kIHJldHVybiBmYWxzZS4gIE5vIGxvY2tzIG9y IHBpbnMKKyAqIGFyZSByZXRhaW5lZC4gIE5vdGUgdGhhdCB0aGlzIGNvdWxkIGp1c3Qgc2lnbmFs IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKKyAqIHByaW1pdGl2ZSBpbmRleCBzY2FuIChpbiB3aGlj aCBjYXNlIGFub3RoZXIgY2FsbCB0byBfYnRfZmlyc3Qgd2lsbCBiZQorICogcmVxdWlyZWQgdG8g Y29udGludWUgdGhlIHNjYW4gaW4gdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24pLgorICoKKyAq IE9uIGV4aXQsIHdlJ2xsIGFsd2F5cyBoYXZlIHJlbGVhc2VkIHRoZSBzZWl6ZWQgc2NhbiBmb3Ig cGFyYWxsZWwgc2NhbgorICogY2FsbGVycyAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHdlcmUg c3VjY2Vzc2Z1bCBvciBub3QpLgorICovCitzdGF0aWMgYm9vbAorX2J0X3JlYWRuZXh0cGFnZShJ bmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyIGJsa25vLAorCQkJCSBCbG9ja051bWJlciBs YXN0Y3VycmJsa25vLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlSZWxhdGlvbglyZWwgPSBzY2Fu LT5pbmRleFJlbGF0aW9uOworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4t Pm9wYXF1ZTsKIAlQYWdlCQlwYWdlOwogCUJUUGFnZU9wYXF1ZSBvcGFxdWU7Ci0JYm9vbAkJc3Rh dHVzOwogCi0JcmVsID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlBc3NlcnQoIUJUU2NhblBvc0lz VmFsaWQoc28tPmN1cnJQb3MpKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBjdXJyUG9zIGZvciBi bGtuby4KKwkgKgorCSAqIFdlIGtub3cgdGhhdCB0aGUgc2NhbiBqdXN0IHJlYWQgYSBwYWdlIChs YXN0Y3VycmJsa25vKSwgc28gcmVtZW1iZXIKKwkgKiB0aGF0IHdlIGxlZnQgYSBwbGFjZSB3aXRo IHBvdGVudGlhbGx5IG1hdGNoaW5nIHR1cGxlcyB0byBibGtubydzIGxlZnQKKwkgKiAob3IgdG8g Ymxrbm8ncyByaWdodCwgd2hlbiB3ZSdyZSBzY2FubmluZyBiYWNrd2FyZHMpLgorCSAqCisJICog RG9uJ3QgcmVzZXQgbW9yZVJpZ2h0IChvciBtb3JlTGVmdCBpZiB0aGlzIGlzIGEgYmFja3dhcmRz IHNjYW4pIGhlcmUuCisJICogSWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHRoZSByaWdodCBv ZiBsYXN0Y3VycmJsa25vLCB0aGVuIHRoZXJlCisJICogY2VydGFpbmx5IGNhbm5vdCBiZSBhbnkg bW9yZSB0byB0aGUgcmlnaHQgb2YgaXRzIGJsa25vIHJpZ2h0IHNpYmxpbmcKKwkgKiAod2hlbiB3 ZSdyZSBzY2FubmluZyBiYWNrd2FyZHMgdGhlbiBtb3JlTGVmdCBzaW1pbGFybHkgYXBwbGllcyB0 byBib3RoCisJICogbGFzdGN1cnJibGtubyBhbmQgYmxrbm8pLgorCSAqLworCWlmIChTY2FuRGly ZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gdHJ1ZTsKKwll bHNlCisJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IHRydWU7CiAKIAlpZiAoU2NhbkRpcmVjdGlv bklzRm9yd2FyZChkaXIpKQogCXsKQEAgLTIxOTcsNyArMjI4NCw2IEBAIF9idF9yZWFkbmV4dHBh Z2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBibGtubywgU2NhbkRpcmVjdGlvbiBk aXIpCiAJCQlpZiAoYmxrbm8gPT0gUF9OT05FIHx8ICFzby0+Y3VyclBvcy5tb3JlUmlnaHQpCiAJ CQl7CiAJCQkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7Ci0JCQkJQlRTY2FuUG9zSW52YWxpZGF0 ZShzby0+Y3VyclBvcyk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJLyogY2hlY2sgZm9y IGludGVycnVwdHMgd2hpbGUgd2UncmUgbm90IGhvbGRpbmcgYW55IGJ1ZmZlciBsb2NrICovCkBA IC0yMjA5LDcgKzIyOTUsNiBAQCBfYnRfcmVhZG5leHRwYWdlKEluZGV4U2NhbkRlc2Mgc2Nhbiwg QmxvY2tOdW1iZXIgYmxrbm8sIFNjYW5EaXJlY3Rpb24gZGlyKQogCQkJLyogY2hlY2sgZm9yIGRl bGV0ZWQgcGFnZSAqLwogCQkJaWYgKCFQX0lHTk9SRShvcGFxdWUpKQogCQkJewotCQkJCVByZWRp Y2F0ZUxvY2tQYWdlKHJlbCwgYmxrbm8sIHNjYW4tPnhzX3NuYXBzaG90KTsKIAkJCQkvKiBzZWUg aWYgdGhlcmUgYXJlIGFueSBtYXRjaGVzIG9uIHRoaXMgcGFnZSAqLwogCQkJCS8qIG5vdGUgdGhh dCB0aGlzIHdpbGwgY2xlYXIgbW9yZVJpZ2h0IGlmIHdlIGNhbiBzdG9wICovCiAJCQkJaWYgKF9i dF9yZWFkcGFnZShzY2FuLCBkaXIsIFBfRklSU1REQVRBS0VZKG9wYXF1ZSksIGZhbHNlKSkKQEAg LTIyMTcsODYgKzIzMDIsNTQgQEAgX2J0X3JlYWRuZXh0cGFnZShJbmRleFNjYW5EZXNjIHNjYW4s IEJsb2NrTnVtYmVyIGJsa25vLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkJCX0KIAkJCWVsc2UgaWYg KHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKIAkJCXsKLQkJCQkvKiBhbGxvdyBuZXh0IHBh Z2UgYmUgcHJvY2Vzc2VkIGJ5IHBhcmFsbGVsIHdvcmtlciAqLwotCQkJCV9idF9wYXJhbGxlbF9y ZWxlYXNlKHNjYW4sIG9wYXF1ZS0+YnRwb19uZXh0KTsKKwkJCQkvKiBfYnRfcmVhZHBhZ2Ugbm90 IGNhbGxlZCwgc28gZG8gdGhpcyBmb3Igb3Vyc2VsdmVzICovCisJCQkJX2J0X3BhcmFsbGVsX3Jl bGVhc2Uoc2Nhbiwgb3BhcXVlLT5idHBvX25leHQsIGJsa25vKTsKIAkJCX0KIAotCQkJLyogbm9w ZSwga2VlcCBnb2luZyAqLwogCQkJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKIAkJ CXsKKwkJCQkvKiBubyBtYXRjaGluZyB0dXBsZXMsIHNvIHNlaXplIGEgcGFnZSB0byB0aGUgcmln aHQgKi8KIAkJCQlfYnRfcmVsYnVmKHJlbCwgc28tPmN1cnJQb3MuYnVmKTsKLQkJCQlzdGF0dXMg PSBfYnRfcGFyYWxsZWxfc2VpemUoc2NhbiwgJmJsa25vLCBmYWxzZSk7Ci0JCQkJaWYgKCFzdGF0 dXMpCisKKwkJCQlpZiAoIV9idF9wYXJhbGxlbF9zZWl6ZShzY2FuLCAmYmxrbm8sICZsYXN0Y3Vy cmJsa25vLCBmYWxzZSkpCiAJCQkJewotCQkJCQlCVFNjYW5Qb3NJbnZhbGlkYXRlKHNvLT5jdXJy UG9zKTsKKwkJCQkJLyogZG9uJ3QgY2FsbCBfYnRfcGFyYWxsZWxfZG9uZSAqLwogCQkJCQlyZXR1 cm4gZmFsc2U7CiAJCQkJfQogCQkJfQogCQkJZWxzZQogCQkJeworCQkJCS8qIG5vIG1hdGNoaW5n IHR1cGxlcywgc28gY29uc2lkZXIgZm9sbG93aW5nIHJpZ2h0IGxpbmsgKi8KKwkJCQlsYXN0Y3Vy cmJsa25vID0gYmxrbm87CiAJCQkJYmxrbm8gPSBvcGFxdWUtPmJ0cG9fbmV4dDsKIAkJCQlfYnRf cmVsYnVmKHJlbCwgc28tPmN1cnJQb3MuYnVmKTsKIAkJCX0KKworCQkJQlRTY2FuUG9zSW52YWxp ZGF0ZShzby0+Y3VyclBvcyk7CS8qIHdvcmtpbmcgb2ZmIG5ldyBibGtubyBub3cgKi8KIAkJfQog CX0KIAllbHNlCiAJewotCQkvKgotCQkgKiBTaG91bGQgb25seSBoYXBwZW4gaW4gcGFyYWxsZWwg Y2FzZXMsIHdoZW4gc29tZSBvdGhlciBiYWNrZW5kCi0JCSAqIGFkdmFuY2VkIHRoZSBzY2FuLgot CQkgKi8KLQkJaWYgKHNvLT5jdXJyUG9zLmN1cnJQYWdlICE9IGJsa25vKQotCQl7Ci0JCQlCVFNj YW5Qb3NVbnBpbklmUGlubmVkKHNvLT5jdXJyUG9zKTsKLQkJCXNvLT5jdXJyUG9zLmN1cnJQYWdl ID0gYmxrbm87Ci0JCX0KLQotCQkvKiBEb25lIGlmIHdlIGtub3cgdGhhdCB0aGUgbGVmdCBzaWJs aW5nIGxpbmsgaXNuJ3Qgb2YgaW50ZXJlc3QgKi8KLQkJaWYgKCFzby0+Y3VyclBvcy5tb3JlTGVm dCkKLQkJewotCQkJQlRTY2FuUG9zVW5waW5JZlBpbm5lZChzby0+Y3VyclBvcyk7Ci0JCQlfYnRf cGFyYWxsZWxfZG9uZShzY2FuKTsKLQkJCUJUU2NhblBvc0ludmFsaWRhdGUoc28tPmN1cnJQb3Mp OwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogV2FsayBsZWZ0IHRvIHRoZSBu ZXh0IHBhZ2Ugd2l0aCBkYXRhLiAgVGhpcyBpcyBtdWNoIG1vcmUgY29tcGxleAotCQkgKiB0aGFu IHRoZSB3YWxrLXJpZ2h0IGNhc2UgYmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUg cGFnZQotCQkgKiB0byBvdXIgbGVmdCBzcGxpdHMgd2hpbGUgd2UgYXJlIGluIGZsaWdodCB0byBp dCwgcGx1cyB0aGUKLQkJICogcG9zc2liaWxpdHkgdGhhdCB0aGUgcGFnZSB3ZSB3ZXJlIG9uIGdl dHMgZGVsZXRlZCBhZnRlciB3ZSBsZWF2ZQotCQkgKiBpdC4gIFNlZSBuYnRyZWUvUkVBRE1FIGZv ciBkZXRhaWxzLgotCQkgKgotCQkgKiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byByZWFycmFuZ2Ug dGhpcyBjb2RlIHRvIGhhdmUgbGVzcyBvdmVyaGVhZAotCQkgKiBpbiBwaW5uaW5nIGFuZCBsb2Nr aW5nLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlIGNhcHR1cmluZyB0aGUgbGVmdAotCQkgKiBzaWJs aW5nIGJsb2NrIG51bWJlciB3aGVuIHRoZSBwYWdlIGlzIGluaXRpYWxseSByZWFkLCBhbmQgdGhl bgotCQkgKiBvcHRpbWlzdGljYWxseSBzdGFydGluZyB0aGVyZSAocmF0aGVyIHRoYW4gcGlubmlu ZyB0aGUgcGFnZSB0d2ljZSkuCi0JCSAqIEl0IGlzIG5vdCBjbGVhciB0aGF0IHRoaXMgd291bGQg YmUgd29ydGggdGhlIGNvbXBsZXhpdHkuCi0JCSAqLwotCQlpZiAoQlRTY2FuUG9zSXNQaW5uZWQo c28tPmN1cnJQb3MpKQotCQkJX2J0X2xvY2tidWYocmVsLCBzby0+Y3VyclBvcy5idWYsIEJUX1JF QUQpOwotCQllbHNlCi0JCQlzby0+Y3VyclBvcy5idWYgPSBfYnRfZ2V0YnVmKHJlbCwgc28tPmN1 cnJQb3MuY3VyclBhZ2UsIEJUX1JFQUQpOwotCiAJCWZvciAoOzspCiAJCXsKLQkJCS8qIERvbmUg aWYgd2Uga25vdyB0aGF0IHRoZSBsZWZ0IHNpYmxpbmcgbGluayBpc24ndCBvZiBpbnRlcmVzdCAq LwotCQkJaWYgKCFzby0+Y3VyclBvcy5tb3JlTGVmdCkKKwkJCS8qCisJCQkgKiBpZiB3ZSdyZSBh dCBlbmQgb2Ygc2NhbiwgZ2l2ZSB1cCBhbmQgbWFyayBwYXJhbGxlbCBzY2FuIGFzCisJCQkgKiBk b25lLCBzbyB0aGF0IGFsbCB0aGUgd29ya2VycyBjYW4gZmluaXNoIHRoZWlyIHNjYW4KKwkJCSAq LworCQkJaWYgKGJsa25vID09IFBfTk9ORSB8fCAhc28tPmN1cnJQb3MubW9yZUxlZnQpCiAJCQl7 Ci0JCQkJX2J0X3JlbGJ1ZihyZWwsIHNvLT5jdXJyUG9zLmJ1Zik7CiAJCQkJX2J0X3BhcmFsbGVs X2RvbmUoc2Nhbik7Ci0JCQkJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7CiAJCQkJ cmV0dXJuIGZhbHNlOwogCQkJfQogCi0JCQkvKiBTdGVwIHRvIG5leHQgcGh5c2ljYWwgcGFnZSAq LwotCQkJc28tPmN1cnJQb3MuYnVmID0gX2J0X3dhbGtfbGVmdChyZWwsIHNvLT5jdXJyUG9zLmJ1 Zik7CisJCQkvKiBtb3ZlIGxlZnQgYXQgbGVhc3Qgb25lIHBhZ2UgKGNoZWNrcyBmb3IgaW50ZXJy dXB0cywgdG9vKSAqLworCQkJc28tPmN1cnJQb3MuYnVmID0gX2J0X2xvY2tfYW5kX3ZhbGlkYXRl X2xlZnQocmVsLCAmYmxrbm8sCisJCQkJCQkJCQkJCQkJCSBsYXN0Y3VycmJsa25vKTsKIAotCQkJ LyogaWYgd2UncmUgcGh5c2ljYWxseSBhdCBlbmQgb2YgaW5kZXgsIHJldHVybiBmYWlsdXJlICov CiAJCQlpZiAoc28tPmN1cnJQb3MuYnVmID09IEludmFsaWRCdWZmZXIpCiAJCQl7CisJCQkJLyog bXVzdCBoYXZlIGJlZW4gYSBjb25jdXJyZW50IGRlbGV0aW9uIG9mIGxlZnRtb3N0IHBhZ2UgKi8K IAkJCQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKLQkJCQlCVFNjYW5Qb3NJbnZhbGlkYXRlKHNv LT5jdXJyUG9zKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKQEAgLTIzMDksNyArMjM2Miw2 IEBAIF9idF9yZWFkbmV4dHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBibGtu bywgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCQlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUocGFnZSk7 CiAJCQlpZiAoIVBfSUdOT1JFKG9wYXF1ZSkpCiAJCQl7Ci0JCQkJUHJlZGljYXRlTG9ja1BhZ2Uo cmVsLCBCdWZmZXJHZXRCbG9ja051bWJlcihzby0+Y3VyclBvcy5idWYpLCBzY2FuLT54c19zbmFw c2hvdCk7CiAJCQkJLyogc2VlIGlmIHRoZXJlIGFyZSBhbnkgbWF0Y2hlcyBvbiB0aGlzIHBhZ2Ug Ki8KIAkJCQkvKiBub3RlIHRoYXQgdGhpcyB3aWxsIGNsZWFyIG1vcmVMZWZ0IGlmIHdlIGNhbiBz dG9wICovCiAJCQkJaWYgKF9idF9yZWFkcGFnZShzY2FuLCBkaXIsIFBhZ2VHZXRNYXhPZmZzZXRO dW1iZXIocGFnZSksIGZhbHNlKSkKQEAgLTIzMTcsMTAwICsyMzY5LDgwIEBAIF9idF9yZWFkbmV4 dHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBibGtubywgU2NhbkRpcmVjdGlv biBkaXIpCiAJCQl9CiAJCQllbHNlIGlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwpCiAJ CQl7Ci0JCQkJLyogYWxsb3cgbmV4dCBwYWdlIGJlIHByb2Nlc3NlZCBieSBwYXJhbGxlbCB3b3Jr ZXIgKi8KLQkJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBCdWZmZXJHZXRCbG9ja051bWJl cihzby0+Y3VyclBvcy5idWYpKTsKKwkJCQkvKiBfYnRfcmVhZHBhZ2Ugbm90IGNhbGxlZCwgc28g ZG8gdGhpcyBmb3Igb3Vyc2VsdmVzICovCisJCQkJQXNzZXJ0KFBfSVNIQUxGREVBRChvcGFxdWUp KTsKKwkJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBvcGFxdWUtPmJ0cG9fcHJldiwgYmxr bm8pOwogCQkJfQogCi0JCQkvKgotCQkJICogRm9yIHBhcmFsbGVsIHNjYW5zLCBnZXQgdGhlIGxh c3QgcGFnZSBzY2FubmVkIGFzIGl0IGlzIHF1aXRlCi0JCQkgKiBwb3NzaWJsZSB0aGF0IGJ5IHRo ZSB0aW1lIHdlIHRyeSB0byBzZWl6ZSB0aGUgc2Nhbiwgc29tZSBvdGhlcgotCQkJICogd29ya2Vy IGhhcyBhbHJlYWR5IGFkdmFuY2VkIHRoZSBzY2FuIHRvIGEgZGlmZmVyZW50IHBhZ2UuICBXZQot CQkJICogbXVzdCBjb250aW51ZSBiYXNlZCBvbiB0aGUgbGF0ZXN0IHBhZ2Ugc2Nhbm5lZCBieSBh bnkgd29ya2VyLgotCQkJICovCiAJCQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbiAhPSBOVUxMKQog CQkJeworCQkJCS8qIG5vIG1hdGNoaW5nIHR1cGxlcywgc28gc2VpemUgYSBwYWdlIHRvIHRoZSBs ZWZ0ICovCiAJCQkJX2J0X3JlbGJ1ZihyZWwsIHNvLT5jdXJyUG9zLmJ1Zik7Ci0JCQkJc3RhdHVz ID0gX2J0X3BhcmFsbGVsX3NlaXplKHNjYW4sICZibGtubywgZmFsc2UpOwotCQkJCWlmICghc3Rh dHVzKQorCisJCQkJaWYgKCFfYnRfcGFyYWxsZWxfc2VpemUoc2NhbiwgJmJsa25vLCAmbGFzdGN1 cnJibGtubywgZmFsc2UpKQogCQkJCXsKLQkJCQkJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3Vy clBvcyk7CisJCQkJCS8qIGRvbid0IGNhbGwgX2J0X3BhcmFsbGVsX2RvbmUgKi8KIAkJCQkJcmV0 dXJuIGZhbHNlOwogCQkJCX0KLQkJCQlzby0+Y3VyclBvcy5idWYgPSBfYnRfZ2V0YnVmKHJlbCwg Ymxrbm8sIEJUX1JFQUQpOwogCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIG5vIG1hdGNoaW5n IHR1cGxlcywgc28gY29uc2lkZXIgZm9sbG93aW5nIGxlZnQgbGluayAqLworCQkJCWxhc3RjdXJy Ymxrbm8gPSBibGtubzsKKwkJCQlibGtubyA9IG9wYXF1ZS0+YnRwb19wcmV2OworCQkJCV9idF9y ZWxidWYocmVsLCBzby0+Y3VyclBvcy5idWYpOworCQkJfQorCisJCQlCVFNjYW5Qb3NJbnZhbGlk YXRlKHNvLT5jdXJyUG9zKTsJLyogd29ya2luZyBvZmYgbmV3IGJsa25vIG5vdyAqLwogCQl9CiAJ fQogCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKglfYnRfcGFyYWxsZWxfcmVhZHBhZ2UoKSAt LSBSZWFkIGN1cnJlbnQgcGFnZSBjb250YWluaW5nIHZhbGlkIGRhdGEgZm9yIHNjYW4KLSAqCi0g KiBPbiBzdWNjZXNzLCByZWxlYXNlIGxvY2sgYW5kIG1heWJlIHBpbiBvbiBidWZmZXIuICBXZSBy ZXR1cm4gdHJ1ZSB0bwotICogaW5kaWNhdGUgc3VjY2Vzcy4KLSAqLwotc3RhdGljIGJvb2wKLV9i dF9wYXJhbGxlbF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyIGJsa25v LCBTY2FuRGlyZWN0aW9uIGRpcikKLXsKLQlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVl KSBzY2FuLT5vcGFxdWU7Ci0KLQlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOwotCi0JX2J0X2lu aXRpYWxpemVfbW9yZV9kYXRhKHNvLCBkaXIpOwotCi0JaWYgKCFfYnRfcmVhZG5leHRwYWdlKHNj YW4sIGJsa25vLCBkaXIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBoYXZlIGF0IGxlYXN0 IG9uZSBpdGVtIHRvIHJldHVybiBhcyBzY2FuJ3MgbmV4dCBpdGVtICovCisJLyoKKwkgKiBfYnRf cmVhZHBhZ2Ugc3VjY2VlZGVkLiAgRHJvcCB0aGUgbG9jayAoYW5kIG1heWJlIHRoZSBwaW4pIG9u CisJICogc28tPmN1cnJQb3MuYnVmIGluIHByZXBhcmF0aW9uIGZvciBidGdldHR1cGxlIHJldHVy bmluZyB0dXBsZXMuCisJICovCisJQXNzZXJ0KEJUU2NhblBvc0lzUGlubmVkKHNvLT5jdXJyUG9z KSk7CiAJX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluKHNjYW4sICZzby0+Y3VyclBvcyk7CiAK IAlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoKLSAqIF9idF93YWxrX2xlZnQoKSAtLSBzdGVwIGxlZnQg b25lIHBhZ2UsIGlmIHBvc3NpYmxlCisgKiBfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVmdCgpIC0t IGxvY2sgY2FsbGVyJ3MgbGVmdCBzaWJsaW5nIGJsa25vLAorICogcmVjb3ZlcmluZyBmcm9tIGNv bmN1cnJlbnQgcGFnZSBzcGxpdHMvcGFnZSBkZWxldGlvbnMgd2hlbiBuZWNlc3NhcnkKICAqCi0g KiBUaGUgZ2l2ZW4gYnVmZmVyIG11c3QgYmUgcGlubmVkIGFuZCByZWFkLWxvY2tlZC4gIFRoaXMg d2lsbCBiZSBkcm9wcGVkCi0gKiBiZWZvcmUgc3RlcHBpbmcgbGVmdC4gIE9uIHJldHVybiwgd2Ug aGF2ZSBwaW4gYW5kIHJlYWQgbG9jayBvbiB0aGUKLSAqIHJldHVybmVkIHBhZ2UsIGluc3RlYWQu CisgKiBDYWxsZWQgZHVyaW5nIGJhY2t3YXJkcyBzY2FucywgdG8gZGVhbCB3aXRoIHRoZWlyIHVu aXF1ZSBjb25jdXJyZW5jeSBydWxlcy4KICAqCi0gKiBSZXR1cm5zIEludmFsaWRCdWZmZXIgaWYg dGhlcmUgaXMgbm8gcGFnZSB0byB0aGUgbGVmdCAobm8gbG9jayBpcyBoZWxkCi0gKiBpbiB0aGF0 IGNhc2UpLgorICogYmxrbm8gcG9pbnRzIHRvIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIHBhZ2Ug dGhhdCB3ZSBleHBlY3QgdG8gbW92ZSB0aGUKKyAqIHNjYW4gdG8uICBXZSdsbCBzdWNjZXNzZnVs bHkgbW92ZSB0aGUgc2NhbiB0aGVyZSB3aGVuIHdlIGZpbmQgdGhhdCBpdHMKKyAqIHJpZ2h0IHNp YmxpbmcgbGluayBwb2ludHMgdG8gbGFzdGN1cnJibGtubywgdGhlIHBhZ2UgdGhhdCB3ZSBqdXN0 IGZpbmlzaGVkCisgKiByZWFkaW5nLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQg d2hpY2ggcGFnZSBpcyB0aGUgY29ycmVjdCBvbmUgdG8KKyAqIHZpc2l0IG5leHQgdGhlIGhhcmQg d2F5LCB3aGljaCBpbnZvbHZlcyByZWFzb25pbmcgYWJvdXQgYm90aCBjb25jdXJyZW50CisgKiBw YWdlIHNwbGl0cyBhbmQgY29uY3VycmVudCBwYWdlIGRlbGV0aW9ucy4gIFNlZSBuYnRyZWUvUkVB RE1FIGZvciBkZXRhaWxzLgorICoKKyAqIE9uIHJldHVybiwgd2UgaGF2ZSBib3RoIGEgcGluIGFu ZCBhIHJlYWQgbG9jayBvbiB0aGUgcmV0dXJuZWQgcGFnZSwgd2hvc2UKKyAqIGJsb2NrIG51bWJl ciB3aWxsIGJlIHNldCBpbiAqYmxrbm8uICBSZXR1cm5zIEludmFsaWRCdWZmZXIgaWYgdGhlcmUg aXMgbm8KKyAqIHBhZ2UgdG8gdGhlIGxlZnQgKG5vIGxvY2sgaXMgaGVsZCBpbiB0aGF0IGNhc2Up LgogICoKICAqIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcmV0dXJuZWQgbGVhZiBwYWdlIHRvIGJl IGhhbGYtZGVhZDsgY2FsbGVyIG11c3QKICAqIGNoZWNrIHRoYXQgY29uZGl0aW9uIGFuZCBzdGVw IGxlZnQgYWdhaW4gd2hlbiByZXF1aXJlZC4KICAqLwogc3RhdGljIEJ1ZmZlcgotX2J0X3dhbGtf bGVmdChSZWxhdGlvbiByZWwsIEJ1ZmZlciBidWYpCitfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVm dChSZWxhdGlvbiByZWwsIEJsb2NrTnVtYmVyICpibGtubywKKwkJCQkJCSAgIEJsb2NrTnVtYmVy IGxhc3RjdXJyYmxrbm8pCiB7Ci0JUGFnZQkJcGFnZTsKLQlCVFBhZ2VPcGFxdWUgb3BhcXVlOwot Ci0JcGFnZSA9IEJ1ZmZlckdldFBhZ2UoYnVmKTsKLQlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUo cGFnZSk7CisJQmxvY2tOdW1iZXIgb3JpZ2Jsa25vID0gKmJsa25vOyAvKiBkZXRlY3RzIGNpcmN1 bGFyIGxpbmtzICovCiAKIAlmb3IgKDs7KQogCXsKLQkJQmxvY2tOdW1iZXIgb2JrbnVtOwotCQlC bG9ja051bWJlciBsYmxrbm87Ci0JCUJsb2NrTnVtYmVyIGJsa25vOworCQlCdWZmZXIJCWJ1ZjsK KwkJUGFnZQkJcGFnZTsKKwkJQlRQYWdlT3BhcXVlIG9wYXF1ZTsKIAkJaW50CQkJdHJpZXM7CiAK LQkJLyogaWYgd2UncmUgYXQgZW5kIG9mIHRyZWUsIHJlbGVhc2UgYnVmIGFuZCByZXR1cm4gZmFp bHVyZSAqLwotCQlpZiAoUF9MRUZUTU9TVChvcGFxdWUpKQotCQl7Ci0JCQlfYnRfcmVsYnVmKHJl bCwgYnVmKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHJlbWVtYmVyIG9yaWdpbmFsIHBhZ2Ugd2Ug YXJlIHN0ZXBwaW5nIGxlZnQgZnJvbSAqLwotCQlvYmtudW0gPSBCdWZmZXJHZXRCbG9ja051bWJl cihidWYpOwotCQkvKiBzdGVwIGxlZnQgKi8KLQkJYmxrbm8gPSBsYmxrbm8gPSBvcGFxdWUtPmJ0 cG9fcHJldjsKLQkJX2J0X3JlbGJ1ZihyZWwsIGJ1Zik7CiAJCS8qIGNoZWNrIGZvciBpbnRlcnJ1 cHRzIHdoaWxlIHdlJ3JlIG5vdCBob2xkaW5nIGFueSBidWZmZXIgbG9jayAqLwogCQlDSEVDS19G T1JfSU5URVJSVVBUUygpOwotCQlidWYgPSBfYnRfZ2V0YnVmKHJlbCwgYmxrbm8sIEJUX1JFQUQp OworCQlidWYgPSBfYnRfZ2V0YnVmKHJlbCwgKmJsa25vLCBCVF9SRUFEKTsKIAkJcGFnZSA9IEJ1 ZmZlckdldFBhZ2UoYnVmKTsKIAkJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBhZ2UpOwogCkBA IC0yNDI3LDIxICsyNDU5LDI2IEBAIF9idF93YWxrX2xlZnQoUmVsYXRpb24gcmVsLCBCdWZmZXIg YnVmKQogCQl0cmllcyA9IDA7CiAJCWZvciAoOzspCiAJCXsKLQkJCWlmICghUF9JU0RFTEVURUQo b3BhcXVlKSAmJiBvcGFxdWUtPmJ0cG9fbmV4dCA9PSBvYmtudW0pCisJCQlpZiAoIVBfSVNERUxF VEVEKG9wYXF1ZSkgJiYgb3BhcXVlLT5idHBvX25leHQgPT0gbGFzdGN1cnJibGtubykKIAkJCXsK IAkJCQkvKiBGb3VuZCBkZXNpcmVkIHBhZ2UsIHJldHVybiBpdCAqLwogCQkJCXJldHVybiBidWY7 CiAJCQl9CiAJCQlpZiAoUF9SSUdIVE1PU1Qob3BhcXVlKSB8fCArK3RyaWVzID4gNCkKIAkJCQli cmVhazsKLQkJCWJsa25vID0gb3BhcXVlLT5idHBvX25leHQ7Ci0JCQlidWYgPSBfYnRfcmVsYW5k Z2V0YnVmKHJlbCwgYnVmLCBibGtubywgQlRfUkVBRCk7CisJCQkvKiBzdGVwIHJpZ2h0ICovCisJ CQkqYmxrbm8gPSBvcGFxdWUtPmJ0cG9fbmV4dDsKKwkJCWJ1ZiA9IF9idF9yZWxhbmRnZXRidWYo cmVsLCBidWYsICpibGtubywgQlRfUkVBRCk7CiAJCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYp OwogCQkJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBhZ2UpOwogCQl9CiAKLQkJLyogUmV0dXJu IHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRvIHNlZSB3aGF0J3MgdXAgKi8KLQkJYnVmID0gX2J0X3Jl bGFuZGdldGJ1ZihyZWwsIGJ1Ziwgb2JrbnVtLCBCVF9SRUFEKTsKKwkJLyoKKwkJICogUmV0dXJu IHRvIHRoZSBvcmlnaW5hbCBwYWdlICh1c3VhbGx5IHRoZSBwYWdlIG1vc3QgcmVjZW50bHkgcmVh ZCBieQorCQkgKiBfYnRfcmVhZHBhZ2UsIHdoaWNoIGlzIHBhc3NlZCBieSBjYWxsZXIgYXMgbGFz dGN1cnJibGtubykgdG8gc2VlCisJCSAqIHdoYXQncyB1cCB3aXRoIHNpYmxpbmcgbGlua3MKKwkJ ICovCisJCWJ1ZiA9IF9idF9yZWxhbmRnZXRidWYocmVsLCBidWYsIGxhc3RjdXJyYmxrbm8sIEJU X1JFQUQpOwogCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOwogCQlvcGFxdWUgPSBCVFBhZ2VH ZXRPcGFxdWUocGFnZSk7CiAJCWlmIChQX0lTREVMRVRFRChvcGFxdWUpKQpAQCAtMjQ1Nyw4ICsy NDk0LDggQEAgX2J0X3dhbGtfbGVmdChSZWxhdGlvbiByZWwsIEJ1ZmZlciBidWYpCiAJCQkJaWYg KFBfUklHSFRNT1NUKG9wYXF1ZSkpCiAJCQkJCWVsb2coRVJST1IsICJmZWxsIG9mZiB0aGUgZW5k IG9mIGluZGV4IFwiJXNcIiIsCiAJCQkJCQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7 Ci0JCQkJYmxrbm8gPSBvcGFxdWUtPmJ0cG9fbmV4dDsKLQkJCQlidWYgPSBfYnRfcmVsYW5kZ2V0 YnVmKHJlbCwgYnVmLCBibGtubywgQlRfUkVBRCk7CisJCQkJKmJsa25vID0gb3BhcXVlLT5idHBv X25leHQ7CisJCQkJYnVmID0gX2J0X3JlbGFuZGdldGJ1ZihyZWwsIGJ1ZiwgKmJsa25vLCBCVF9S RUFEKTsKIAkJCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOwogCQkJCW9wYXF1ZSA9IEJUUGFn ZUdldE9wYXF1ZShwYWdlKTsKIAkJCQlpZiAoIVBfSVNERUxFVEVEKG9wYXF1ZSkpCkBAIC0yNDY2 LDkgKzI1MDMsMTAgQEAgX2J0X3dhbGtfbGVmdChSZWxhdGlvbiByZWwsIEJ1ZmZlciBidWYpCiAJ CQl9CiAKIAkJCS8qCi0JCQkgKiBOb3cgcmV0dXJuIHRvIHRvcCBvZiBsb29wLCByZXNldHRpbmcg b2JrbnVtIHRvIHBvaW50IHRvIHRoaXMKLQkJCSAqIG5vbmRlbGV0ZWQgcGFnZSwgYW5kIHRyeSBh Z2Fpbi4KKwkJCSAqIHJlbWVtYmVyIHRoYXQgdGhpcyBwYWdlIGlzIGFjdHVhbGx5IG5vdyB0aGUg bGVmdG1vc3Qgb25lIHdob3NlCisJCQkgKiBrZXkgc3BhY2Ugd2UndmUgYWxyZWFkeSByZWFkIGFs bCB0dXBsZXMgZnJvbQogCQkJICovCisJCQlsYXN0Y3VycmJsa25vID0gQnVmZmVyR2V0QmxvY2tO dW1iZXIoYnVmKTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTI0NzcsMTEgKzI1MTUsMjIgQEAgX2J0 X3dhbGtfbGVmdChSZWxhdGlvbiByZWwsIEJ1ZmZlciBidWYpCiAJCQkgKiB0byB0aGUgbGVmdCBn b3Qgc3BsaXQgb3IgZGVsZXRlZC4gV2l0aG91dCB0aGlzIGNoZWNrLCB3ZSdkIGdvCiAJCQkgKiBp bnRvIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlcmUncyBhbnl0aGluZyB3cm9uZy4KIAkJCSAqLwot CQkJaWYgKG9wYXF1ZS0+YnRwb19wcmV2ID09IGxibGtubykKKwkJCWlmIChvcGFxdWUtPmJ0cG9f cHJldiA9PSBvcmlnYmxrbm8pCiAJCQkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBmaW5kIGxlZnQg c2libGluZyBvZiBibG9jayAldSBpbiBpbmRleCBcIiVzXCIiLAotCQkJCQkgb2JrbnVtLCBSZWxh dGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKTsKLQkJCS8qIE9rYXkgdG8gdHJ5IGFnYWluIHdpdGgg bmV3IGxibGtubyB2YWx1ZSAqLworCQkJCQkgbGFzdGN1cnJibGtubywgUmVsYXRpb25HZXRSZWxh dGlvbk5hbWUocmVsKSk7CisJCQkvKiBPa2F5IHRvIHRyeSBhZ2Fpbiwgc2luY2UgbGVmdCBzaWJs aW5nIGxpbmsgY2hhbmdlZCAqLwogCQl9CisKKwkJaWYgKFBfTEVGVE1PU1Qob3BhcXVlKSkKKwkJ eworCQkJLyogcHJldmlvdXMgbGVmdG1vc3QgcGFnZSBtdXN0IGhhdmUgYmVlbiBjb25jdXJyZW50 bHkgZGVsZXRlZCAqLworCQkJX2J0X3JlbGJ1ZihyZWwsIGJ1Zik7CisJCQlicmVhazsKKwkJfQor CisJCS8qIG5leHQgbG9vcCBpdGVyYXRpb24gd2lsbCBzdGFydCBvdmVyIHdpdGggYSBjbGVhbiBz bGF0ZSAqLworCQkqYmxrbm8gPSBvcmlnYmxrbm8gPSBvcGFxdWUtPmJ0cG9fcHJldjsKKwkJX2J0 X3JlbGJ1ZihyZWwsIGJ1Zik7CiAJfQogCiAJcmV0dXJuIEludmFsaWRCdWZmZXI7CkBAIC0yNjA1 LDcgKzI2NTQsNiBAQCBfYnRfZW5kcG9pbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0 aW9uIGRpcikKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCVByZWRpY2F0ZUxvY2tQYWdlKHJlbCwg QnVmZmVyR2V0QmxvY2tOdW1iZXIoYnVmKSwgc2Nhbi0+eHNfc25hcHNob3QpOwogCXBhZ2UgPSBC dWZmZXJHZXRQYWdlKGJ1Zik7CiAJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBhZ2UpOwogCUFz c2VydChQX0lTTEVBRihvcGFxdWUpKTsKQEAgLTI2MzIsMjYgKzI2ODAsMTEgQEAgX2J0X2VuZHBv aW50KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJLyogcmVtZW1iZXIg d2hpY2ggYnVmZmVyIHdlIGhhdmUgcGlubmVkICovCiAJc28tPmN1cnJQb3MuYnVmID0gYnVmOwog Ci0JX2J0X2luaXRpYWxpemVfbW9yZV9kYXRhKHNvLCBkaXIpOwotCiAJLyoKIAkgKiBOb3cgbG9h ZCBkYXRhIGZyb20gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHNjYW4uCiAJICovCi0JaWYgKCFfYnRf cmVhZHBhZ2Uoc2NhbiwgZGlyLCBzdGFydCwgdHJ1ZSkpCi0JewotCQkvKgotCQkgKiBUaGVyZSdz IG5vIGFjdHVhbGx5LW1hdGNoaW5nIGRhdGEgb24gdGhpcyBwYWdlLiAgVHJ5IHRvIGFkdmFuY2Ug dG8KLQkJICogdGhlIG5leHQgcGFnZS4gIFJldHVybiBmYWxzZSBpZiB0aGVyZSdzIG5vIG1hdGNo aW5nIGRhdGEgYXQgYWxsLgotCQkgKi8KLQkJX2J0X3VubG9ja2J1ZihzY2FuLT5pbmRleFJlbGF0 aW9uLCBzby0+Y3VyclBvcy5idWYpOwotCQlpZiAoIV9idF9zdGVwcGFnZShzY2FuLCBkaXIpKQot CQkJcmV0dXJuIGZhbHNlOwotCX0KLQllbHNlCi0JewotCQkvKiBXZSBoYXZlIGF0IGxlYXN0IG9u ZSBpdGVtIHRvIHJldHVybiBhcyBzY2FuJ3MgZmlyc3QgaXRlbSAqLwotCQlfYnRfZHJvcF9sb2Nr X2FuZF9tYXliZV9waW4oc2NhbiwgJnNvLT5jdXJyUG9zKTsKLQl9CisJaWYgKCFfYnRfcmVhZGZp cnN0cGFnZShzY2FuLCBzdGFydCwgZGlyKSkKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogT0ssIGl0 ZW1JbmRleCBzYXlzIHdoYXQgdG8gcmV0dXJuICovCiAJY3Vyckl0ZW0gPSAmc28tPmN1cnJQb3Mu aXRlbXNbc28tPmN1cnJQb3MuaXRlbUluZGV4XTsKQEAgLTI2NjEsMzMgKzI2OTQsMyBAQCBfYnRf ZW5kcG9pbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAogCXJldHVy biB0cnVlOwogfQotCi0vKgotICogX2J0X2luaXRpYWxpemVfbW9yZV9kYXRhKCkgLS0gaW5pdGlh bGl6ZSBtb3JlTGVmdCwgbW9yZVJpZ2h0IGFuZCBzY2FuIGRpcgotICogZnJvbSBjdXJyUG9zCi0g Ki8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX2J0X2luaXRpYWxpemVfbW9yZV9kYXRhKEJUU2Nhbk9w YXF1ZSBzbywgU2NhbkRpcmVjdGlvbiBkaXIpCi17Ci0Jc28tPmN1cnJQb3MuZGlyID0gZGlyOwot CWlmIChzby0+bmVlZFByaW1TY2FuKQotCXsKLQkJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOwot Ci0JCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gdHJ1ZTsKLQkJc28tPmN1cnJQb3MubW9yZVJpZ2h0 ID0gdHJ1ZTsKLQkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOwotCX0KLQllbHNlIGlmIChTY2Fu RGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCi0JewotCQlzby0+Y3VyclBvcy5tb3JlTGVmdCA9IGZh bHNlOwotCQlzby0+Y3VyclBvcy5tb3JlUmlnaHQgPSB0cnVlOwotCX0KLQllbHNlCi0JewotCQlz by0+Y3VyclBvcy5tb3JlTGVmdCA9IHRydWU7Ci0JCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZh bHNlOwotCX0KLQlzby0+bnVtS2lsbGVkID0gMDsJCQkvKiBqdXN0IHBhcmFub2lhICovCi0Jc28t Pm1hcmtJdGVtSW5kZXggPSAtMTsJCS8qIGRpdHRvICovCi19CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idHV0aWxzLmMKaW5kZXggYjRiYTUxMzU3Li4wM2Q1YzY3MWYgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv bmJ0cmVlL25idHV0aWxzLmMKQEAgLTI0NDIsNyArMjQ0Miw3IEBAIG5ld19wcmltX3NjYW46CiAJ c28tPm5lZWRQcmltU2NhbiA9IHRydWU7CS8qIC4uLmJ1dCBjYWxsIF9idF9maXJzdCBhZ2FpbiAq LwogCiAJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4pCi0JCV9idF9wYXJhbGxlbF9wcmltc2Nhbl9z Y2hlZHVsZShzY2FuLCBwc3RhdGUtPnByZXZfc2Nhbl9wYWdlKTsKKwkJX2J0X3BhcmFsbGVsX3By aW1zY2FuX3NjaGVkdWxlKHNjYW4sIHNvLT5jdXJyUG9zLmN1cnJQYWdlKTsKIAogCS8qIENhbGxl cidzIHR1cGxlIGRvZXNuJ3QgbWF0Y2ggdGhlIG5ldyBxdWFsICovCiAJcmV0dXJuIGZhbHNlOwot LSAKMi40NS4yCgo= --00000000000053113606243bdc06--