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 1qtyAJ-00FIIh-Mf for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Oct 2023 22:40:24 +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 1qtyAG-008pVI-M0 for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Oct 2023 22:40:21 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qtyAF-008pVA-MT for pgsql-hackers@lists.postgresql.org; Fri, 20 Oct 2023 22:40:21 +0000 Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qtyA8-001Uxt-7L for pgsql-hackers@lists.postgresql.org; Fri, 20 Oct 2023 22:40:18 +0000 Received: by mail-vk1-xa2b.google.com with SMTP id 71dfb90a1353d-49d39f07066so566354e0c.0 for ; Fri, 20 Oct 2023 15:40:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1697841610; x=1698446410; 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=W8aU3xS8NCFlA818UfyLCXXMJTwGujdWNmSBhBfJqqI=; b=ipgQCLMFdqckgLv9BMckj3jxT8SN3DOIkOk8Aj+xCIcdmIxW0+GgWcb9C6J9yBQR+J +tBkZI7bTMqKqXrYH0vWaG66rJtc+H48f30EmOPvPenOcEw05Ao/0YIfdb0bxgkX+M2v z0WdqeN6sRibXMfUgZ1rWiK5VZXHjLA9gGbKYykdYbNdvygqLxI1n0g/unZDbbcHXYKU rbDBo68oBqjMq/cuhOPhcCgfBNdMnY7PLS2OWeUcEeFvjt6aWYQRvkbvM2XgmnOUgJ4r ywUn7sVcQ+8rDGST11pe6oG7dhWodZeATsXEBFLvTycihBbEGykGRlK+Yv/4HpnuB76A XaAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697841610; x=1698446410; 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=W8aU3xS8NCFlA818UfyLCXXMJTwGujdWNmSBhBfJqqI=; b=YutvPoJ4llqPbsoA+AID2x+7wsTHq+dzkxjPQEHV6Dajywemfw22eCUSRfs4IE/scr ohPg3Jw4x3OGV6BlLikiabeNiz8smgAvLxjesb07deA9rMejlW84Z6wucKP9gWOIxnLx HW9IcNjG8gOxoqA5ot5ySMOeNupNXVWmwRd/dX7x40MQOxVi5vLSgZroGCibwoEP+xmd BrCQTdQFeu33TF3F8grNr/pS0PJjKcd5tmQP9RrfbLQOCSY3gVMJb9jbgYMF+mTI3tJm 33KroaCsa0rmwIHQo8sOX77hxmdQLZHmrwg7BlR7ftahLmor1GwGUmfMKSF1RFNzXYYc d7fw== X-Gm-Message-State: AOJu0YwK5c4yvHxBlaC2NKye2RK4SuW4zzSZPsDSVc5MaRD2z5V8m3C9 aUAeklT7A3OF0aYUC10IW9n7sDKUqg2Ci/QPhZU3ig== X-Google-Smtp-Source: AGHT+IEACK11qXuN7B7R4/Jm9Yi2bq67U+kFp3yKIykY6G+X50Ifp2AiCQ86BBOjw0hDDpp3jsxhHv8e185B9rzFBKQ= X-Received: by 2002:a05:6122:902:b0:49d:75d3:90b5 with SMTP id j2-20020a056122090200b0049d75d390b5mr3460686vka.6.1697841610549; Fri, 20 Oct 2023 15:40:10 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Fri, 20 Oct 2023 15:39:44 -0700 Message-ID: Subject: Re: Optimizing nbtree ScalarArrayOp execution, allowing multi-column ordered scans, skip scan To: Matthias van de Meent Cc: PostgreSQL Hackers , Tom Lane , Tomas Vondra , Jeff Davis , benoit , Alexander Korotkov Content-Type: multipart/mixed; boundary="00000000000015453d06082d8ecc" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000015453d06082d8ecc Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, Oct 15, 2023 at 1:50=E2=80=AFPM Peter Geoghegan wrote: > Attached is v4, which applies cleanly on top of HEAD. This was needed > due to Alexandar Korotkov's commit e0b1ee17, "Skip checking of scan > keys required for directional scan in B-tree". > > Unfortunately I have more or less dealt with the conflicts on HEAD by > disabling the optimization from that commit, for the time being. Attached is v5, which deals with the conflict with the optimization added by Alexandar Korotkov's commit e0b1ee17 sensibly: the optimization is now only disabled in cases without array scan keys. (It'd be very hard to make it work with array scan keys, since an important principle for my patch is that we can change search-type scan keys right in the middle of any _bt_readpage() call). v5 also fixes a longstanding open item for the patch: we no longer call _bt_preprocess_keys() with a buffer lock held, which was a bad idea at best, and unsafe (due to the syscache lookups within _bt_preprocess_keys) at worst. A new, minimal version of the function (called _bt_preprocess_keys_leafbuf) is called at the same point instead. That change, combined with the array binary search stuff (which was added back in v2), makes the total amount of work performed with a buffer lock held totally reasonable in all cases. It's even okay in extreme or adversarial cases with many millions of array keys. Making this _bt_preprocess_keys_leafbuf approach work has a downside: it requires that _bt_preprocess_keys be a little less aggressive about removing redundant scan keys, in order to meet certain assumptions held by the new _bt_preprocess_keys_leafbuf function. Essentially, _bt_preprocess_keys must now worry about current and future array key values when determining redundancy among scan keys -- not just the current array key values. _bt_preprocess_keys knows nothing about SK_SEARCHARRAY scan keys on HEAD, because on HEAD there is a strict 1:1 correspondence between the number of primitive index scans and the number of array keys (actually, the number of distinct combinations of array keys). Obviously that's no longer the case with the patch (that's the whole point of the patch). It's easiest to understand how elimination of redundant quals needs to work in v5 by way of an example. Consider the following query: select count(*), two, four, twenty, hundred from tenk1 where two in (0, 1) and four in (1, 2, 3) and two < 1; Notice that "two" appears in the where clause twice. First it appears as an SAOP, and then as an inequality. Right now, on HEAD, the primitive index scan where the SAOP's scankey is "two =3D 0" renders "two < 1" redundant. However, the subsequent primitive index scan where "two =3D 1" does *not* render "two < 1" redundant. This has implications for the mechanism in the patch, since the patch will perform one big primitive index scan for all array constants, with only a single _bt_preprocess_keys call at the start of its one and only _bt_first call (but with multiple _bt_preprocess_keys_leafbuf calls once we reach the leaf level). The compromise that I've settled on in v5 is to teach _bt_preprocess_keys to *never* treat "two < 1" as redundant with such a query -- even though there is some squishy sense in which "two < 1" is indeed still redundant (for the first SAOP key of value 0). My approach is reasonably well targeted in that it mostly doesn't affect queries that don't need it. But it will add cycles to some badly written queries that wouldn't have had them in earlier Postgres versions. I'm not entirely sure how much this matters, but my current sense is that it doesn't matter all that much. This is the kind of thing that is hard to test and poorly tested, so simplicity is even more of a virtue than usual. Note that the changes to _bt_preprocess_keys in v5 *don't* affect how we determine if the scan has contradictory quals, which is generally more important. With contradictory quals, _bt_first can avoid reading any data from the index. OTOH eliminating redundant quals (i.e. the thing that v5 *does* change) merely makes evaluating index quals less expensive via preprocessing-away unneeded scan keys. In other words, while it's possible that the approach taken by v5 will add CPU cycles in a small number of cases, it should never result in more page accesses. -- Peter Geoghegan --00000000000015453d06082d8ecc Content-Type: application/octet-stream; name="v5-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v5-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lnz6cgcr0 RnJvbSA5ZTA5ZGQ3MWMwOTgxMDQ4ZDcwY2NlODBlN2IyMTE4NDRjMWI3NTVmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHY1XSBFbmhhbmNl IG5idHJlZSBTY2FsYXJBcnJheU9wIGV4ZWN1dGlvbi4KCkNvbW1pdCA5ZThkYTBmNyB0YXVnaHQg bmJ0cmVlIHRvIGhhbmRsZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscwpuYXRpdmVseS4gIFRoaXMg d29ya3MgYnkgcHVzaGluZyBhZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQgdGhlIGFycmF5cwpkb3du IGludG8gdGhlIG5idHJlZSBpbmRleCBBTSwgYXMgaW5kZXggcXVhbHMuICBUaGlzIGluZm9ybWF0 aW9uIGVuYWJsZWQKbmJ0cmVlIHRvIGV4ZWN1dGUgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNj YW5zIGFzIHBhcnQgb2YgYW4gaW5kZXgKc2NhbiBleGVjdXRvciBub2RlIHRoYXQgd2FzIHRyZWF0 ZWQgYXMgb25lIGNvbnRpbnVvdXMgaW5kZXggc2Nhbi4KClRoZSBtb3RpdmF0aW9uIGJlaGluZCB0 aGlzIGVhcmxpZXIgd29yayB3YXMgZW5hYmxpbmcgaW5kZXgtb25seSBzY2Fucwp3aXRoIFNjYWxh ckFycmF5T3BFeHByIGNsYXVzZXMgKFNBT1AgcXVhbHMgYXJlIHRyYWRpdGlvbmFsbHkgZXhlY3V0 ZWQKdmlhIEJpdG1hcE9yIG5vZGVzLCB3aGljaCBpcyBsYXJnZWx5IGluZGV4LUFNLWFnbm9zdGlj LCBidXQgYWx3YXlzCnJlcXVpcmVzIGhlYXAgYWNjZXNzKS4gIFRoZSBnZW5lcmFsIGlkZWEgb2Yg Z2l2aW5nIHRoZSBpbmRleCBBTSB0aGlzCmFkZGl0aW9uYWwgY29udGV4dCBjYW4gYmUgcHVzaGVk IGEgbG90IGZ1cnRoZXIsIHRob3VnaC4KClRlYWNoIG5idHJlZSBTQU9QIGluZGV4IHNjYW5zIHRv IGR5bmFtaWNhbGx5IGFkdmFuY2UgYXJyYXkgc2NhbiBrZXlzCnVzaW5nIGluZm9ybWF0aW9uIGFi b3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGluZGV4LCBkZXRlcm1pbmVkIGF0CnJ1bnRp bWUuICBUaGUgYXJyYXkga2V5IHN0YXRlIG1hY2hpbmUgYWR2YW5jZXMgdGhlIGN1cnJlbnQgYXJy YXkga2V5cwp1c2luZyB0aGUgbmV4dCBpbmRleCB0dXBsZSBpbiBsaW5lIHRvIGJlIHNjYW5uZWQs IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUKc2NhbiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGxhc3Qg c2V0IG9mIGFycmF5IGtleXMuICBUaGlzIGFwcHJvYWNoIGlzCmZhciBtb3JlIGZsZXhpYmxlLCBh bmQgY2FuIGJlIGZhciBtb3JlIGVmZmljaWVudC4gIENhc2VzIHRoYXQgcHJldmlvdXNseQpyZXF1 aXJlZCBodW5kcmVkcyAoZXZlbiB0aG91c2FuZHMpIG9mIHByaW1pdGl2ZSBpbmRleCBzY2FucyBu b3cgcmVxdWlyZQphcyBmZXcgYXMgb25lIHNpbmdsZSBwcmltaXRpdmUgaW5kZXggc2Nhbi4KCkFs c28gcmVtb3ZlIGFsbCByZXN0cmljdGlvbnMgb24gZ2VuZXJhdGluZyBwYXRoIGtleXMgZm9yIG5i dHJlZSBpbmRleApzY2FucyB0aGF0IGhhcHBlbiB0byBoYXZlIFNjYWxhckFycmF5T3BFeHByIHF1 YWxzLiAgQnVnZml4IGNvbW1pdAo4MDdhNDBjNSB0YXVnaHQgdGhlIHBsYW5uZXIgdG8gYXZvaWQg Z2VuZXJhdGluZyB1bnNhZmUgcGF0aCBrZXlzOiBwYXRoCmtleXMgb24gYSBtdWx0aWNvbHVtbiBp bmRleCBwYXRoLCB3aXRoIGEgU0FPUCBjbGF1c2Ugb24gYW55IGF0dHJpYnV0ZQpiZXlvbmQgdGhl IGZpcnN0L21vc3Qgc2lnbmlmaWNhbnQgYXR0cmlidXRlLiAgVGhlc2UgY2FzZXMgYXJlIG5vdyBz YWZlLgpOb3cgbmJ0cmVlIGluZGV4IHNjYW5zIHdpdGggYW4gaW5lcXVhbGl0eSBjbGF1c2Ugb24g YSBoaWdoIG9yZGVyIGNvbHVtbgphbmQgYSBTQU9QIGNsYXVzZSBvbiBhIGxvd2VyIG9yZGVyIGNv bHVtbiBhcmUgZXhlY3V0ZWQgYXMgb25lIHNpbmdsZQpwcmltaXRpdmUgaW5kZXggc2Nhbiwgc2lu Y2UgdGhhdCBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIGl0LgpOb24tcmVxdWlyZWQg ZXF1YWxpdHkgdHlwZSBTQU9QIHF1YWxzIGFyZSBleGVjdXRlZCBieSBuYnRyZWUgdXNpbmcKYWxt b3N0IHRoZSBzYW1lIGFwcHJvYWNoIHVzZWQgZm9yIHJlcXVpcmVkIGVxdWFsaXR5IHR5cGUgU0FP UCBxdWFscy4KCldlIG5vdyBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIGFib3V0IHRoZSB3b3JzdCBj YXNlLCB3aGljaCBpcyB2ZXJ5IHVzZWZ1bAp3aGVuIGNvc3RpbmcgaW5kZXggc2NhbnMgd2l0aCBT QU9QIGNsYXVzZXMuICBUaGUgY29zdCBwcm9maWxlIG9mIGluZGV4CnBhdGhzIHdpdGggbXVsdGlw bGUgU0FPUCBjbGF1c2VzIGlzIG5vdyBhIGxvdCBjbG9zZXIgdG8gb3RoZXIgY2FzZXM7Cm1vcmUg c2VsZWN0aXZlIGluZGV4IHNjYW5zIHdpbGwgbm93IGdlbmVyYWxseSBoYXZlIGxvd2VyIGNvc3Rz IHRoYW4gbGVzcwpzZWxlY3RpdmUgaW5kZXggc2NhbnMuICBUaGUgYWRkZWQgY29zdCBmcm9tIHJl cGVhdGVkbHkgZGVzY2VuZGluZyB0aGUKaW5kZXggc3RpbGwgbWF0dGVycywgYnV0IGl0IGNhbiBu ZXZlciBiZSBjb21wbGV0ZWx5IGRvbWluYW50LgoKTWFueSBvZiB0aGUgcXVlcmllcyBzcGVkIHVw IGJ5IHRoZSB3b3JrIGZyb20gdGhpcyBjb21taXQgZG9uJ3QgZGlyZWN0bHkKYmVuZWZpdCBmcm9t IHRoZSBuYnRyZWUvZXhlY3V0b3IgZW5oYW5jZW1lbnRzLiAgVGhleSBiZW5lZml0IGluZGlyZWN0 bHkuCkluIGdlbmVyYWwgaXQgaXMgYmV0dGVyIHRvIHVzZSB0cnVlIGluZGV4IHF1YWxzIGluc3Rl YWQgb2YgZmlsdGVyIHF1YWxzLApzaW5jZSBpdCBhdm9pZHMgZXh0cmEgaGVhcCBhY2Nlc3NlcyB3 aGVuIGVsaW1pbmF0aW5nIG5vbi1tYXRjaGluZyB0dXBsZXMKdmlhIGV4cHJlc3Npb24gZXZhbHVh dGlvbiAoaW4gZ2VuZXJhbCBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgb25seSBzYWZlCndpdGgg dHVwbGVzIHRoYXQgYXJlIGtub3duIHZpc2libGUpLiAgVGhlIG5idHJlZSB3b3JrIHJlbW92ZXMg d2hhdCB3YXMKcmVhbGx5IGFuIGFydGlmaWNpYWwgZG93bnNpZGUgZm9yIGluZGV4IHF1YWxzLCBs ZWF2aW5nIG5vIHJlYXNvbiBmb3IgdGhlCnBsYW5uZXIgdG8gZXZlbiBjb25zaWRlciBTQU9QIGNs YXVzZSBpbmRleCBmaWx0ZXIgcXVhbHMgYW55bW9yZS4gIFRoaXMKaXMgZXNwZWNpYWxseSBsaWtl bHkgdG8gaGVscCB3aXRoIHNlbGVjdGl2ZSBpbmRleCBzY2FucyB3aXRoIFNBT1AKY2xhdXNlcyBv biBsb3ctb3JkZXIgaW5kZXggY29sdW1ucy4KCkF1dGhvcjogUGV0ZXIgR2VvZ2hlZ2FuIDxwZ0Bi b3d0LmllPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NBSDItV3o9a3N2Tl9zamNu RDErQnQtV3RpZlJBNW9rNDhhRFlucTNwa0toeGdNUXBjd0BtYWlsLmdtYWlsLmNvbQotLS0KIHNy Yy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaCAgICAgICAgICAgICAgICB8ICAgMzkgKy0KIHNyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMgICAgICAgICB8ICAgNTkgKy0KIHNyYy9iYWNr ZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMgICAgICB8ICAgODQgKy0KIHNyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYyAgICAgICB8IDEzNDIgKysrKysrKysrKysrKysrKysr LS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgICAgICB8ICAgNjQgKy0K IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jICAgICAgICAgICB8ICAxMjMgKy0KIGRv Yy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwgICAgICAgICAgICAgICB8ICAgMTMgKwogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0IHwgICA2MSArLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgIHwgICAgNSArLQogc3JjL3Rlc3QvcmVn cmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbCAgICAgIHwgICAyMCArLQogMTAgZmlsZXMgY2hhbmdl ZCwgMTQ4NCBpbnNlcnRpb25zKCspLCAzMjYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvYWNjZXNzL25idHJlZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCmlu ZGV4IDdiZmJmMzA4Ni4uZGU3ZGVhNDFjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3Mv bmJ0cmVlLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCkBAIC0xMDQzLDEzICsx MDQzLDEzIEBAIHR5cGVkZWYgc3RydWN0IEJUU2Nhbk9wYXF1ZURhdGEKIAogCS8qIHdvcmtzcGFj ZSBmb3IgU0tfU0VBUkNIQVJSQVkgc3VwcG9ydCAqLwogCVNjYW5LZXkJCWFycmF5S2V5RGF0YTsJ LyogbW9kaWZpZWQgY29weSBvZiBzY2FuLT5rZXlEYXRhICovCi0JYm9vbAkJYXJyYXlzU3RhcnRl ZDsJLyogU3RhcnRlZCBhcnJheSBrZXlzLCBidXQgaGF2ZSB5ZXQgdG8gInJlYWNoCi0JCQkJCQkJ CSAqIHBhc3QgdGhlIGVuZCIgb2YgYWxsIGFycmF5cz8gKi8KIAlpbnQJCQludW1BcnJheUtleXM7 CS8qIG51bWJlciBvZiBlcXVhbGl0eS10eXBlIGFycmF5IGtleXMgKC0xIGlmCiAJCQkJCQkJCSAq IHRoZXJlIGFyZSBhbnkgdW5zYXRpc2ZpYWJsZSBhcnJheSBrZXlzKSAqLwotCWludAkJCWFycmF5 S2V5Q291bnQ7CS8qIGNvdW50IGluZGljYXRpbmcgbnVtYmVyIG9mIGFycmF5IHNjYW4ga2V5cwot CQkJCQkJCQkgKiBwcm9jZXNzZWQgKi8KKwlib29sCQluZWVkUHJpbVNjYW47CS8qIFBlcmZvcm0g YW5vdGhlciBwcmltaXRpdmUgc2Nhbj8gKi8KIAlCVEFycmF5S2V5SW5mbyAqYXJyYXlLZXlzOwkv KiBpbmZvIGFib3V0IGVhY2ggZXF1YWxpdHktdHlwZSBhcnJheSBrZXkgKi8KKwlGbWdySW5mbyAg ICpvcmRlclByb2NzOwkJLyogT1JERVIgcHJvY3MgZm9yIGVxdWFsaXR5IGNvbnN0cmFpbnQga2V5 cyAqLworCWludAkJCW51bVByaW1TY2FuczsJLyogUnVubmluZyB0YWxseSBvZiAjIHByaW1pdGl2 ZSBpbmRleCBzY2FucworCQkJCQkJCQkgKiAodXNlZCB0byBjb29yZGluYXRlIHBhcmFsbGVsIHdv cmtlcnMpICovCiAJTWVtb3J5Q29udGV4dCBhcnJheUNvbnRleHQ7IC8qIHNjYW4tbGlmZXNwYW4g Y29udGV4dCBmb3IgYXJyYXkgZGF0YSAqLwogCiAJLyogaW5mbyBhYm91dCBraWxsZWQgaXRlbXMg aWYgYW55IChraWxsZWRJdGVtcyBpcyBOVUxMIGlmIG5ldmVyIHVzZWQpICovCkBAIC0xMDgzLDYg KzEwODMsMjkgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRTY2FuT3BhcXVlRGF0YQogCiB0eXBlZGVmIEJU U2Nhbk9wYXF1ZURhdGEgKkJUU2Nhbk9wYXF1ZTsKIAorLyoKKyAqIF9idF9yZWFkcGFnZSBzdGF0 ZSB1c2VkIGFjcm9zcyBfYnRfY2hlY2trZXlzIGNhbGxzIGZvciBhIHBhZ2UKKyAqCisgKiBXaGVu IF9idF9yZWFkcGFnZSBpcyBjYWxsZWQgZHVyaW5nIGEgZm9yd2FyZCBzY2FuIHRoYXQgaGFzIG9u ZSBvciBtb3JlCisgKiBlcXVhbGl0eS10eXBlIFNLX1NFQVJDSEFSUkFZIHNjYW4ga2V5cywgaXQg aGFzIGFuIGV4dHJhIHJlc3BvbnNpYmlsaXR5OiB0bworICogc2V0IHVwIGluZm9ybWF0aW9uIGFi b3V0IHRoZSBwYWdlIGhpZ2gga2V5LiAgVGhpcyBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlCisgKiBm aXJzdCBjYWxsIHRvIF9idF9jaGVja2tleXMuICBfYnRfY2hlY2trZXlzIHVzZXMgdGhpcyBpbmZv cm1hdGlvbiB0byBtYW5hZ2UKKyAqIGFkdmFuY2VtZW50IG9mIHRoZSBzY2FuJ3MgYXJyYXkga2V5 cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQlRSZWFkUGFnZVN0YXRlCit7CisJLyogSW5wdXQgcGFy YW1ldGVycywgc2V0IGJ5IF9idF9yZWFkcGFnZSAqLworCVNjYW5EaXJlY3Rpb24gZGlyOwkJCS8q IGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24gKi8KKwlJbmRleFR1cGxlCWhpZ2hrZXk7CQkvKiBwYWdl IGhpZ2gga2V5LCBzZXQgYnkgZm9yd2FyZCBzY2FucyAqLworCisJLyogT3V0cHV0IHBhcmFtZXRl cnMsIHNldCBieSBfYnRfY2hlY2trZXlzICovCisJYm9vbAkJY29udGludWVzY2FuOwkvKiBUZXJt aW5hdGUgb25nb2luZyAocHJpbWl0aXZlKSBpbmRleCBzY2FuPyAqLworCisJLyogUHJpdmF0ZSBf YnRfY2hlY2trZXlzLW1hbmFnZWQgc3RhdGUgKi8KKwlib29sCQloaWdoa2V5Y2hlY2tlZDsgLyog aGlnaCBrZXkgY2hlY2tlZCBhZ2FpbnN0IGN1cnJlbnQKKwkJCQkJCQkJICogU0tfU0VBUkNIQVJS QVkgYXJyYXkga2V5cz8gKi8KK30gQlRSZWFkUGFnZVN0YXRlOworCiAvKgogICogV2UgdXNlIHNv bWUgcHJpdmF0ZSBza19mbGFncyBiaXRzIGluIHByZXByb2Nlc3NlZCBzY2FuIGtleXMuICBXZSdy ZSBhbGxvd2VkCiAgKiB0byB1c2UgYml0cyAxNi0zMSAoc2VlIHNrZXkuaCkuICBUaGUgdXBwZXJt b3N0IGJpdHMgYXJlIGNvcGllZCBmcm9tIHRoZQpAQCAtMTE2MCw3ICsxMTgzLDcgQEAgZXh0ZXJu IGJvb2wgYnRjYW5yZXR1cm4oUmVsYXRpb24gaW5kZXgsIGludCBhdHRubyk7CiBleHRlcm4gYm9v bCBfYnRfcGFyYWxsZWxfc2VpemUoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciAqcGFn ZW5vKTsKIGV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9yZWxlYXNlKEluZGV4U2NhbkRlc2Mgc2Nh biwgQmxvY2tOdW1iZXIgc2Nhbl9wYWdlKTsKIGV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9kb25l KEluZGV4U2NhbkRlc2Mgc2Nhbik7Ci1leHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxfYWR2YW5jZV9h cnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7CitleHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxf bmV4dF9wcmltaXRpdmVfc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pOwogCiAvKgogICogcHJvdG90 eXBlcyBmb3IgZnVuY3Rpb25zIGluIG5idGRlZHVwLmMKQEAgLTEyNTMsMTIgKzEyNzYsMTIgQEAg ZXh0ZXJuIEJUU2Nhbkluc2VydCBfYnRfbWtzY2Fua2V5KFJlbGF0aW9uIHJlbCwgSW5kZXhUdXBs ZSBpdHVwKTsKIGV4dGVybiB2b2lkIF9idF9mcmVlc3RhY2soQlRTdGFjayBzdGFjayk7CiBleHRl cm4gdm9pZCBfYnRfcHJlcHJvY2Vzc19hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBl eHRlcm4gdm9pZCBfYnRfc3RhcnRfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyKTsKLWV4dGVybiBib29sIF9idF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitleHRlcm4gYm9vbCBfYnRfYXJyYXlf a2V5c19yZW1haW4oSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CiBleHRl cm4gdm9pZCBfYnRfbWFya19hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBleHRlcm4g dm9pZCBfYnRfcmVzdG9yZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBleHRlcm4g dm9pZCBfYnRfcHJlcHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7Ci1leHRlcm4gYm9v bCBfYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwKLQkJ CQkJCSAgaW50IHR1cG5hdHRzLCBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCAqY29udGludWVzY2Fu LAorZXh0ZXJuIGJvb2wgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBh Z2VTdGF0ZSAqcHN0YXRlLAorCQkJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVw LAogCQkJCQkJICBib29sIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwogZXh0ZXJuIHZvaWQg X2J0X2tpbGxpdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4pOwogZXh0ZXJuIEJUQ3ljbGVJZCBfYnRf dmFjdXVtX2N5Y2xlaWQoUmVsYXRpb24gcmVsKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5j CmluZGV4IDkyOTUwYjM3Ny4uZjk2M2MzZmU3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nl c3MvbmJ0cmVlL25idHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVl LmMKQEAgLTQ4LDggKzQ4LDggQEAKICAqIEJUUEFSQUxMRUxfSURMRSBpbmRpY2F0ZXMgdGhhdCBu byBiYWNrZW5kIGlzIGN1cnJlbnRseSBhZHZhbmNpbmcgdGhlIHNjYW4KICAqIHRvIGEgbmV3IHBh Z2U7IHNvbWUgcHJvY2VzcyBjYW4gc3RhcnQgZG9pbmcgdGhhdC4KICAqCi0gKiBCVFBBUkFMTEVM X0RPTkUgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4gaXMgY29tcGxldGUgKGluY2x1ZGluZyBlcnJv ciBleGl0KS4KLSAqIFdlIHJlYWNoIHRoaXMgc3RhdGUgb25jZSBmb3IgZXZlcnkgZGlzdGluY3Qg Y29tYmluYXRpb24gb2YgYXJyYXkga2V5cy4KKyAqIEJUUEFSQUxMRUxfRE9ORSBpbmRpY2F0ZXMg dGhhdCB0aGUgcHJpbWl0aXZlIGluZGV4IHNjYW4gaXMgY29tcGxldGUKKyAqIChpbmNsdWRpbmcg ZXJyb3IgZXhpdCkuICBSZWFjaGVkIG9uY2UgcGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuLgogICov CiB0eXBlZGVmIGVudW0KIHsKQEAgLTY5LDggKzY5LDggQEAgdHlwZWRlZiBzdHJ1Y3QgQlRQYXJh bGxlbFNjYW5EZXNjRGF0YQogCUJUUFNfU3RhdGUJYnRwc19wYWdlU3RhdHVzOwkvKiBpbmRpY2F0 ZXMgd2hldGhlciBuZXh0IHBhZ2UgaXMKIAkJCQkJCQkJCSAqIGF2YWlsYWJsZSBmb3Igc2Nhbi4g c2VlIGFib3ZlIGZvcgogCQkJCQkJCQkJICogcG9zc2libGUgc3RhdGVzIG9mIHBhcmFsbGVsIHNj YW4uICovCi0JaW50CQkJYnRwc19hcnJheUtleUNvdW50OyAvKiBjb3VudCBpbmRpY2F0aW5nIG51 bWJlciBvZiBhcnJheSBzY2FuCi0JCQkJCQkJCQkgKiBrZXlzIHByb2Nlc3NlZCBieSBwYXJhbGxl bCBzY2FuICovCisJaW50CQkJYnRwc19udW1QcmltU2NhbnM7CS8qIGNvdW50IGluZGljYXRpbmcg bnVtYmVyIG9mIHByaW1pdGl2ZQorCQkJCQkJCQkJICogaW5kZXggc2NhbnMgKHVzZWQgd2l0aCBh cnJheSBrZXlzKSAqLwogCXNsb2NrX3QJCWJ0cHNfbXV0ZXg7CQkvKiBwcm90ZWN0cyBhYm92ZSB2 YXJpYWJsZXMgKi8KIAlDb25kaXRpb25WYXJpYWJsZSBidHBzX2N2OwkvKiB1c2VkIHRvIHN5bmNo cm9uaXplIHBhcmFsbGVsIHNjYW4gKi8KIH0JCQlCVFBhcmFsbGVsU2NhbkRlc2NEYXRhOwpAQCAt Mjc2LDcgKzI3Niw3IEBAIGJ0Z2V0dHVwbGUoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0 aW9uIGRpcikKIAkJaWYgKHJlcykKIAkJCWJyZWFrOwogCQkvKiAuLi4gb3RoZXJ3aXNlIHNlZSBp ZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdpdGggKi8KLQl9IHdoaWxlIChzby0+ bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgZGlyKSk7CisJfSB3 aGlsZSAoc28tPm51bUFycmF5S2V5cyAmJiBfYnRfYXJyYXlfa2V5c19yZW1haW4oc2NhbiwgZGly KSk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMzM0LDcgKzMzNCw3IEBAIGJ0Z2V0Yml0bWFwKElu ZGV4U2NhbkRlc2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pCiAJCQl9CiAJCX0KIAkJLyogTm93IHNl ZSBpZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFsIHdpdGggKi8KLQl9IHdoaWxlIChz by0+bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5X2tleXMoc2NhbiwgRm9yd2FyZFNj YW5EaXJlY3Rpb24pKTsKKwl9IHdoaWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9hcnJheV9r ZXlzX3JlbWFpbihzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbikpOwogCiAJcmV0dXJuIG50aWRz OwogfQpAQCAtMzY0LDkgKzM2NCwxMCBAQCBidGJlZ2luc2NhbihSZWxhdGlvbiByZWwsIGludCBu a2V5cywgaW50IG5vcmRlcmJ5cykKIAkJc28tPmtleURhdGEgPSBOVUxMOwogCiAJc28tPmFycmF5 S2V5RGF0YSA9IE5VTEw7CS8qIGFzc3VtZSBubyBhcnJheSBrZXlzIGZvciBub3cgKi8KLQlzby0+ YXJyYXlzU3RhcnRlZCA9IGZhbHNlOwogCXNvLT5udW1BcnJheUtleXMgPSAwOworCXNvLT5uZWVk UHJpbVNjYW4gPSBmYWxzZTsKIAlzby0+YXJyYXlLZXlzID0gTlVMTDsKKwlzby0+b3JkZXJQcm9j cyA9IE5VTEw7CiAJc28tPmFycmF5Q29udGV4dCA9IE5VTEw7CiAKIAlzby0+a2lsbGVkSXRlbXMg PSBOVUxMOwkJLyogdW50aWwgbmVlZGVkICovCkBAIC00MDYsNyArNDA3LDggQEAgYnRyZXNjYW4o SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJfQog CiAJc28tPm1hcmtJdGVtSW5kZXggPSAtMTsKLQlzby0+YXJyYXlLZXlDb3VudCA9IDA7CisJc28t Pm5lZWRQcmltU2NhbiA9IGZhbHNlOworCXNvLT5udW1QcmltU2NhbnMgPSAwOwogCXNvLT5maXJz dFBhZ2UgPSBmYWxzZTsKIAlCVFNjYW5Qb3NVbnBpbklmUGlubmVkKHNvLT5tYXJrUG9zKTsKIAlC VFNjYW5Qb3NJbnZhbGlkYXRlKHNvLT5tYXJrUG9zKTsKQEAgLTU4OCw3ICs1OTAsNyBAQCBidGlu aXRwYXJhbGxlbHNjYW4odm9pZCAqdGFyZ2V0KQogCVNwaW5Mb2NrSW5pdCgmYnRfdGFyZ2V0LT5i dHBzX211dGV4KTsKIAlidF90YXJnZXQtPmJ0cHNfc2NhblBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1i ZXI7CiAJYnRfdGFyZ2V0LT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX05PVF9JTklUSUFM SVpFRDsKLQlidF90YXJnZXQtPmJ0cHNfYXJyYXlLZXlDb3VudCA9IDA7CisJYnRfdGFyZ2V0LT5i dHBzX251bVByaW1TY2FucyA9IDA7CiAJQ29uZGl0aW9uVmFyaWFibGVJbml0KCZidF90YXJnZXQt PmJ0cHNfY3YpOwogfQogCkBAIC02MTQsNyArNjE2LDcgQEAgYnRwYXJhbGxlbHJlc2NhbihJbmRl eFNjYW5EZXNjIHNjYW4pCiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwog CWJ0c2Nhbi0+YnRwc19zY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsKIAlidHNjYW4tPmJ0 cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfTk9UX0lOSVRJQUxJWkVEOwotCWJ0c2Nhbi0+YnRw c19hcnJheUtleUNvdW50ID0gMDsKKwlidHNjYW4tPmJ0cHNfbnVtUHJpbVNjYW5zID0gMDsKIAlT cGluTG9ja1JlbGVhc2UoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiB9CiAKQEAgLTYyNSw3ICs2Mjcs MTEgQEAgYnRwYXJhbGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAgKgogICogVGhlIHJl dHVybiB2YWx1ZSBpcyB0cnVlIGlmIHdlIHN1Y2Nlc3NmdWxseSBzZWl6ZWQgdGhlIHNjYW4gYW5k IGZhbHNlCiAgKiBpZiB3ZSBkaWQgbm90LiAgVGhlIGxhdHRlciBjYXNlIG9jY3VycyBpZiBubyBw YWdlcyByZW1haW4gZm9yIHRoZSBjdXJyZW50Ci0gKiBzZXQgb2Ygc2NhbmtleXMuCisgKiBwcmlt aXRpdmUgaW5kZXggc2Nhbi4KKyAqCisgKiBXaGVuIGFycmF5IHNjYW4ga2V5cyBhcmUgaW4gdXNl LCBlYWNoIHdvcmtlciBwcm9jZXNzIGluZGVwZW5kZW50bHkgYWR2YW5jZXMKKyAqIGl0cyBhcnJh eSBrZXlzLiAgSXQncyBjcnVjaWFsIHRoYXQgZWFjaCB3b3JrZXIgcHJvY2VzcyBuZXZlciBiZSBh bGxvd2VkIHRvCisgKiBzY2FuIGEgcGFnZSBmcm9tIGJlZm9yZSB0aGUgY3VycmVudCBzY2FuIHBv c2l0aW9uLgogICoKICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgKnBhZ2VubyByZXR1 cm5zIHRoZSBuZXh0IG9yIGN1cnJlbnQgcGFnZQogICogb2YgdGhlIHNjYW4gKGRlcGVuZGluZyBv biB0aGUgc2NhbiBkaXJlY3Rpb24pLiAgQW4gaW52YWxpZCBibG9jayBudW1iZXIKQEAgLTY1Niwx NiArNjYyLDE3IEBAIF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2Nr TnVtYmVyICpwYWdlbm8pCiAJCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsK IAkJcGFnZVN0YXR1cyA9IGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzOwogCi0JCWlmIChzby0+YXJy YXlLZXlDb3VudCA8IGJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50KQorCQlpZiAoc28tPm51bVBy aW1TY2FucyA8IGJ0c2Nhbi0+YnRwc19udW1QcmltU2NhbnMpCiAJCXsKLQkJCS8qIFBhcmFsbGVs IHNjYW4gaGFzIGFscmVhZHkgYWR2YW5jZWQgdG8gYSBuZXcgc2V0IG9mIHNjYW5rZXlzLiAqLwor CQkJLyogVG9wLWxldmVsIHNjYW4gYWxyZWFkeSBtb3ZlZCBvbiB0byBuZXh0IHByaW1pdGl2ZSBp bmRleCBzY2FuICovCiAJCQlzdGF0dXMgPSBmYWxzZTsKIAkJfQogCQllbHNlIGlmIChwYWdlU3Rh dHVzID09IEJUUEFSQUxMRUxfRE9ORSkKIAkJewogCQkJLyoKLQkJCSAqIFdlJ3JlIGRvbmUgd2l0 aCB0aGlzIHNldCBvZiBzY2Fua2V5cy4gIFRoaXMgbWF5IGJlIHRoZSBlbmQsIG9yCi0JCQkgKiB0 aGVyZSBjb3VsZCBiZSBtb3JlIHNldHMgdG8gdHJ5LgorCQkJICogV2UncmUgZG9uZSB3aXRoIHRo aXMgcHJpbWl0aXZlIGluZGV4IHNjYW4uICBUaGlzIG1pZ2h0IGhhdmUKKwkJCSAqIGJlZW4gdGhl IGZpbmFsIHByaW1pdGl2ZSBpbmRleCBzY2FuIHJlcXVpcmVkLCBvciB0aGUgdG9wLWxldmVsCisJ CQkgKiBpbmRleCBzY2FuIG1pZ2h0IHJlcXVpcmUgYWRkaXRpb25hbCBwcmltaXRpdmUgc2NhbnMu CiAJCQkgKi8KIAkJCXN0YXR1cyA9IGZhbHNlOwogCQl9CkBAIC02OTcsOSArNzA0LDEyIEBAIF9i dF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8p CiB2b2lkCiBfYnRfcGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVt YmVyIHNjYW5fcGFnZSkKIHsKKwlCVFNjYW5PcGFxdWUgc28gUEdfVVNFRF9GT1JfQVNTRVJUU19P TkxZID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVsSW5kZXhTY2FuRGVz YyBwYXJhbGxlbF9zY2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKIAlCVFBhcmFsbGVsU2NhbkRl c2MgYnRzY2FuOwogCisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwogCWJ0c2NhbiA9IChC VFBhcmFsbGVsU2NhbkRlc2MpIE9mZnNldFRvUG9pbnRlcigodm9pZCAqKSBwYXJhbGxlbF9zY2Fu LAogCQkJCQkJCQkJCQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwogCkBAIC03MzMsMTIg Kzc0MywxMSBAQCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJCQkJ CQkJCQkgIHBhcmFsbGVsX3NjYW4tPnBzX29mZnNldCk7CiAKIAkvKgotCSAqIE1hcmsgdGhlIHBh cmFsbGVsIHNjYW4gYXMgZG9uZSBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBzY2FuIGtleXMsCi0J ICogdW5sZXNzIHNvbWUgb3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpZCBzby4gIFNlZSBhbHNvCi0J ICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cy4KKwkgKiBNYXJrIHRoZSBwcmltaXRpdmUgaW5kZXgg c2NhbiBhcyBkb25lLCB1bmxlc3Mgc29tZSBvdGhlciBwcm9jZXNzCisJICogYWxyZWFkeSBkaWQg c28uICBTZWUgYWxzbyBfYnRfYXJyYXlfa2V5c19yZW1haW4uCiAJICovCiAJU3BpbkxvY2tBY3F1 aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwotCWlmIChzby0+YXJyYXlLZXlDb3VudCA+PSBidHNj YW4tPmJ0cHNfYXJyYXlLZXlDb3VudCAmJgorCWlmIChzby0+bnVtUHJpbVNjYW5zID49IGJ0c2Nh bi0+YnRwc19udW1QcmltU2NhbnMgJiYKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgIT0gQlRQ QVJBTExFTF9ET05FKQogCXsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVM X0RPTkU7CkBAIC03NTIsMTQgKzc2MSwxNCBAQCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5E ZXNjIHNjYW4pCiB9CiAKIC8qCi0gKiBfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlzKCkg LS0gQWR2YW5jZXMgdGhlIHBhcmFsbGVsIHNjYW4gZm9yIGFycmF5Ci0gKgkJCWtleXMuCisgKiBf YnRfcGFyYWxsZWxfbmV4dF9wcmltaXRpdmVfc2NhbigpIC0tIEFkdmFuY2VzIHBhcmFsbGVsIHBy aW1pdGl2ZSBzY2FuCisgKgkJCWNvdW50ZXIgd2hlbiBhcnJheSBrZXlzIGFyZSBpbiB1c2UuCiAg KgotICogVXBkYXRlcyB0aGUgY291bnQgb2YgYXJyYXkga2V5cyBwcm9jZXNzZWQgZm9yIGJvdGgg bG9jYWwgYW5kIHBhcmFsbGVsCisgKiBVcGRhdGVzIHRoZSBjb3VudCBvZiBwcmltaXRpdmUgaW5k ZXggc2NhbnMgZm9yIGJvdGggbG9jYWwgYW5kIHBhcmFsbGVsCiAgKiBzY2Fucy4KICAqLwogdm9p ZAotX2J0X3BhcmFsbGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCitf YnRfcGFyYWxsZWxfbmV4dF9wcmltaXRpdmVfc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiB7CiAJ QlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVs SW5kZXhTY2FuRGVzYyBwYXJhbGxlbF9zY2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKQEAgLTc2 OCwxMyArNzc3LDEzIEBAIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuKQogCWJ0c2NhbiA9IChCVFBhcmFsbGVsU2NhbkRlc2MpIE9mZnNldFRvUG9pbnRl cigodm9pZCAqKSBwYXJhbGxlbF9zY2FuLAogCQkJCQkJCQkJCQkJICBwYXJhbGxlbF9zY2FuLT5w c19vZmZzZXQpOwogCi0Jc28tPmFycmF5S2V5Q291bnQrKzsKKwlzby0+bnVtUHJpbVNjYW5zKys7 CiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCWlmIChidHNjYW4tPmJ0 cHNfcGFnZVN0YXR1cyA9PSBCVFBBUkFMTEVMX0RPTkUpCiAJewogCQlidHNjYW4tPmJ0cHNfc2Nh blBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0g QlRQQVJBTExFTF9OT1RfSU5JVElBTElaRUQ7Ci0JCWJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50 Kys7CisJCWJ0c2Nhbi0+YnRwc19udW1QcmltU2NhbnMrKzsKIAl9CiAJU3BpbkxvY2tSZWxlYXNl KCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L25idHJlZS9uYnRzZWFyY2guYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNo LmMKaW5kZXggZWZjNTI4NGU1Li5kMGFiZGU1ODQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnRzZWFyY2guYwpAQCAtODkzLDcgKzg5Myw3IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCSAqLwogCWlmICghc28tPnF1YWxfb2spCiAJewotCQkv KiBOb3RpZnkgYW55IG90aGVyIHdvcmtlcnMgdGhhdCB3ZSdyZSBkb25lIHdpdGggdGhpcyBzY2Fu IGtleS4gKi8KKwkJLyogTm90aWZ5IGFueSBvdGhlciB3b3JrZXJzIHRoYXQgdGhpcyBwcmltaXRp dmUgc2NhbiBpcyBkb25lICovCiAJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOwogCQlyZXR1cm4g ZmFsc2U7CiAJfQpAQCAtOTUyLDYgKzk1MiwxMCBAQCBfYnRfZmlyc3QoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkgKiBvbmUgd2UgdXNlIC0tLSBieSBkZWZpbml0aW9u LCB0aGV5IGFyZSBlaXRoZXIgcmVkdW5kYW50IG9yCiAJICogY29udHJhZGljdG9yeS4KIAkgKgor CSAqIFdoZW4gU0tfU0VBUkNIQVJSQVkga2V5cyBhcmUgaW4gdXNlLCBfYnRfdHVwbGVfYmVmb3Jl X2FycmF5X2tleXMgaXMKKwkgKiB1c2VkIHRvIGF2b2lkIHByZW1hdHVyZWx5IHN0b3BwaW5nIHRo ZSBzY2FuIHdoZW4gYW4gYXJyYXkgZXF1YWxpdHkgcXVhbAorCSAqIGhhcyBpdHMgYXJyYXkga2V5 cyBhZHZhbmNlZC4KKwkgKgogCSAqIEFueSByZWd1bGFyIChub3QgU0tfU0VBUkNITlVMTCkga2V5 IGltcGxpZXMgYSBOT1QgTlVMTCBxdWFsaWZpZXIuCiAJICogSWYgdGhlIGluZGV4IHN0b3JlcyBu dWxscyBhdCB0aGUgZW5kIG9mIHRoZSBpbmRleCB3ZSdsbCBiZSBzdGFydGluZwogCSAqIGZyb20s IGFuZCB3ZSBoYXZlIG5vIGJvdW5kYXJ5IGtleSBmb3IgdGhlIGNvbHVtbiAod2hpY2ggbWVhbnMg dGhlIGtleQpAQCAtMTUzNyw5ICsxNTQxLDggQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJQlRQYWdlT3Bh cXVlIG9wYXF1ZTsKIAlPZmZzZXROdW1iZXIgbWlub2ZmOwogCU9mZnNldE51bWJlciBtYXhvZmY7 CisJQlRSZWFkUGFnZVN0YXRlIHBzdGF0ZTsKIAlpbnQJCQlpdGVtSW5kZXg7Ci0JYm9vbAkJY29u dGludWVzY2FuOwotCWludAkJCWluZG5hdHRzOwogCWJvb2wJCXJlcXVpcmVkTWF0Y2hlZEJ5UHJl Y2hlY2s7CiAKIAkvKgpAQCAtMTU2MCw4ICsxNTYzLDExIEBAIF9idF9yZWFkcGFnZShJbmRleFNj YW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJ X2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgQnVmZmVyR2V0QmxvY2tOdW1iZXIoc28tPmN1cnJQ b3MuYnVmKSk7CiAJfQogCi0JY29udGludWVzY2FuID0gdHJ1ZTsJCS8qIGRlZmF1bHQgYXNzdW1w dGlvbiAqLwotCWluZG5hdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mQXR0cmlidXRlcyhz Y2FuLT5pbmRleFJlbGF0aW9uKTsKKwlwc3RhdGUuZGlyID0gZGlyOworCXBzdGF0ZS5oaWdoa2V5 ID0gTlVMTDsKKwlwc3RhdGUuY29udGludWVzY2FuID0gdHJ1ZTsgLyogZGVmYXVsdCBhc3N1bXB0 aW9uICovCisJcHN0YXRlLmhpZ2hrZXljaGVja2VkID0gZmFsc2U7CisKIAltaW5vZmYgPSBQX0ZJ UlNUREFUQUtFWShvcGFxdWUpOwogCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIocGFn ZSk7CiAKQEAgLTE2MDksOSArMTYxNSwxMSBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkgKiB0aGUgbGFz dCBpdGVtIG9uIHRoZSBwYWdlIHdvdWxkIGdpdmUgYSBtb3JlIHByZWNpc2UgYW5zd2VyLgogCSAq CiAJICogV2Ugc2tpcCB0aGlzIGZvciB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgc2NhbiB0byBldmFk ZSB0aGUgcG9zc2libGUKLQkgKiBzbG93ZG93biBvZiB0aGUgcG9pbnQgcXVlcmllcy4KKwkgKiBz bG93ZG93biBvZiB0aGUgcG9pbnQgcXVlcmllcy4gIERvIHRoZSBzYW1lIHdpdGggc2NhbnMgd2l0 aCBhcnJheSBrZXlzLAorCSAqIHNpbmNlIHRoYXQgbWFrZXMgdGhlIG9wdGltaXphdGlvbiB1bnNh ZmUgKG91ciBzZWFyY2gtdHlwZSBzY2FuIGtleXMgY2FuCisJICogY2hhbmdlIGR1cmluZyBhbnkg Y2FsbCB0byBfYnRfY2hlY2trZXlzIHdoZW5ldmVyIGFycmF5IGtleXMgYXJlIHVzZWQpLgogCSAq LwotCWlmICghc28tPmZpcnN0UGFnZSAmJiBtaW5vZmYgPCBtYXhvZmYpCisJaWYgKCFzby0+Zmly c3RQYWdlICYmIG1pbm9mZiA8IG1heG9mZiAmJiAhc28tPm51bUFycmF5S2V5cykKIAl7CiAJCUl0 ZW1JZAkJaWlkOwogCQlJbmRleFR1cGxlCWl0dXA7CkBAIC0xNjI1LDggKzE2MzMsOSBAQCBfYnRf cmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVt YmVyIG9mZm51bSkKIAkJICogc2V0IGZsYWcgdG8gdHJ1ZSBpZiBhbGwgcmVxdWlyZWQga2V5cyBh cmUgc2F0aXNmaWVkIGFuZCBmYWxzZQogCQkgKiBvdGhlcndpc2UuCiAJCSAqLwotCQkodm9pZCkg X2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGlyLAotCQkJCQkJCSAmcmVxdWly ZWRNYXRjaGVkQnlQcmVjaGVjaywgZmFsc2UpOworCQlfYnRfY2hlY2trZXlzKHNjYW4sICZwc3Rh dGUsIGl0dXAsIGZhbHNlLCBmYWxzZSk7CisJCXJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2sgPSBw c3RhdGUuY29udGludWVzY2FuOworCQlwc3RhdGUuY29udGludWVzY2FuID0gdHJ1ZTsgLyogcmVz ZXQgKi8KIAl9CiAJZWxzZQogCXsKQEAgLTE2MzYsNiArMTY0NSwxNCBAQCBfYnRfcmVhZHBhZ2Uo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51 bSkKIAogCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCiAJeworCQkvKiBTS19TRUFS Q0hBUlJBWSBzY2FucyBtdXN0IHByb3ZpZGUgaGlnaCBrZXkgdXAgZnJvbnQgKi8KKwkJaWYgKHNv LT5udW1BcnJheUtleXMgJiYgIVBfUklHSFRNT1NUKG9wYXF1ZSkpCisJCXsKKwkJCUl0ZW1JZAkJ aWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJS0VZKTsKKworCQkJcHN0YXRlLmhpZ2hrZXkg PSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJfQorCiAJCS8qIGxvYWQg aXRlbXNbXSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KIAkJaXRlbUluZGV4ID0gMDsKIApAQCAtMTY1 OSw4ICsxNjc2LDggQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAKIAkJCWl0dXAgPSAoSW5kZXhUdXBsZSkg UGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKIAotCQkJcGFzc2VzX3F1YWxzID0gX2J0X2NoZWNra2V5 cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGlyLAotCQkJCQkJCQkJCSAmY29udGludWVzY2FuLCBy ZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKKwkJCXBhc3Nlc19xdWFscyA9IF9idF9jaGVja2tl eXMoc2NhbiwgJnBzdGF0ZSwgaXR1cCwgZmFsc2UsCisJCQkJCQkJCQkJIHJlcXVpcmVkTWF0Y2hl ZEJ5UHJlY2hlY2spOwogCiAJCQkvKgogCQkJICogSWYgdGhlIHJlc3VsdCBvZiBwcmVjaGVja2lu ZyByZXF1aXJlZCBrZXlzIHdhcyB0cnVlLCB0aGVuIGluCkBAIC0xNjY4LDggKzE2ODUsOCBAQCBf YnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0 TnVtYmVyIG9mZm51bSkKIAkJCSAqIHJlc3VsdCBpcyB0aGUgc2FtZS4KIAkJCSAqLwogCQkJQXNz ZXJ0KCFyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrIHx8Ci0JCQkJICAgcGFzc2VzX3F1YWxzID09 IF9idF9jaGVja2tleXMoc2NhbiwgaXR1cCwgaW5kbmF0dHMsIGRpciwKLQkJCQkJCQkJCQkJCSAm Y29udGludWVzY2FuLCBmYWxzZSkpOworCQkJCSAgIHBhc3Nlc19xdWFscyA9PSBfYnRfY2hlY2tr ZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIGZhbHNlLAorCQkJCQkJCQkJCQkJIGZhbHNlKSk7CiAJ CQlpZiAocGFzc2VzX3F1YWxzKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBr ZXkgY29uZGl0aW9ucyAqLwpAQCAtMTcwMyw3ICsxNzIwLDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ CQkJfQogCQkJfQogCQkJLyogV2hlbiAhY29udGludWVzY2FuLCB0aGVyZSBjYW4ndCBiZSBhbnkg bW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCi0JCQlpZiAoIWNvbnRpbnVlc2NhbikKKwkJCWlmICgh cHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCQlicmVhazsKIAogCQkJb2ZmbnVtID0gT2Zmc2V0TnVt YmVyTmV4dChvZmZudW0pOwpAQCAtMTcyMCwxNyArMTczNywyMyBAQCBfYnRfcmVhZHBhZ2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkK IAkJICogb25seSBhcHBlYXIgb24gbm9uLXBpdm90IHR1cGxlcyBvbiB0aGUgcmlnaHQgc2libGlu ZyBwYWdlIGFyZQogCQkgKiBjb21tb24uCiAJCSAqLwotCQlpZiAoY29udGludWVzY2FuICYmICFQ X1JJR0hUTU9TVChvcGFxdWUpKQorCQlpZiAocHN0YXRlLmNvbnRpbnVlc2NhbiAmJiAhUF9SSUdI VE1PU1Qob3BhcXVlKSkKIAkJewotCQkJSXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2Us IFBfSElLRVkpOwotCQkJSW5kZXhUdXBsZQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVt KHBhZ2UsIGlpZCk7Ci0JCQlpbnQJCQl0cnVuY2F0dDsKKwkJCUluZGV4VHVwbGUJaXR1cDsKIAot CQkJdHJ1bmNhdHQgPSBCVHJlZVR1cGxlR2V0TkF0dHMoaXR1cCwgc2Nhbi0+aW5kZXhSZWxhdGlv bik7Ci0JCQlfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAsIHRydW5jYXR0LCBkaXIsICZjb250aW51 ZXNjYW4sIGZhbHNlKTsKKwkJCWlmIChwc3RhdGUuaGlnaGtleSkKKwkJCQlpdHVwID0gcHN0YXRl LmhpZ2hrZXk7CisJCQllbHNlCisJCQl7CisJCQkJSXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlk KHBhZ2UsIFBfSElLRVkpOworCisJCQkJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShw YWdlLCBpaWQpOworCQkJfQorCisJCQlfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAs IHRydWUsIGZhbHNlKTsKIAkJfQogCi0JCWlmICghY29udGludWVzY2FuKQorCQlpZiAoIXBzdGF0 ZS5jb250aW51ZXNjYW4pCiAJCQlzby0+Y3VyclBvcy5tb3JlUmlnaHQgPSBmYWxzZTsKIAogCQlB c3NlcnQoaXRlbUluZGV4IDw9IE1heFRJRHNQZXJCVHJlZVBhZ2UpOwpAQCAtMTc1MSw2ICsxNzc0 LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0pCiAJCQlJbmRleFR1cGxlCWl0dXA7CiAJCQlib29sCQl0dXBs ZV9hbGl2ZTsKIAkJCWJvb2wJCXBhc3Nlc19xdWFsczsKKwkJCWJvb2wJCWZpbmFsdHVwID0gKG9m Zm51bSA9PSBtaW5vZmYpOwogCiAJCQkvKgogCQkJICogSWYgdGhlIHNjYW4gc3BlY2lmaWVzIG5v dCB0byByZXR1cm4ga2lsbGVkIHR1cGxlcywgdGhlbiB3ZQpAQCAtMTc2MSwxMiArMTc4NSwxOCBA QCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zm c2V0TnVtYmVyIG9mZm51bSkKIAkJCSAqIHR1cGxlIG9uIHRoZSBwYWdlLCB3ZSBkbyBjaGVjayB0 aGUgaW5kZXgga2V5cywgdG8gcHJldmVudAogCQkJICogdXNlbGVzc2x5IGFkdmFuY2luZyB0byB0 aGUgcGFnZSB0byB0aGUgbGVmdC4gIFRoaXMgaXMgc2ltaWxhcgogCQkJICogdG8gdGhlIGhpZ2gg a2V5IG9wdGltaXphdGlvbiB1c2VkIGJ5IGZvcndhcmQgc2NhbnMuCisJCQkgKgorCQkJICogU2Vw YXJhdGVseSwgX2J0X2NoZWNra2V5cyBhY3R1YWxseSByZXF1aXJlcyB0aGF0IHdlIGNhbGwgaXQK KwkJCSAqIHdpdGggdGhlIGZpbmFsIG5vbi1waXZvdCB0dXBsZSBmcm9tIHRoZSBwYWdlLCBpZiB0 aGVyZSdzIG9uZQorCQkJICogKGZpbmFsIHByb2Nlc3NlZCB0dXBsZSwgb3IgZmlyc3QgdHVwbGUg aW4gb2Zmc2V0IG51bWJlciB0ZXJtcykuCisJCQkgKiBXZSBtdXN0IGluZGljYXRlIHdoaWNoIHBh cnRpY3VsYXIgdHVwbGUgY29tZXMgbGFzdCwgdG9vLgogCQkJICovCiAJCQlpZiAoc2Nhbi0+aWdu b3JlX2tpbGxlZF90dXBsZXMgJiYgSXRlbUlkSXNEZWFkKGlpZCkpCiAJCQl7CiAJCQkJQXNzZXJ0 KG9mZm51bSA+PSBQX0ZJUlNUREFUQUtFWShvcGFxdWUpKTsKLQkJCQlpZiAob2ZmbnVtID4gUF9G SVJTVERBVEFLRVkob3BhcXVlKSkKKwkJCQlpZiAoIWZpbmFsdHVwKQogCQkJCXsKKwkJCQkJQXNz ZXJ0KG9mZm51bSA+IG1pbm9mZik7CiAJCQkJCW9mZm51bSA9IE9mZnNldE51bWJlclByZXYob2Zm bnVtKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQpAQCAtMTc3OCw4ICsxODA4LDggQEAgX2J0X3Jl YWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJl ciBvZmZudW0pCiAKIAkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlk KTsKIAotCQkJcGFzc2VzX3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0 cywgZGlyLAotCQkJCQkJCQkJCSAmY29udGludWVzY2FuLCByZXF1aXJlZE1hdGNoZWRCeVByZWNo ZWNrKTsKKwkJCXBhc3Nlc19xdWFscyA9IF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgaXR1 cCwgZmluYWx0dXAsCisJCQkJCQkJCQkJIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwogCiAJ CQkvKgogCQkJICogSWYgdGhlIHJlc3VsdCBvZiBwcmVjaGVja2luZyByZXF1aXJlZCBrZXlzIHdh cyB0cnVlLCB0aGVuIGluCkBAIC0xNzg3LDggKzE4MTcsOCBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJ CSAqIHJlc3VsdCBpcyB0aGUgc2FtZS4KIAkJCSAqLwogCQkJQXNzZXJ0KCFyZXF1aXJlZE1hdGNo ZWRCeVByZWNoZWNrIHx8Ci0JCQkJICAgcGFzc2VzX3F1YWxzID09IF9idF9jaGVja2tleXMoc2Nh biwgaXR1cCwgaW5kbmF0dHMsIGRpciwKLQkJCQkJCQkJCQkJCSAmY29udGludWVzY2FuLCBmYWxz ZSkpOworCQkJCSAgIHBhc3Nlc19xdWFscyA9PSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUs IGl0dXAsCisJCQkJCQkJCQkJCQkgZmluYWx0dXAsIGZhbHNlKSk7CiAJCQlpZiAocGFzc2VzX3F1 YWxzICYmIHR1cGxlX2FsaXZlKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBr ZXkgY29uZGl0aW9ucyAqLwpAQCAtMTgyNyw3ICsxODU3LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ CQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoIWNvbnRpbnVlc2NhbikKKwkJCWlmICghcHN0YXRl LmNvbnRpbnVlc2NhbikKIAkJCXsKIAkJCQkvKiB0aGVyZSBjYW4ndCBiZSBhbnkgbW9yZSBtYXRj aGVzLCBzbyBzdG9wICovCiAJCQkJc28tPmN1cnJQb3MubW9yZUxlZnQgPSBmYWxzZTsKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwppbmRleCAxNTEwYjk3ZmIuLjdhZGY3NmUxMiAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnR1dGlscy5jCisrKyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwpAQCAtMzMsNyArMzMsNyBAQAogCiB0eXBl ZGVmIHN0cnVjdCBCVFNvcnRBcnJheUNvbnRleHQKIHsKLQlGbWdySW5mbwlmbGluZm87CisJRm1n ckluZm8gICAqb3JkZXJwcm9jOwogCU9pZAkJCWNvbGxhdGlvbjsKIAlib29sCQlyZXZlcnNlOwog fSBCVFNvcnRBcnJheUNvbnRleHQ7CkBAIC00MSwxNSArNDEsMzUgQEAgdHlwZWRlZiBzdHJ1Y3Qg QlRTb3J0QXJyYXlDb250ZXh0CiBzdGF0aWMgRGF0dW0gX2J0X2ZpbmRfZXh0cmVtZV9lbGVtZW50 KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5LAogCQkJCQkJCQkJICBTdHJhdGVneU51 bWJlciBzdHJhdCwKIAkJCQkJCQkJCSAgRGF0dW0gKmVsZW1zLCBpbnQgbmVsZW1zKTsKK3N0YXRp YyB2b2lkIF9idF9zb3J0X2NtcF9mdW5jX3NldHVwKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nhbktl eSBza2V5KTsKIHN0YXRpYyBpbnQJX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJCQkJCQkJCQlib29sIHJldmVyc2UsCiAJCQkJCQkJCQlE YXR1bSAqZWxlbXMsIGludCBuZWxlbXMpOwogc3RhdGljIGludAlfYnRfY29tcGFyZV9hcnJheV9l bGVtZW50cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICphcmcpOworc3RhdGlj IGlubGluZSBpbnQzMiBfYnRfY29tcGFyZV9hcnJheV9za2V5KFNjYW5LZXkgY3VyLCBGbWdySW5m byAqb3JkZXJwcm9jLAorCQkJCQkJCQkJCSAgIERhdHVtIGRhdHVtLCBib29sIG51bGwsCisJCQkJ CQkJCQkJICAgRGF0dW0gYXJyZGF0dW0pOworc3RhdGljIGludAlfYnRfYmluc3JjaF9hcnJheV9z a2V5KFNjYW5EaXJlY3Rpb24gZGlyLCBib29sIGN1cl9lbGVtX3N0YXJ0LAorCQkJCQkJCQkgICBC VEFycmF5S2V5SW5mbyAqYXJyYXksIFNjYW5LZXkgY3VyLAorCQkJCQkJCQkgICBGbWdySW5mbyAq b3JkZXJwcm9jLCBEYXR1bSBkYXR1bSwgYm9vbCBudWxsLAorCQkJCQkJCQkgICBpbnQzMiAqZmlu YWxfcmVzdWx0KTsKK3N0YXRpYyBib29sIF9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMoSW5k ZXhTY2FuRGVzYyBzY2FuLAorCQkJCQkJCQkJCSBCVFJlYWRQYWdlU3RhdGUgKnBzdGF0ZSwKKwkJ CQkJCQkJCQkgSW5kZXhUdXBsZSB0dXBsZSk7CitzdGF0aWMgYm9vbCBfYnRfYWR2YW5jZV9hcnJh eV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJ CQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgc2tyZXF1aXJlZHRyaWdnZXIpOworc3RhdGlj IGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuRGlyZWN0aW9uIGRpcik7CitzdGF0aWMgdm9pZCBfYnRfYWR2YW5jZV9hcnJheV9rZXlz X3RvX2VuZChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyB2 b2lkIF9idF9wcmVwcm9jZXNzX2tleXNfbGVhZmJ1ZihJbmRleFNjYW5EZXNjIHNjYW4pOwogc3Rh dGljIGJvb2wgX2J0X2NvbXBhcmVfc2NhbmtleV9hcmdzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bktleSBvcCwKIAkJCQkJCQkJCSBTY2FuS2V5IGxlZnRhcmcsIFNjYW5LZXkgcmlnaHRhcmcsCiAJ CQkJCQkJCQkgYm9vbCAqcmVzdWx0KTsKIHN0YXRpYyBib29sIF9idF9maXhfc2NhbmtleV9zdHJh dGVneShTY2FuS2V5IHNrZXksIGludDE2ICppbmRvcHRpb24pOwogc3RhdGljIHZvaWQgX2J0X21h cmtfc2NhbmtleV9yZXF1aXJlZChTY2FuS2V5IHNrZXkpOworc3RhdGljIGJvb2wgX2J0X2NoZWNr X2NvbXBhcmUoU2NhbkRpcmVjdGlvbiBkaXIsIEJUU2Nhbk9wYXF1ZSBzbywKKwkJCQkJCQkgIElu ZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJCQkJ ICBib29sICpjb250aW51ZXNjYW4sIGJvb2wgKnNrcmVxdWlyZWR0cmlnZ2VyLAorCQkJCQkJCSAg Ym9vbCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKIHN0YXRpYyBib29sIF9idF9jaGVja19y b3djb21wYXJlKFNjYW5LZXkgc2tleSwKIAkJCQkJCQkJIEluZGV4VHVwbGUgdHVwbGUsIGludCB0 dXBuYXR0cywgVHVwbGVEZXNjIHR1cGRlc2MsCiAJCQkJCQkJCSBTY2FuRGlyZWN0aW9uIGRpciwg Ym9vbCAqY29udGludWVzY2FuKTsKQEAgLTIwMiw2ICsyMjIsMTEgQEAgX2J0X2ZyZWVzdGFjayhC VFN0YWNrIHN0YWNrKQogICogYXJyYXkga2V5cywgaXQncyBzdWZmaWNpZW50IHRvIGZpbmQgdGhl IGV4dHJlbWUgZWxlbWVudCB2YWx1ZSBhbmQgcmVwbGFjZQogICogdGhlIHdob2xlIGFycmF5IHdp dGggdGhhdCBzY2FsYXIgdmFsdWUuCiAgKgorICogSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBudW1i ZXIgb2YgcHJpbWl0aXZlIGluZGV4IHNjYW5zIHdpbGwgZXF1YWwgdGhlCisgKiBudW1iZXIgb2Yg YXJyYXkgZWxlbWVudHMgKG9yIHRoZSBwcm9kdWN0IG9mIHRoZSBudW1iZXIgb2YgYXJyYXkga2V5 cyB3aGVuCisgKiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJyYXlzL2NvbHVtbnMgaW52b2x2ZWQpLiAg SXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlCisgKiB0b3RhbCBudW1iZXIgb2YgcHJpbWl0aXZl IGluZGV4IHNjYW5zIHdpbGwgYmUgZmFyIGxlc3MgdGhhbiB0aGF0LgorICoKICAqIE5vdGU6IHRo ZSByZWFzb24gd2UgbmVlZCBzby0+YXJyYXlLZXlEYXRhLCByYXRoZXIgdGhhbiBqdXN0IHNjcmli YmxpbmcKICAqIG9uIHNjYW4tPmtleURhdGEsIGlzIHRoYXQgY2FsbGVycyBhcmUgcGVybWl0dGVk IHRvIGNhbGwgYnRyZXNjYW4gd2l0aG91dAogICogc3VwcGx5aW5nIGEgbmV3IHNldCBvZiBzY2Fu a2V5IGRhdGEuCkBAIC0yMTIsNiArMjM3LDcgQEAgX2J0X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJ bmRleFNjYW5EZXNjIHNjYW4pCiAJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nh bi0+b3BhcXVlOwogCWludAkJCW51bWJlck9mS2V5cyA9IHNjYW4tPm51bWJlck9mS2V5czsKIAlp bnQxNgkgICAqaW5kb3B0aW9uID0gc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kb3B0aW9uOwor CWludDE2CQlua2V5YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMo c2Nhbi0+aW5kZXhSZWxhdGlvbik7CiAJaW50CQkJbnVtQXJyYXlLZXlzOwogCVNjYW5LZXkJCWN1 cjsKIAlpbnQJCQlpOwpAQCAtMjY1LDYgKzI5MSw3IEBAIF9idF9wcmVwcm9jZXNzX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCiAJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHBlci1hcnJh eSBkYXRhIGluIHRoZSB3b3Jrc3BhY2UgY29udGV4dCAqLwogCXNvLT5hcnJheUtleXMgPSAoQlRB cnJheUtleUluZm8gKikgcGFsbG9jMChudW1BcnJheUtleXMgKiBzaXplb2YoQlRBcnJheUtleUlu Zm8pKTsKKwlzby0+b3JkZXJQcm9jcyA9IChGbWdySW5mbyAqKSBwYWxsb2MwKG5rZXlhdHRzICog c2l6ZW9mKEZtZ3JJbmZvKSk7CiAKIAkvKiBOb3cgcHJvY2VzcyBlYWNoIGFycmF5IGtleSAqLwog CW51bUFycmF5S2V5cyA9IDA7CkBAIC0yODEsNiArMzA4LDE2IEBAIF9idF9wcmVwcm9jZXNzX2Fy cmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCQlpbnQJCQlqOwogCiAJCWN1ciA9ICZzby0+ YXJyYXlLZXlEYXRhW2ldOworCisJCS8qCisJCSAqIEF0dHJpYnV0ZXMgd2l0aCBlcXVhbGl0eS10 eXBlIHNjYW4ga2V5cyAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZAorCQkgKiB0byBhcnJheSBz Y2FuIGtleXMpIHdpbGwgbmVlZCBhIDMtd2F5IGNvbXBhcmlzb24gZnVuY3Rpb24uICAgU2V0CisJ CSAqIHRoYXQgdXAgbm93LiAgKEF2b2lkcyByZXBlYXRpbmcgd29yayBmb3IgdGhlIHNhbWUgYXR0 cmlidXRlLikKKwkJICovCisJCWlmIChjdXItPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxTdHJhdGVn eU51bWJlciAmJgorCQkJIU9pZElzVmFsaWQoc28tPm9yZGVyUHJvY3NbY3VyLT5za19hdHRubyAt IDFdLmZuX29pZCkpCisJCQlfYnRfc29ydF9jbXBfZnVuY19zZXR1cChzY2FuLCBjdXIpOworCiAJ CWlmICghKGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkpCiAJCQljb250aW51ZTsKIApA QCAtNDM2LDYgKzQ3Myw0MiBAQCBfYnRfZmluZF9leHRyZW1lX2VsZW1lbnQoSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoKKyAqIExvb2sg dXAgdGhlIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFtaWx5Lgor ICoKKyAqIE5vdGU6IGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHdvdWxkIGZhaWwsIGlmIHRoZSBv cGZhbWlseSBpcyBpbmNvbXBsZXRlLAorICogYnV0IGl0IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRo YXQgYW4gb3BmYW1pbHkgd291bGQgb21pdCBub24tY3Jvc3MtdHlwZQorICogc3VwcG9ydCBmdW5j dGlvbnMgZm9yIGFueSBkYXRhdHlwZSB0aGF0IGl0IHN1cHBvcnRzIGF0IGFsbC4KKyAqLworc3Rh dGljIHZvaWQKK19idF9zb3J0X2NtcF9mdW5jX3NldHVwKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bktleSBza2V5KQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9w YXF1ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOworCU9pZAkJCWVsZW10 eXBlOworCVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsKKwlGbWdySW5mbyAgICpvcmRlcnByb2MgPSAm c28tPm9yZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8gLSAxXTsKKworCS8qCisJICogRGV0ZXJtaW5l IHRoZSBub21pbmFsIGRhdGF0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4gIFdlIGhhdmUgdG8K KwkgKiBzdXBwb3J0IHRoZSBjb252ZW50aW9uIHRoYXQgc2tfc3VidHlwZSA9PSBJbnZhbGlkT2lk IG1lYW5zIHRoZSBvcGNsYXNzCisJICogaW5wdXQgdHlwZTsgdGhpcyBpcyBhIGhhY2sgdG8gc2lt cGxpZnkgbGlmZSBmb3IgU2NhbktleUluaXQoKS4KKwkgKi8KKwllbGVtdHlwZSA9IHNrZXktPnNr X3N1YnR5cGU7CisJaWYgKGVsZW10eXBlID09IEludmFsaWRPaWQpCisJCWVsZW10eXBlID0gcmVs LT5yZF9vcGNpbnR5cGVbc2tleS0+c2tfYXR0bm8gLSAxXTsKKworCWNtcF9wcm9jID0gZ2V0X29w ZmFtaWx5X3Byb2MocmVsLT5yZF9vcGZhbWlseVtza2V5LT5za19hdHRubyAtIDFdLAorCQkJCQkJ CQkgcmVsLT5yZF9vcGNpbnR5cGVbc2tleS0+c2tfYXR0bm8gLSAxXSwKKwkJCQkJCQkJIGVsZW10 eXBlLAorCQkJCQkJCQkgQlRPUkRFUl9QUk9DKTsKKwlpZiAoIVJlZ1Byb2NlZHVyZUlzVmFsaWQo Y21wX3Byb2MpKQorCQllbG9nKEVSUk9SLCAibWlzc2luZyBzdXBwb3J0IGZ1bmN0aW9uICVkKCV1 LCV1KSBpbiBvcGZhbWlseSAldSIsCisJCQkgQlRPUkRFUl9QUk9DLCBlbGVtdHlwZSwgZWxlbXR5 cGUsCisJCQkgcmVsLT5yZF9vcGZhbWlseVtza2V5LT5za19hdHRubyAtIDFdKTsKKwlmbWdyX2lu Zm9fY3h0KGNtcF9wcm9jLCBvcmRlcnByb2MsIHNvLT5hcnJheUNvbnRleHQpOworfQorCiAvKgog ICogX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoKSAtLSBzb3J0IGFuZCBkZS1kdXAgYXJyYXkgZWxl bWVudHMKICAqCkBAIC00NTAsNDIgKzUyMywxNCBAQCBfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJ bmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKIAkJCQkJCWJvb2wgcmV2ZXJzZSwKIAkJ CQkJCURhdHVtICplbGVtcywgaW50IG5lbGVtcykKIHsKLQlSZWxhdGlvbglyZWwgPSBzY2FuLT5p bmRleFJlbGF0aW9uOwotCU9pZAkJCWVsZW10eXBlOwotCVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsK KwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJQlRTb3J0 QXJyYXlDb250ZXh0IGN4dDsKIAogCWlmIChuZWxlbXMgPD0gMSkKIAkJcmV0dXJuIG5lbGVtczsJ CQkvKiBubyB3b3JrIHRvIGRvICovCiAKLQkvKgotCSAqIERldGVybWluZSB0aGUgbm9taW5hbCBk YXRhdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuICBXZSBoYXZlIHRvCi0JICogc3VwcG9ydCB0 aGUgY29udmVudGlvbiB0aGF0IHNrX3N1YnR5cGUgPT0gSW52YWxpZE9pZCBtZWFucyB0aGUgb3Bj bGFzcwotCSAqIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBoYWNrIHRvIHNpbXBsaWZ5IGxpZmUgZm9y IFNjYW5LZXlJbml0KCkuCi0JICovCi0JZWxlbXR5cGUgPSBza2V5LT5za19zdWJ0eXBlOwotCWlm IChlbGVtdHlwZSA9PSBJbnZhbGlkT2lkKQotCQllbGVtdHlwZSA9IHJlbC0+cmRfb3BjaW50eXBl W3NrZXktPnNrX2F0dG5vIC0gMV07Ci0KLQkvKgotCSAqIExvb2sgdXAgdGhlIGFwcHJvcHJpYXRl IGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFtaWx5LgotCSAqCi0JICogTm90ZTogaXQn cyBwb3NzaWJsZSB0aGF0IHRoaXMgd291bGQgZmFpbCwgaWYgdGhlIG9wZmFtaWx5IGlzCi0JICog aW5jb21wbGV0ZSwgYnV0IGl0IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRoYXQgYW4gb3BmYW1pbHkg d291bGQgb21pdAotCSAqIG5vbi1jcm9zcy10eXBlIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBhbnkg ZGF0YXR5cGUgdGhhdCBpdCBzdXBwb3J0cyBhdAotCSAqIGFsbC4KLQkgKi8KLQljbXBfcHJvYyA9 IGdldF9vcGZhbWlseV9wcm9jKHJlbC0+cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8gLSAxXSwK LQkJCQkJCQkJIGVsZW10eXBlLAotCQkJCQkJCQkgZWxlbXR5cGUsCi0JCQkJCQkJCSBCVE9SREVS X1BST0MpOwotCWlmICghUmVnUHJvY2VkdXJlSXNWYWxpZChjbXBfcHJvYykpCi0JCWVsb2coRVJS T1IsICJtaXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQoJXUsJXUpIGluIG9wZmFtaWx5ICV1IiwK LQkJCSBCVE9SREVSX1BST0MsIGVsZW10eXBlLCBlbGVtdHlwZSwKLQkJCSByZWwtPnJkX29wZmFt aWx5W3NrZXktPnNrX2F0dG5vIC0gMV0pOwotCiAJLyogU29ydCB0aGUgYXJyYXkgZWxlbWVudHMg Ki8KLQlmbWdyX2luZm8oY21wX3Byb2MsICZjeHQuZmxpbmZvKTsKKwljeHQub3JkZXJwcm9jID0g JnNvLT5vcmRlclByb2NzW3NrZXktPnNrX2F0dG5vIC0gMV07CiAJY3h0LmNvbGxhdGlvbiA9IHNr ZXktPnNrX2NvbGxhdGlvbjsKIAljeHQucmV2ZXJzZSA9IHJldmVyc2U7CiAJcXNvcnRfYXJnKGVs ZW1zLCBuZWxlbXMsIHNpemVvZihEYXR1bSksCkBAIC01MDcsNyArNTUyLDcgQEAgX2J0X2NvbXBh cmVfYXJyYXlfZWxlbWVudHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJn KQogCUJUU29ydEFycmF5Q29udGV4dCAqY3h0ID0gKEJUU29ydEFycmF5Q29udGV4dCAqKSBhcmc7 CiAJaW50MzIJCWNvbXBhcmU7CiAKLQljb21wYXJlID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNh bGwyQ29sbCgmY3h0LT5mbGluZm8sCisJY29tcGFyZSA9IERhdHVtR2V0SW50MzIoRnVuY3Rpb25D YWxsMkNvbGwoY3h0LT5vcmRlcnByb2MsCiAJCQkJCQkJCQkJCSAgY3h0LT5jb2xsYXRpb24sCiAJ CQkJCQkJCQkJCSAgZGEsIGRiKSk7CiAJaWYgKGN4dC0+cmV2ZXJzZSkKQEAgLTUxNSw2ICs1NjAs MTY3IEBAIF9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZv aWQgKmIsIHZvaWQgKmFyZykKIAlyZXR1cm4gY29tcGFyZTsKIH0KIAorLyoKKyAqIENvbXBhcmF0 b3IgdXNlcyB0byBzZWFyY2ggZm9yIHRoZSBuZXh0IGFycmF5IGVsZW1lbnQgd2hlbiBhcnJheSBr ZXlzIG5lZWQKKyAqIHRvIGJlIGFkdmFuY2VkIHZpYSBvbmUgb3IgbW9yZSBiaW5hcnkgc2VhcmNo ZXMKKyAqCisgKiBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiBfYnRfY29tcGFyZS4gIEhv d2V2ZXIsIHRoZXJlIGFyZSBzb21lCisgKiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMuCisgKgorICog SXQgaXMgY29udmVuaWVudCB0byB0aGluayBvZiBjYWxsaW5nIF9idF9jb21wYXJlIGFzIGNvbXBh cmluZyBjYWxsZXIncworICogaW5zZXJ0aW9uIHNjYW5rZXkgdG8gYW4gaW5kZXggdHVwbGUuICBC dXQgb3VyIGNhbGxlcnMgYXJlIG5vdCBzZWFyY2hpbmcKKyAqIHRocm91Z2ggdGhlIGluZGV4IGF0 IGFsbCAtLSB0aGV5J3JlIHNlYXJjaGluZyB0aHJvdWdoIGEgbG9jYWwgYXJyYXkgb2YKKyAqIGRh dHVtcyBhc3NvY2lhdGVkIHdpdGggYSBzY2FuIGtleSAodXNpbmcgdmFsdWVzIHRoZXkndmUgdGFr ZW4gZnJvbSBhbiBpbmRleAorICogdHVwbGUpLiAgVGhpcyBpcyBhIGNvbXBsZXRlIHJldmVyc2Fs IG9mIGhvdyB0aGluZ3MgdXN1YWxseSB3b3JrLCB3aGljaCBjYW4KKyAqIGJlIGNvbmZ1c2luZy4K KyAqCisgKiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHRoaW5rIG9mIGl0IGFzIGNv bXBhcmluZyAiZGF0dW0iIChhcyB3ZWxsCisgKiBhcyAibnVsbCIpIHRvICJhcnJkYXR1bSIuICBU aGlzIGlzIHRoZSBzYW1lIGFwcHJvYWNoIHRoYXQgX2J0X2NvbXBhcmUgdGFrZXMKKyAqIGluIHRo YXQgYm90aCBmdW5jdGlvbnMgY29tcGFyZSB0aGUgdmFsdWUgdGhhdCB0aGV5J3JlIHNlYXJjaGlu ZyBmb3IgdG8gb25lCisgKiBwYXJ0aWN1bGFyIGl0ZW0gdXNlZCBhcyBhIGJpbmFyeSBzZWFyY2gg cGl2b3QuICAoQnV0IGl0J3MgdGhlIHdyb25nIHdheQorICogYXJvdW5kIGlmIHlvdSB0aGluayBv ZiBpdCBhcyAidHVwbGUgdmFsdWVzIHZzIHNjYW4ga2V5IHZhbHVlcyIuICBTbyBkb24ndC4pCisq Lworc3RhdGljIGlubGluZSBpbnQzMgorX2J0X2NvbXBhcmVfYXJyYXlfc2tleShTY2FuS2V5IGN1 ciwKKwkJCQkJICAgRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJICAgRGF0dW0gZGF0dW0sCisJ CQkJCSAgIGJvb2wgbnVsbCwKKwkJCQkJICAgRGF0dW0gYXJyZGF0dW0pCit7CisJaW50MzIJCXJl c3VsdCA9IDA7CisKKwlBc3NlcnQoY3VyLT5za19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lO dW1iZXIpOworCisJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpCS8qIGFycmF5L3NjYW4g a2V5IGlzIE5VTEwgKi8KKwl7CisJCWlmIChudWxsKQorCQkJcmVzdWx0ID0gMDsJCQkvKiBOVUxM ICI9IiBOVUxMICovCisJCWVsc2UgaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9OVUxMU19GSVJT VCkKKwkJCXJlc3VsdCA9IDE7CQkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KKwkJZWxzZQorCQkJ cmVzdWx0ID0gLTE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLworCX0KKwllbHNlIGlmIChudWxs KQkJCQkvKiBhcnJheS9zY2FuIGtleSBpcyBOT1RfTlVMTCBhbmQgdHVwbGUgaXRlbQorCQkJCQkJ CQkgKiBpcyBOVUxMICovCisJeworCQlpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExTX0ZJ UlNUKQorCQkJcmVzdWx0ID0gLTE7CQkvKiBOT1RfTlVMTCAiPiIgTlVMTCAqLworCQllbHNlCisJ CQlyZXN1bHQgPSAxOwkJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCisJfQorCWVsc2UKKwl7CisJ CS8qCisJCSAqIExpa2UgX2J0X2NvbXBhcmUsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBjcm9z cy10eXBlIGNvbXBhcmlzb25zLAorCQkgKiBzbyB0aGUgbGVmdCB2YWx1ZSBoYXMgdG8gYmUgdGhl IHZhbHVlIHRoYXQgY2FtZSBmcm9tIGFuIGluZGV4CisJCSAqIHR1cGxlLiAgKEFycmF5IHNjYW4g a2V5cyBjYW5ub3QgYmUgY3Jvc3MtdHlwZSwgYnV0IG90aGVyIHJlcXVpcmVkCisJCSAqIHNjYW4g a2V5cyB0aGF0IHVzZSBhbiBlcXVhbCBvcGVyYXRvciBjYW4gYmUuKQorCQkgKi8KKwkJcmVzdWx0 ID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29sbChvcmRlcnByb2MsIGN1ci0+c2tfY29s bGF0aW9uLAorCQkJCQkJCQkJCQkJIGRhdHVtLCBhcnJkYXR1bSkpOworCisJCS8qCisJCSAqIFVu bGlrZSBfYnRfY29tcGFyZSwgd2UgZmxpcCB0aGUgc2lnbiB3aGVuIGNvbHVtbiBpcyBhIERFU0Mg Y29sdW1uCisJCSAqIChhbmQgKm5vdCogd2hlbiBjb2x1bW4gaXMgQVNDKS4gIFRoaXMgbWF0Y2hl cyB0aGUgYXBwcm9hY2ggdGFrZW4gYnkKKwkJICogX2J0X2NoZWNrX3Jvd2NvbXBhcmUsIHdoaWNo IHBlcmZvcm1zIHNpbWlsYXIgdGhyZWUtd2F5IGNvbXBhcmlzb25zLgorCQkgKi8KKwkJaWYgKGN1 ci0+c2tfZmxhZ3MgJiBTS19CVF9ERVNDKQorCQkJSU5WRVJUX0NPTVBBUkVfUkVTVUxUKHJlc3Vs dCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIF9idF9iaW5zcmNoX2FycmF5 X3NrZXkoKSAtLSBCaW5hcnkgc2VhcmNoIGZvciBuZXh0IG1hdGNoaW5nIGFycmF5IGtleQorICoK KyAqIGN1cl9lbGVtX3N0YXJ0IGluZGljYXRlcyBpZiB0aGUgYmluYXJ5IHNlYXJjaCBzaG91bGQg YmVnaW4gYXQgdGhlIGFycmF5J3MKKyAqIGN1cnJlbnQgZWxlbWVudCAob3IgaGF2ZSB0aGUgY3Vy cmVudCBlbGVtZW50IGFzIGFuIHVwcGVyIGJvdW5kIGlmIGl0J3MgYQorICogYmFja3dhcmQgc2Nh bikuICBUaGlzIGFsbG93cyBzZWFyY2hlcyBhZ2FpbnN0IHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5 cyB0bworICogcmV1c2UgdGhlIHdvcmsgb2YgZWFybGllciBzZWFyY2hlcywgYXQgbGVhc3QgaW4g bWFueSBpbXBvcnRhbnQgY2FzZXMuCisgKiBBcnJheSBrZXlzIGNvdmVyaW5nIGtleSBzcGFjZSB0 aGF0IHRoZSBpbmRleCBzY2FuIGFscmVhZHkgcHJvY2Vzc2VkIGNhbm5vdAorICogcG9zc2libHkg Y29udGFpbiBhbnkgbWF0Y2hlcy4KKyAqCisgKiBSZXR1cm5zIGFuIGluZGV4IHRvIHRoZSBmaXJz dCBhcnJheSBlbGVtZW50ID49IGNhbGxlcidzIGRhdHVtIGFyZ3VtZW50LgorICogQWxzbyBzZXRz ICpmaW5hbF9yZXN1bHQgdG8gd2hhdGV2ZXIgX2J0X2NvbXBhcmVfYXJyYXlfc2tleSByZXR1cm5l ZCB3aGVuIHdlCisgKiBkaXJlY3RseSBjb21wYXJlZCB0aGUgcmV0dXJuZWQgYXJyYXkgZWxlbWVu dCB0byBzZWFyY2hlZC1mb3IgZGF0dW0uCisgKi8KK3N0YXRpYyBpbnQKK19idF9iaW5zcmNoX2Fy cmF5X3NrZXkoU2NhbkRpcmVjdGlvbiBkaXIsIGJvb2wgY3VyX2VsZW1fc3RhcnQsCisJCQkJCSAg IEJUQXJyYXlLZXlJbmZvICphcnJheSwgU2NhbktleSBjdXIsCisJCQkJCSAgIEZtZ3JJbmZvICpv cmRlcnByb2MsIERhdHVtIGRhdHVtLCBib29sIG51bGwsCisJCQkJCSAgIGludDMyICpmaW5hbF9y ZXN1bHQpCit7CisJaW50CQkJbG93X2VsZW0sCisJCQkJaGlnaF9lbGVtLAorCQkJCWZpcnN0X2Vs ZW1fZGlyLAorCQkJCXJlc3VsdCA9IDA7CisJYm9vbAkJa25vd25lcXVhbCA9IGZhbHNlOworCisJ QXNzZXJ0KGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSk7CisJQXNzZXJ0KGN1ci0+c2tf c3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKTsKKworCWlmIChTY2FuRGlyZWN0aW9u SXNGb3J3YXJkKGRpcikpCisJeworCQlmaXJzdF9lbGVtX2RpciA9IDA7CisJCWxvd19lbGVtID0g YXJyYXktPmN1cl9lbGVtOworCQloaWdoX2VsZW0gPSBhcnJheS0+bnVtX2VsZW1zIC0gMTsKKwkJ aWYgKGN1cl9lbGVtX3N0YXJ0KQorCQkJbG93X2VsZW0gPSAwOworCX0KKwllbHNlCisJeworCQlm aXJzdF9lbGVtX2RpciA9IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQlsb3dfZWxlbSA9IDA7CisJ CWhpZ2hfZWxlbSA9IGFycmF5LT5jdXJfZWxlbTsKKwkJaWYgKGN1cl9lbGVtX3N0YXJ0KQorCQl7 CisJCQlsb3dfZWxlbSA9IDA7CisJCQloaWdoX2VsZW0gPSBmaXJzdF9lbGVtX2RpcjsKKwkJfQor CX0KKworCXdoaWxlIChoaWdoX2VsZW0gPiBsb3dfZWxlbSkKKwl7CisJCWludAkJCW1pZF9lbGVt ID0gbG93X2VsZW0gKyAoKGhpZ2hfZWxlbSAtIGxvd19lbGVtKSAvIDIpOworCQlEYXR1bQkJYXJy ZGF0dW0gPSBhcnJheS0+ZWxlbV92YWx1ZXNbbWlkX2VsZW1dOworCisJCXJlc3VsdCA9IF9idF9j b21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLCBhcnJkYXR1bSk7 CisKKwkJaWYgKHJlc3VsdCA9PSAwKQorCQl7CisJCQkvKgorCQkJICogRWFjaCBhcnJheSB3YXMg ZGVkdXBsaWNhdGVkIGR1cmluZyBpbml0aWFsIHByZXByb2Nlc3NpbmcsIHNvCisJCQkgKiB0aGF0 IGVhY2ggZWxlbWVudCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4gIFdlIGNhbiBxdWl0IGFz CisJCQkgKiBzb29uIGFzIHdlIHNlZSBhbiBlcXVhbCBhcnJheSwgc2F2aW5nIG91cnNlbHZlcyBh biBleHRyYQorCQkJICogY29tcGFyaXNvbiBvciB0d28uLi4KKwkJCSAqLworCQkJbG93X2VsZW0g PSBtaWRfZWxlbTsKKwkJCWtub3duZXF1YWwgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlp ZiAocmVzdWx0ID4gMCkKKwkJCWxvd19lbGVtID0gbWlkX2VsZW0gKyAxOworCQllbHNlCisJCQlo aWdoX2VsZW0gPSBtaWRfZWxlbTsKKwl9CisKKwkvKgorCSAqIC4uLmJ1dCBvdXIgY2FsbGVyIGFs c28gY2FyZXMgYWJvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWFyY2hlZC1mb3IKKwkgKiBkYXR1 bSByZWxhdGl2ZSB0byB0aGUgbG93X2VsZW0gbWF0Y2ggd2UnbGwgcmV0dXJuLiAgTWFrZSBzdXJl IHRoYXQgd2UKKwkgKiBzZXQgKmZpbmFsX3Jlc3VsdCB0byB0aGUgcmVzdWx0IHRoYXQgY29tZXMg ZnJvbSBjb21wYXJpbmcgbG93X2VsZW0ncworCSAqIGtleSB2YWx1ZSB0byB0aGUgZGF0dW0gdGhh dCBjYWxsZXIgaGFkIHVzIHNlYXJjaCBmb3IuCisJICovCisJaWYgKCFrbm93bmVxdWFsKQorCQly ZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9za2V5KGN1ciwgb3JkZXJwcm9jLCBkYXR1bSwgbnVs bCwKKwkJCQkJCQkJCQlhcnJheS0+ZWxlbV92YWx1ZXNbbG93X2VsZW1dKTsKKworCSpmaW5hbF9y ZXN1bHQgPSByZXN1bHQ7CisKKwlyZXR1cm4gbG93X2VsZW07Cit9CisKIC8qCiAgKiBfYnRfc3Rh cnRfYXJyYXlfa2V5cygpIC0tIEluaXRpYWxpemUgYXJyYXkga2V5cyBhdCBzdGFydCBvZiBhIHNj YW4KICAqCkBAIC01MzksNzYgKzc0NSw2IEBAIF9idF9zdGFydF9hcnJheV9rZXlzKEluZGV4U2Nh bkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCQljdXJBcnJheUtleS0+Y3VyX2VsZW0g PSAwOwogCQlza2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tjdXJB cnJheUtleS0+Y3VyX2VsZW1dOwogCX0KLQotCXNvLT5hcnJheXNTdGFydGVkID0gdHJ1ZTsKLX0K LQotLyoKLSAqIF9idF9hZHZhbmNlX2FycmF5X2tleXMoKSAtLSBBZHZhbmNlIHRvIG5leHQgc2V0 IG9mIGFycmF5IGVsZW1lbnRzCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFub3Ro ZXIgc2V0IG9mIHZhbHVlcyB0byBjb25zaWRlciwgZmFsc2UgaWYgbm90LgotICogT24gdHJ1ZSBy ZXN1bHQsIHRoZSBzY2Fua2V5cyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmV4dCBzZXQgb2Yg dmFsdWVzLgotICovCi1ib29sCi1fYnRfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCi17Ci0JQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9w YXF1ZSkgc2Nhbi0+b3BhcXVlOwotCWJvb2wJCWZvdW5kID0gZmFsc2U7Ci0JaW50CQkJaTsKLQot CS8qCi0JICogV2UgbXVzdCBhZHZhbmNlIHRoZSBsYXN0IGFycmF5IGtleSBtb3N0IHF1aWNrbHks IHNpbmNlIGl0IHdpbGwKLQkgKiBjb3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qtb3JkZXIgaW5kZXgg Y29sdW1uIGFtb25nIHRoZSBhdmFpbGFibGUKLQkgKiBxdWFsaWZpY2F0aW9ucy4gVGhpcyBpcyBu ZWNlc3NhcnkgdG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0Ci0JICogd2hlbiB0 aGVyZSBhcmUgbXVsdGlwbGUgYXJyYXkga2V5cy4KLQkgKi8KLQlmb3IgKGkgPSBzby0+bnVtQXJy YXlLZXlzIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCQlCVEFycmF5S2V5SW5mbyAqY3VyQXJyYXlL ZXkgPSAmc28tPmFycmF5S2V5c1tpXTsKLQkJU2NhbktleQkJc2tleSA9ICZzby0+YXJyYXlLZXlE YXRhW2N1ckFycmF5S2V5LT5zY2FuX2tleV07Ci0JCWludAkJCWN1cl9lbGVtID0gY3VyQXJyYXlL ZXktPmN1cl9lbGVtOwotCQlpbnQJCQludW1fZWxlbXMgPSBjdXJBcnJheUtleS0+bnVtX2VsZW1z OwotCi0JCWlmIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpKQotCQl7Ci0JCQlpZiAoLS1j dXJfZWxlbSA8IDApCi0JCQl7Ci0JCQkJY3VyX2VsZW0gPSBudW1fZWxlbXMgLSAxOwotCQkJCWZv dW5kID0gZmFsc2U7CS8qIG5lZWQgdG8gYWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLwotCQkJfQot CQkJZWxzZQotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgrK2N1 cl9lbGVtID49IG51bV9lbGVtcykKLQkJCXsKLQkJCQljdXJfZWxlbSA9IDA7Ci0JCQkJZm91bmQg PSBmYWxzZTsJLyogbmVlZCB0byBhZHZhbmNlIG5leHQgYXJyYXkga2V5ICovCi0JCQl9Ci0JCQll bHNlCi0JCQkJZm91bmQgPSB0cnVlOwotCQl9Ci0KLQkJY3VyQXJyYXlLZXktPmN1cl9lbGVtID0g Y3VyX2VsZW07Ci0JCXNrZXktPnNrX2FyZ3VtZW50ID0gY3VyQXJyYXlLZXktPmVsZW1fdmFsdWVz W2N1cl9lbGVtXTsKLQkJaWYgKGZvdW5kKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogYWR2YW5jZSBw YXJhbGxlbCBzY2FuICovCi0JaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKLQkJX2J0 X3BhcmFsbGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhzY2FuKTsKLQotCS8qCi0JICogV2hlbiBubyBu ZXcgYXJyYXkga2V5cyB3ZXJlIGZvdW5kLCB0aGUgc2NhbiBpcyAicGFzdCB0aGUgZW5kIiBvZiB0 aGUKLQkgKiBhcnJheSBrZXlzLiAgX2J0X3N0YXJ0X2FycmF5X2tleXMgY2FuIHN0aWxsICJyZXN0 YXJ0IiB0aGUgYXJyYXkga2V5cyBpZgotCSAqIGEgcmVzY2FuIGlzIHJlcXVpcmVkLgotCSAqLwot CWlmICghZm91bmQpCi0JCXNvLT5hcnJheXNTdGFydGVkID0gZmFsc2U7Ci0KLQlyZXR1cm4gZm91 bmQ7CiB9CiAKIC8qCkBAIC02NjEsMTMgKzc5Nyw4IEBAIF9idF9yZXN0b3JlX2FycmF5X2tleXMo SW5kZXhTY2FuRGVzYyBzY2FuKQogCSAqIElmIHdlIGNoYW5nZWQgYW55IGtleXMsIHdlIG11c3Qg cmVkbyBfYnRfcHJlcHJvY2Vzc19rZXlzLiAgVGhhdCBtaWdodAogCSAqIHNvdW5kIGxpa2Ugb3Zl cmtpbGwsIGJ1dCBpbiBjYXNlcyB3aXRoIG11bHRpcGxlIGtleXMgcGVyIGluZGV4IGNvbHVtbgog CSAqIGl0IHNlZW1zIG5lY2Vzc2FyeSB0byBkbyB0aGUgZnVsbCBzZXQgb2YgcHVzaHVwcy4KLQkg KgotCSAqIEFsc28gZG8gdGhpcyB3aGVuZXZlciB0aGUgc2NhbidzIHNldCBvZiBhcnJheSBrZXlz ICJ3cmFwcGVkIGFyb3VuZCIgYXQKLQkgKiB0aGUgZW5kIG9mIHRoZSBsYXN0IHByaW1pdGl2ZSBp bmRleCBzY2FuLiAgVGhlcmUgd29uJ3QgaGF2ZSBiZWVuIGEgY2FsbAotCSAqIHRvIF9idF9wcmVw cm9jZXNzX2tleXMgZnJvbSBzb21lIG90aGVyIHBsYWNlIGZvbGxvd2luZyB3cmFwIGFyb3VuZCwg c28KLQkgKiB3ZSBkbyBpdCBmb3Igb3Vyc2VsdmVzLgogCSAqLwotCWlmIChjaGFuZ2VkIHx8ICFz by0+YXJyYXlzU3RhcnRlZCkKKwlpZiAoY2hhbmdlZCkKIAl7CiAJCV9idF9wcmVwcm9jZXNzX2tl eXMoc2Nhbik7CiAJCS8qIFRoZSBtYXJrIHNob3VsZCBoYXZlIGJlZW4gc2V0IG9uIGEgY29uc2lz dGVudCBzZXQgb2Yga2V5cy4uLiAqLwpAQCAtNjc1LDYgKzgwNiw2OTQgQEAgX2J0X3Jlc3RvcmVf YXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJfQogfQogCisvKgorICogUm91dGluZSB0 byBkZXRlcm1pbmUgaWYgYSBjb250aW51ZXNjYW49ZmFsc2UgdHVwbGUgKHNldCB0aGF0IHdheSBi eSBhbgorICogaW5pdGlhbCBjYWxsIHRvIF9idF9jaGVja19jb21wYXJlKSBtaWdodCBuZWVkIHRv IGFkdmFuY2UgdGhlIHNjYW4ncyBhcnJheQorICoga2V5cy4KKyAqCisgKiBSZXR1cm5zIHRydWUg d2hlbiBjYWxsZXIgcGFzc2VzIGEgdHVwbGUgdGhhdCBpcyA8IHRoZSBjdXJyZW50IHNldCBvZiBh cnJheQorICoga2V5cyBmb3IgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLWVxdWFsIGNvbHVtbi9z Y2FuIGtleSAob3IgPiBmb3IgYmFja3dhcmRzCisgKiBzY2FucykuICBUaGlzIG1lYW5zIHRoYXQg aXQgY2Fubm90IHBvc3NpYmx5IGJlIHRpbWUgdG8gYWR2YW5jZSB0aGUgYXJyYXkKKyAqIGtleXMg anVzdCB5ZXQuICBfYnRfY2hlY2trZXlzIGNhbGxlciBzaG91bGQgc3VwcHJlc3MgaXRzIF9idF9j aGVja19jb21wYXJlCisgKiBjYWxsLCBhbmQgcmV0dXJuIC0tIHRoZSB0dXBsZSBpcyB0cmVhdGVk IGFzIG5vdCBzYXRpc2Z5IG91ciBpbmRleHF1YWxzLgorICoKKyAqIFJldHVybnMgZmFsc2Ugd2hl biBjYWxsZXIncyB0dXBsZSBpcyA+PSB0aGUgY3VycmVudCBhcnJheSBrZXlzIChvciA8PSwgaW4K KyAqIHRoZSBjYXNlIG9mIGJhY2t3YXJkcyBzY2FucykuICBUaGlzIG1lYW5zIHRoYXQgaXQgbWln aHQgYmUgdGltZSBmb3Igb3VyCisgKiBjYWxsZXIgdG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyB0 byB0aGUgbmV4dCBzZXQuCisgKgorICogTm90ZTogYWR2YW5jaW5nIHRoZSBhcnJheSBrZXlzIG1h eSBiZSByZXF1aXJlZCB3aGVuIGV2ZXJ5IGF0dHJpYnV0ZSB2YWx1ZQorICogZnJvbSBjYWxsZXIn cyB0dXBsZSBpcyBlcXVhbCB0byBjb3JyZXNwb25kaW5nIHNjYW4ga2V5L2FycmF5IGRhdHVtcy4g IFNlZQorICogY29tbWVudHMgYXQgdGhlIHN0YXJ0IG9mIF9idF9hZHZhbmNlX2FycmF5X2tleXMg Zm9yIG1vcmUuCisgKi8KK3N0YXRpYyBib29sCitfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlz KEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJIElu ZGV4VHVwbGUgdHVwbGUpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nh bi0+b3BhcXVlOworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247CisJU2NhbkRp cmVjdGlvbiBkaXIgPSBwc3RhdGUtPmRpcjsKKwlUdXBsZURlc2MJaXR1cGRlc2MgPSBSZWxhdGlv bkdldERlc2NyKHJlbCk7CisJYm9vbAkJdHVwbGVfYmVmb3JlX2FycmF5X2tleXMgPSBmYWxzZTsK KwlTY2FuS2V5CQljdXI7CisJaW50CQkJbnR1cGF0dHMgPSBCVHJlZVR1cGxlR2V0TkF0dHModHVw bGUsIHJlbCksCisJCQkJaWtleTsKKworCUFzc2VydChzby0+cXVhbF9vayk7CisJQXNzZXJ0KHNv LT5udW1BcnJheUtleXMgPiAwKTsKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+IDApOworCUFz c2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlEYXRhLCBpa2V5 ID0gMDsgaWtleSA8IHNvLT5udW1iZXJPZktleXM7IGN1cisrLCBpa2V5KyspCisJeworCQlpbnQJ CQlhdHRudW0gPSBjdXItPnNrX2F0dG5vOworCQlGbWdySW5mbyAgICpvcmRlcnByb2M7CisJCURh dHVtCQlkYXR1bTsKKwkJYm9vbAkJbnVsbCwKKwkJCQkJc2tyZXF1aXJlZDsKKwkJaW50MzIJCXJl c3VsdDsKKworCQkvKgorCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBlcXVhbGl0eSBzdHJhdGVneSBz Y2FuIGtleXMuICBXZSBsZWF2ZSBoYW5kbGluZworCQkgKiBvZiBpbmVxdWFsaXRpZXMgdXAgdG8g X2J0X2NoZWNrX2NvbXBhcmUuCisJCSAqLworCQlpZiAoY3VyLT5za19zdHJhdGVneSAhPSBCVEVx dWFsU3RyYXRlZ3lOdW1iZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUg aWYgdGhpcyBzY2FuIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBzY2FuCisJCSAqIGRp cmVjdGlvbgorCQkgKi8KKwkJc2tyZXF1aXJlZCA9ICgoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChk aXIpICYmCisJCQkJCSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRRldEKSkgfHwKKwkJCQkJ ICAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJgorCQkJCQkgICAoY3VyLT5za19mbGFn cyAmIFNLX0JUX1JFUUJLV0QpKSk7CisKKwkJLyoKKwkJICogVW5saWtlIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMsIHdlIG5ldmVyIGRlYWwgd2l0aCBhbnkgbm9uLXJlcXVpcmVkCisJCSAqIGFycmF5 IGtleXMuICBDYXNlcyB3aGVyZSBza3JlcXVpcmVkdHJpZ2dlciBpcyBzZXQgdG8gZmFsc2UgYnkK KwkJICogX2J0X2NoZWNrX2NvbXBhcmUgc2hvdWxkIG5ldmVyIGNhbGwgaGVyZS4gIFdlIGFyZSBv bmx5IGNhbGxlZCBhZnRlcgorCQkgKiBfYnRfY2hlY2tfY29tcGFyZSBwcm92aXNpb25hbGx5IGlu ZGljYXRlZCB0aGF0IHRoZSBzY2FuIHNob3VsZCBiZQorCQkgKiB0ZXJtaW5hdGVkIGR1ZSB0byBh IF9yZXF1aXJlZF8gc2NhbiBrZXkgbm90IGJlaW5nIHNhdGlzZmllZC4KKwkJICoKKwkJICogV2Ug ZXhwZWN0IF9idF9jaGVja19jb21wYXJlIHRvIG5vdGljZSBhbmQgcmVwb3J0IHJlcXVpcmVkIHNj YW4ga2V5cworCQkgKiBiZWZvcmUgbm9uLXJlcXVpcmVkIG9uZXMuICBfYnRfYWR2YW5jZV9hcnJh eV9rZXlzIG1pZ2h0IHN0aWxsIGhhdmUKKwkJICogdG8gYWR2YW5jZSBub24tcmVxdWlyZWQgYXJy YXkga2V5cyBpbiBwYXNzaW5nIGZvciBhIHR1cGxlIHRoYXQgd2UKKwkJICogd2VyZSBjYWxsZWQg Zm9yLCBidXQgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBkb2Vzbid0IHJlbHkgb24gdXMgdG8KKwkJ ICogZ2l2ZSBpdCBhZHZhbmNlZCBub3RpY2Ugb2YgdGhhdC4KKwkJICovCisJCWlmICghc2tyZXF1 aXJlZCkKKwkJCWJyZWFrOworCisJCWlmIChhdHRudW0gPiBudHVwYXR0cykKKwkJeworCQkJLyoK KwkJCSAqIFdoZW4gd2UgcmVhY2ggYSBoaWdoIGtleSdzIHRydW5jYXRlZCBhdHRyaWJ1dGUsIGFz c3VtZSB0aGF0IHRoZQorCQkJICogdHVwbGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgPj0gdGhlIHNj YW4ncyBzZWFyY2gtdHlwZSBzY2FuIGtleXMKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCQlk YXR1bSA9IGluZGV4X2dldGF0dHIodHVwbGUsIGF0dG51bSwgaXR1cGRlc2MsICZudWxsKTsKKwor CQlvcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3NbYXR0bnVtIC0gMV07CisJCXJlc3VsdCA9IF9i dF9jb21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2MsCisJCQkJCQkJCQkJZGF0dW0sIG51 bGwsCisJCQkJCQkJCQkJY3VyLT5za19hcmd1bWVudCk7CisKKwkJaWYgKHJlc3VsdCAhPSAwKQor CQl7CisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJCXR1cGxlX2JlZm9y ZV9hcnJheV9rZXlzID0gcmVzdWx0IDwgMDsKKwkJCWVsc2UKKwkJCQl0dXBsZV9iZWZvcmVfYXJy YXlfa2V5cyA9IHJlc3VsdCA+IDA7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHR1 cGxlX2JlZm9yZV9hcnJheV9rZXlzOworfQorCisvKgorICogX2J0X2FycmF5X2tleXNfcmVtYWlu KCkgLS0gU3RhcnQgYW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2Nhbj8KKyAqCisgKiBSZXR1cm5z IHRydWUgaWYgX2J0X2NoZWNra2V5cyBkZXRlcm1pbmVkIHRoYXQgYW5vdGhlciBwcmltaXRpdmUg aW5kZXggc2NhbgorICogbXVzdCB0YWtlIHBsYWNlIGJ5IGNhbGxpbmcgX2J0X2ZpcnN0LiAgT3Ro ZXJ3aXNlIHJldHVybnMgZmFsc2UsIGluZGljYXRpbmcKKyAqIHRoYXQgY2FsbGVyJ3MgdG9wLWxl dmVsIHNjYW4gaXMgbm93IHBhc3QgdGhlIHBvaW50IHdoZXJlIGZ1cnRoZXIgbWF0Y2hpbmcKKyAq IGluZGV4IHR1cGxlcyBjYW4gYmUgZm91bmQgKGZvciB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlv bikuCisgKgorICogT25seSBjYWxsIGhlcmUgZHVyaW5nIHNjYW5zIHdpdGggb25lIG9yIG1vcmUg ZXF1YWxpdHkgdHlwZSBhcnJheSBzY2FuIGtleXMuCisgKiBBbGwgb3RoZXIgc2NhbnMgc2hvdWxk IGp1c3QgY2FsbCBfYnRfZmlyc3Qgb25jZSwgbm8gbWF0dGVyIHdoYXQuCisgKgorICogVG9wLWxl dmVsIGluZGV4IHNjYW5zIGV4ZWN1dGVkIHZpYSBtdWx0aXBsZSBwcmltaXRpdmUgaW5kZXggc2Nh bnMgbXVzdCBub3QKKyAqIGZhaWwgdG8gb3V0cHV0IGluZGV4IHR1cGxlcyBpbiB0aGUgdXN1YWwg b3JkZXIgZm9yIHRoZSBpbmRleCAtLSBqdXN0IGxpa2UKKyAqIGFueSBvdGhlciBpbmRleCBzY2Fu IHdvdWxkLiAgVGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBtYW5hZ2VzIHRoZSBzY2FuJ3MKKyAqIGFy cmF5IGtleXMgbXVzdCBvbmx5IHN0YXJ0IHByaW1pdGl2ZSBpbmRleCBzY2FucyB3aGVuIHRoZXkg Y292ZXIga2V5IHNwYWNlCisgKiBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhlIGtleSBzcGFjZSBm b3IgdHVwbGVzIHRoYXQgdGhlIHNjYW4gaGFzIGFscmVhZHkKKyAqIHJldHVybmVkIChvciBzdHJp Y3RseSBsZXNzIGluIHRoZSBiYWNrd2FyZHMgc2NhbiBjYXNlKS4gIE90aGVyd2lzZSB0aGUgc2Nh bgorICogY291bGQgb3V0cHV0IHRoZSBzYW1lIGluZGV4IHR1cGxlcyBtb3JlIHRoYW4gb25jZSwg b3IgaW4gdGhlIHdyb25nIG9yZGVyLgorICoKKyAqIFRoaXMgaXMgbWFuYWdlZCBieSBsaW1pdGlu ZyB0aGUgY2FzZXMgdGhhdCBjYW4gdHJpZ2dlciBuZXcgcHJpbWl0aXZlIGluZGV4CisgKiBzY2Fu cyB0byB0aG9zZSBpbnZvbHZpbmcgcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzIGFuZC9vciBvdGhl ciByZXF1aXJlZAorICogc2NhbiBrZXlzIHRoYXQgdXNlIHRoZSBlcXVhbGl0eSBzdHJhdGVneS4g IEluIHBhcnRpY3VsYXIsIHRoZSBzdGF0ZSBtYWNoaW5lCisgKiBtdXN0IG5vdCBhbGxvdyBoaWdo IG9yZGVyIHJlcXVpcmVkIHNjYW4ga2V5cyB1c2luZyBhbiBpbmVxdWFsaXR5IHN0cmF0ZWd5Cisg KiAod2hpY2ggYXJlIG9ubHkgcmVxdWlyZWQgaW4gb25lIHNjYW4gZGlyZWN0aW9uKSB0byBkaXJl Y3RseSB0cmlnZ2VyIGEgbmV3CisgKiBwcmltaXRpdmUgaW5kZXggc2NhbiB0aGF0IGFkdmFuY2Vz IGxvdyBvcmRlciBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzLgorICogRm9yIGV4YW1wbGUs IGEgcXVlcnkgc3VjaCBhcyAiU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxIFdI RVJFCisgKiB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApIE9SREVSIEJZ IHRob3VzYW5kIiB3aG9zZSBleGVjdXRpb24KKyAqIGludm9sdmVzIGEgc2NhbiBvZiBhbiBpbmRl eCBvbiAiKHRob3VzYW5kLCB0ZW50aG91cykiIG11c3QgcGVyZm9ybSBubyBtb3JlCisgKiB0aGFu IGEgc2luZ2xlIHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgT3RoZXJ3aXNlIHdlIHJpc2sgb3V0cHV0 dGluZyB0dXBsZXMgaW4KKyAqIHRoZSB3cm9uZyBvcmRlci4gIEFycmF5IGtleSB2YWx1ZXMgZm9y IHRoZSBub24tcmVxdWlyZWQgc2NhbiBrZXkgb24gdGhlCisgKiAidGVudGhvdXMiIGNvbHVtbiBt dXN0IG5vdCBkaWN0YXRlIHRvcC1sZXZlbCBzY2FuIG9yZGVyLiAgUHJpbWl0aXZlIGluZGV4Cisg KiBzY2FucyBtdXN0bid0IHNjYW4gdHVwbGVzIGFscmVhZHkgc2Nhbm5lZCBieSBzb21lIGVhcmxp ZXIgcHJpbWl0aXZlIHNjYW4uCisgKgorICogSW4gZmFjdCwgbmJ0cmVlIG1ha2VzIGEgc3Ryb25n ZXIgZ3VhcmFudGVlIHRoYW4gaXMgc3RyaWN0bHkgbmVjZXNzYXJ5IGhlcmU6CisgKiBpdCBndWFy YW50ZWVzIHRoYXQgdGhlIHRvcC1sZXZlbCBzY2FuIHdvbid0IHJlcGVhdCBhbnkgbGVhZiBwYWdl IHJlYWRzLgorICogKEFjdHVhbGx5LCB0aGF0IGNhbiBzdGlsbCBoYXBwZW4gd2hlbiB0aGUgc2Nh biBpcyByZXBvc2l0aW9uZWQsIG9yIHRoZSBzY2FuCisgKiBkaXJlY3Rpb24gY2hhbmdlcyAtLSBi dXQgdGhhdCdzIGp1c3QgYXMgdHJ1ZSB3aXRoIG90aGVyIHR5cGVzIG9mIHNjYW5zLikKKyAqLwor Ym9vbAorX2J0X2FycmF5X2tleXNfcmVtYWluKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3Bh cXVlOworCisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJLyoKKwkgKiBBcnJheSBrZXlz IGFyZSBhZHZhbmNlZCB3aXRoaW4gX2J0X2NoZWNra2V5cyB3aGVuIHRoZSBzY2FuIHJlYWNoZXMg dGhlCisJICogbGVhZiBsZXZlbCAobW9yZSBwcmVjaXNlbHksIHRoZXkncmUgYWR2YW5jZWQgd2hl biB0aGUgc2NhbiByZWFjaGVzIHRoZQorCSAqIGVuZCBvZiBlYWNoIGRpc3RpbmN0IHNldCBvZiBh cnJheSBlbGVtZW50cykuICBUaGlzIHByb2Nlc3MgYXZvaWRzCisJICogcmVwZWF0IGFjY2VzcyB0 byBsZWFmIHBhZ2VzIChhY3Jvc3MgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNjYW5zKSBieQor CSAqIG9wcG9ydHVuaXN0aWNhbGx5IGFkdmFuY2luZyB0aGUgc2NhbidzIGFycmF5IGtleXMgd2hl biBpdCBhbGxvd3MgdGhlCisJICogcHJpbWl0aXZlIGluZGV4IHNjYW4gdG8gZmluZCBuZWFyYnkg bWF0Y2hpbmcgdHVwbGVzIChvciB0byBlbGltaW5hdGUKKwkgKiBhcnJheSBrZXlzIHdpdGggbm8g bWF0Y2hpbmcgdHVwbGVzIGZyb20gZnVydGhlciBjb25zaWRlcmF0aW9uKS4KKwkgKgorCSAqIF9i dF9jaGVja2tleXMgc2V0cyBhIHNpbXBsZSBmbGFnIHZhcmlhYmxlIHRoYXQgd2UgY2hlY2sgaGVy ZS4gIFRoaXMKKwkgKiB0ZWxscyB1cyBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW5vdGhlciBwcmlt aXRpdmUgaW5kZXggc2NhbiBmb3IgdGhlCisJICogbm93LWN1cnJlbnQgYXJyYXkga2V5cyBvciBu b3QuICBXZSdsbCB1bnNldCB0aGUgZmxhZyBvbmNlIGFnYWluIHRvCisJICogYWNrbm93bGVkZ2Ug aGF2aW5nIHN0YXJ0ZWQgYSBuZXcgcHJpbWl0aXZlIHNjYW4gKG9yIHdlJ2xsIHNlZSB0aGF0IGl0 CisJICogaXNuJ3Qgc2V0IGFuZCBlbmQgdGhlIHRvcC1sZXZlbCBzY2FuIHJpZ2h0IGF3YXkpLgor CSAqCisJICogV2UgY2Fubm90IHJlbHkgb24gX2J0X2ZpcnN0IGFsd2F5cyByZWFjaGluZyBfYnRf Y2hlY2trZXlzIGhlcmUuICBUaGVyZQorCSAqIGFyZSB2YXJpb3VzIHNjZW5hcmlvcyB3aGVyZSB0 aGF0IHdvbid0IGhhcHBlbi4gIEZvciBleGFtcGxlLCBpZiB0aGUKKwkgKiBpbmRleCBpcyBjb21w bGV0ZWx5IGVtcHR5LCB0aGVuIF9idF9maXJzdCB3b24ndCBnZXQgYXMgZmFyIGFzIGNhbGxpbmcK KwkgKiBfYnRfcmVhZHBhZ2UvX2J0X2NoZWNra2V5cy4KKwkgKgorCSAqIFdlIGFsc28gZG9uJ3Qg ZXhwZWN0IF9idF9jaGVja2tleXMgdG8gYmUgcmVhY2hlZCB3aGVuIHNlYXJjaGluZyBmb3IgYQor CSAqIG5vbi1leGlzdGVudCB2YWx1ZSB0aGF0IGhhcHBlbnMgdG8gYmUgaGlnaGVyIHRoYW4gYW55 IGV4aXN0aW5nIHZhbHVlIGluCisJICogdGhlIGluZGV4LiAgTm8gX2J0X2NoZWNra2V5cyBhcmUg ZXhwZWN0ZWQgd2hlbiBfYnRfcmVhZHBhZ2UgcmVhZHMgdGhlCisJICogcmlnaHRtb3N0IHBhZ2Ug ZHVyaW5nIHN1Y2ggYSBzY2FuIC0tIGV2ZW4gYSBfYnRfY2hlY2trZXlzIGNhbGwgYWdhaW5zdAor CSAqIHRoZSBoaWdoIGtleSB3b24ndCBoYXBwZW4uICBUaGVyZSBpcyBhbiBhbmFsb2dvdXMgaXNz dWUgZm9yIGJhY2t3YXJkcworCSAqIHNjYW5zIHRoYXQgc2VhcmNoIGZvciBhIHZhbHVlIGxvd2Vy IHRoYW4gYWxsIGV4aXN0aW5nIGluZGV4IHR1cGxlcy4KKwkgKgorCSAqIFdlIGRvbid0IGFjdHVh bGx5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlc2UgY2FzZXMgLS0gd2UgZG9uJ3QK KwkgKiBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgaW5zdHJ1Y3RlZCB0byBfbm90XyBwZXJmb3JtIGFu b3RoZXIgcHJpbWl0aXZlCisJICogaW5kZXggc2Nhbi4gIFRoaXMgaXMgY29ycmVjdCBmb3IgYWxs IG9mIHRoZSBjYXNlcyB3ZSd2ZSBsaXN0ZWQgc28gZmFyLAorCSAqIHdoaWNoIGFsbCBpbnZvbHZl IHByaW1pdGl2ZSBpbmRleCBzY2FucyB0aGF0IGFjY2VzcyBwYWdlcyAibmVhciB0aGUKKwkgKiBi b3VuZGFyaWVzIG9mIHRoZSBrZXkgc3BhY2UiICh0aGUgbGVmdG1vc3QgcGFnZSwgdGhlIHJpZ2h0 bW9zdCBwYWdlLCBvcgorCSAqIGFuIGltYWdpbmFyeSBlbXB0eSBsZWFmIHJvb3QgcGFnZSkuICBJ ZiBfYnRfY2hlY2trZXlzIGNhbm5vdCBiZSByZWFjaGVkCisJICogYnkgYSBwcmltaXRpdmUgaW5k ZXggc2NhbiBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBpdCBmb2xsb3dzIHRoYXQgaXQKKwkg KiBhbHNvIHdvbid0IGJlIHJlYWNoZWQgZm9yIGFueSBsYXRlciBzZXQgb2YgYXJyYXkga2V5cy4K KwkgKgorCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IHRoZSBjYXNlIHdoZXJlIF9idF9maXJz dCdzIF9idF9wcmVwcm9jZXNzX2tleXMKKwkgKiBjYWxsIGRldGVybWluZWQgdGhhdCB0aGUgc2Nh bidzIGlucHV0IHNjYW4ga2V5cyBjYW4gbmV2ZXIgYmUgc2F0aXNmaWVkLgorCSAqIFRoYXQgbWln aHQgYmUgdHJ1ZSBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBidXQgbm90IHRoZSBuZXh0IHNl dC4KKwkgKi8KKwlpZiAoIXNvLT5xdWFsX29rKQorCXsKKwkJLyoKKwkJICogUXVhbCBjYW4gbmV2 ZXIgYmUgc2F0aXNmaWVkLiAgQWR2YW5jZSBvdXIgYXJyYXkga2V5cyBpbmNyZW1lbnRhbGx5Lgor CQkgKi8KKwkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCQlpZiAoX2J0X2FkdmFuY2VfYXJy YXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCS8q IFRpbWUgZm9yIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4/ICovCisJaWYgKHNvLT5uZWVk UHJpbVNjYW4pCisJeworCQkvKiBCZWdpbiBwcmltaXRpdmUgaW5kZXggc2NhbiAqLworCQlzby0+ bmVlZFByaW1TY2FuID0gZmFsc2U7CisKKwkJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVM TCkKKwkJCV9idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKHNjYW4pOworCisJCXJldHVy biB0cnVlOworCX0KKworCS8qCisJICogTm8gbW9yZSBwcmltaXRpdmUgaW5kZXggc2NhbnMuICBK dXN0IHRlcm1pbmF0ZSB0aGUgdG9wLWxldmVsIHNjYW4uCisJICovCisJX2J0X2FkdmFuY2VfYXJy YXlfa2V5c190b19lbmQoc2NhbiwgZGlyKTsKKworCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9 IE5VTEwpCisJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOworCisJcmV0dXJuIGZhbHNlOworfQor CisvKgorICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cygpIC0tIEFkdmFuY2UgYXJyYXkgZWxlbWVu dHMgdXNpbmcgYSB0dXBsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcmVxdWlyZWQgZXF1 YWxpdHktdHlwZSBzY2FuIGtleXMgKGluIHBhcnRpY3VsYXIsIHRob3NlCisgKiB0aGF0IGFyZSBh cnJheSBrZXlzKSBub3cgaGF2ZSBleGFjdCBtYXRjaGluZyB2YWx1ZXMgdG8gdGhvc2UgZnJvbSB0 dXBsZS4KKyAqIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgdHVwbGUgaXNuJ3QgYW4gZXhhY3QgbWF0 Y2ggaW4gdGhpcyBzZW5zZS4KKyAqCisgKiBTZXRzIHBzdGF0ZS5jb250aW51ZXNjYW4gZm9yIGNh bGxlciB3aGVuIHdlIHJldHVybiBmYWxzZS4gIFdoZW4gd2UgcmV0dXJuCisgKiB0cnVlIGl0J3Mg dXAgdG8gY2FsbGVyIHRvIGNhbGwgX2J0X2NoZWNrX2NvbXBhcmUgdG8gcmVjaGVjayB0aGUgdHVw bGUuICBJdAorICogaXMgb2theSB0byBsZXQgdGhlIHNlY29uZCBjYWxsIHNldCBwc3RhdGUuY29u dGludWVzY2FuPWZhbHNlIHdpdGhvdXQKKyAqIGZ1cnRoZXIgaW50ZXJ2ZW50aW9uLCBzaW5jZSB3 ZSBrbm93IHRoYXQgaXQgY2FuIG9ubHkgYmUgZm9yIGEgc2NhbiBrZXkgdGhhdAorICogaXMgcmVx dWlyZWQgaW4gb25lIGRpcmVjdGlvbi4KKyAqCisgKiBXaGVuIGNhbGxlZCB3aXRoIHNrcmVxdWly ZWR0cmlnZ2VyLCB3ZSBkb24ndCBleHBlY3QgdG8gaGF2ZSB0byBhZHZhbmNlIGFueQorICogbm9u LXJlcXVpcmVkIHNjYW4ga2V5cy4gIFdlJ2xsIGFsd2F5cyBzZXQgcHN0YXRlLmNvbnRpbnVlc2Nh biBiZWNhdXNlIGEKKyAqIG5vbi1yZXF1aXJlZCBzY2FuIGtleSBjYW4gbmV2ZXIgdGVybWluYXRl IHRoZSBzY2FuLgorICoKKyAqIFJlcXVpcmVkIGFycmF5IGtleXMgYXJlIGFsd2F5cyBhZHZhbmNl ZCB0byB0aGUgaGlnaGVzdCBlbGVtZW50ID49IHRoZQorICogY29ycmVzcG9uZGluZyB0dXBsZSBh dHRyaWJ1dGUgdmFsdWVzIGZvciBpdHMgbW9zdCBzaWduaWZpY2FudCBub24tZXF1YWwKKyAqIGNv bHVtbiAob3IgdGhlIG5leHQgbG93ZXN0IHNldCA8PSB0aGUgdHVwbGUgdmFsdWUgZHVyaW5nIGJh Y2t3YXJkcyBzY2FucykuCisgKiBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBhcnJheSBrZXlz IGZvciB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbiwgd2UKKyAqIGVuZCB0aGUgdG9wLWxldmVs IGluZGV4IHNjYW4uCisgKgorICogX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyBpcyByZXNw b25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnJlbnQKKyAqIHBsYWNlIGluIHRoZSBz Y2FuIGlzID49IHRoZSBjdXJyZW50IGFycmF5IGtleXMgKG9yIDw9IGR1cmluZyBiYWNrd2FyZAor ICogc2NhbnMpLiAgVGhpcyBtdXN0IGJlIGVzdGFibGlzaGVkIGZpcnN0LCBiZWZvcmUgY2FsbGlu ZyBoZXJlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBtYXkgc29tZXRpbWVzIG5lZWQgdG8gYWR2YW5j ZSB0aGUgYXJyYXkga2V5cyBpbiBzcGl0ZSBvZiB0aGUKKyAqIGV4aXN0aW5nIGFycmF5IGtleXMg YWxyZWFkeSBiZWluZyBhbiBleGFjdCBtYXRjaCBmb3IgZXZlcnkgY29ycmVzcG9uZGluZworICog dmFsdWUgZnJvbSBjYWxsZXIncyB0dXBsZS4gIFdlIGZhbGwgYmFjayBvbiAiaW5jcmVtZW50YWxs eSIgYWR2YW5jaW5nIHRoZQorICogYXJyYXkga2V5cyBpbiB0aGVzZSBjYXNlcywgd2hpY2ggaW52 b2x2ZSBpbmVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5cy4KKyAqIEZvciBleGFtcGxlLCB3aXRo IGEgY29tcG9zaXRlIGluZGV4IG9uIChhLCBiKSBhbmQgYSBxdWFsICJXSEVSRSBhIElOICgzLDUp CisgKiBBTkQgYiA8IDQyIiwgd2UnbGwgYmUgY2FsbGVkIGZvciBib3RoICJhIiBrZXlzIChpLmUu IGtleXMgMyBhbmQgNSkgd2hlbiB0aGUKKyAqIHNjYW4gcmVhY2hlcyB0dXBsZXMgd2hlcmUgImIg Pj0gNDIiLiAgRXZlbiB0aG91Z2ggImEiIGFycmF5IGtleXMgY29udGludWUKKyAqIHRvIGhhdmUg ZXhhY3QgbWF0Y2hlcyBmb3IgdHVwbGVzICJiID49IDQyIiAoZm9yIGJvdGggYXJyYXkga2V5IGdy b3VwaW5ncyksCisgKiB3ZSB3aWxsIHN0aWxsIGFkdmFuY2UgdGhlIGFycmF5IGZvciAiYSIgdmlh IG91ciBmYWxsYmFjayBvbiBpbmNyZW1lbnRhbAorICogYWR2YW5jZW1lbnQgZWFjaCB0aW1lIHdl J3JlIGNhbGxlZC4gIFRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNhbGxlZCAod2hlbiB0aGUKKyAqIHNj YW4gcmVhY2hlcyBhIHR1cGxlID49ICIoMywgNDIpIiksIHdlIGFkdmFuY2UgdGhlIGFycmF5IGtl eSAoZnJvbSAzIHRvIDUpLgorICogVGhpcyBnaXZlcyBvdXIgY2FsbGVyIHRoZSBvcHRpb24gb2Yg c3RhcnRpbmcgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4KKyAqIHRoYXQgcXVpY2tseSBsb2Nh dGVzIHRoZSBzdGFydCBvZiB0dXBsZXMgPiAiKDUsIC1pbmYpIi4gIFRoZSBzZWNvbmQgdGltZQor ICogd2UncmUgY2FsbGVkICh3aGVuIHRoZSBzY2FuIHJlYWNoZXMgYSB0dXBsZSA+PSAiKDUsIDQy KSIpLCB3ZSBpbmNyZW1lbnRhbGx5CisgKiBhZHZhbmNlIHRoZSBrZXlzIGEgc2Vjb25kIHRpbWUu ICBUaGlzIHNlY29uZCBjYWxsIGVuZHMgdGhlIHRvcC1sZXZlbCBzY2FuLgorICoKKyAqIE5vdGUg YWxzbyB0aGF0IHdlIGRlYWwgd2l0aCBhbGwgcmVxdWlyZWQgZXF1YWxpdHktdHlwZSBzY2FuIGtl eXMgaGVyZTsgaXQncworICogbm90IGxpbWl0ZWQgdG8gYXJyYXkgc2NhbiBrZXlzLiAgV2UgbmVl ZCB0byBoYW5kbGUgbm9uLWFycmF5IGVxdWFsaXR5IGNhc2VzCisgKiBoZXJlIGJlY2F1c2UgdGhl eSdyZSBlcXVhbGl0eSBjb25zdHJhaW50cyBmb3IgdGhlIHNjYW4sIGluIHRoZSBzYW1lIHdheQor ICogdGhhdCBhcnJheSBzY2FuIGtleXMgYXJlLiAgV2UgbXVzdCBub3Qgc3VwcHJlc3MgY2FzZXMg d2hlcmUgYSBjYWxsIHRvCisgKiBfYnRfY2hlY2tfY29tcGFyZSBzZXRzIGNvbnRpbnVlc2Nhbj1m YWxzZSBmb3IgYSByZXF1aXJlZCBzY2FuIGtleSB0aGF0IHVzZXMKKyAqIHRoZSBlcXVhbGl0eSBz dHJhdGVneSAob25seSBpbmVxdWFsaXR5LXR5cGUgc2NhbiBrZXlzIGdldCB0aGF0IHRyZWF0bWVu dCkuCisgKiBXZSBkb24ndCB3YW50IHRvIHN1cHByZXNzIHRoZSBzY2FuJ3MgdGVybWluYXRpb24g d2hlbiBpdCdzIGluYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBib29sCitfYnRfYWR2YW5jZV9h cnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJ CQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgc2tyZXF1aXJlZHRyaWdnZXIpCit7CisJQlRT Y2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCVJlbGF0aW9uCXJl bCA9IHNjYW4tPmluZGV4UmVsYXRpb247CisJU2NhbkRpcmVjdGlvbiBkaXIgPSBwc3RhdGUtPmRp cjsKKwlUdXBsZURlc2MJaXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJU2Nhbktl eQkJY3VyOworCWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwLAorCQkJCW50dXBhdHRzID0g QlRyZWVUdXBsZUdldE5BdHRzKHR1cGxlLCByZWwpOworCWJvb2wJCWFycmF5c19hZHZhbmNlZCA9 IGZhbHNlLAorCQkJCWFsbF9za3JlcXVpcmVkX2F0dHNfd3JhcHBlZCA9IHNrcmVxdWlyZWR0cmln Z2VyLAorCQkJCWFsbF9hdHRzX2VxdWFsID0gdHJ1ZSwKKwkJCQlhcnJheXNfZG9uZTsKKworCUFz c2VydChzby0+bnVtYmVyT2ZLZXlzID4gMCk7CisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMgPiAw KTsKKwlBc3NlcnQoc28tPnF1YWxfb2spOworCisJLyoKKwkgKiBUcnkgdG8gYWR2YW5jZSBhcnJh eSBrZXlzIHZpYSBhIHNlcmllcyBvZiBiaW5hcnkgc2VhcmNoZXMuCisJICoKKwkgKiBMb29wIGl0 ZXJhdGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgc2NhbmtleXMgKHNvLT5rZXlEYXRhLCB3aGljaCB3 ZXJlCisJICogb3V0cHV0IGJ5IF9idF9wcmVwcm9jZXNzX2tleXMgZWFybGllcikgYW5kIHRoZW4g c2V0cyBpbnB1dCBzY2FuIGtleXMKKwkgKiAoc28tPmFycmF5S2V5RGF0YSBzY2FuIGtleXMpIHRv IG5ldyBhcnJheSB2YWx1ZXMuCisJICovCisJZm9yIChjdXIgPSBzby0+a2V5RGF0YSwgaWtleSA9 IDA7IGlrZXkgPCBzby0+bnVtYmVyT2ZLZXlzOyBjdXIrKywgaWtleSsrKQorCXsKKwkJQlRBcnJh eUtleUluZm8gKmFycmF5ID0gTlVMTDsKKwkJU2NhbktleQkJc2tleWFycmF5ID0gTlVMTDsKKwkJ Rm1nckluZm8gICAqb3JkZXJwcm9jOworCQlpbnQJCQlhdHRudW0gPSBjdXItPnNrX2F0dG5vLAor CQkJCQlmaXJzdF9lbGVtX2RpciwKKwkJCQkJZmluYWxfZWxlbV9kaXIsCisJCQkJCXNldF9lbGVt OworCQlEYXR1bQkJZGF0dW07CisJCWJvb2wJCXNrcmVxdWlyZWQsCisJCQkJCW51bGw7CisJCWlu dDMyCQlyZXN1bHQ7CisKKwkJLyoKKwkJICogV2Ugb25seSBkZWFsIHdpdGggZXF1YWxpdHkgc3Ry YXRlZ3kgc2NhbiBrZXlzLiAgV2UgbGVhdmUgaGFuZGxpbmcKKwkJICogb2YgaW5lcXVhbGl0aWVz IHVwIHRvIF9idF9jaGVja19jb21wYXJlLgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kg IT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogRGV0 ZXJtaW5lIGlmIHRoaXMgc2NhbiBrZXkgaXMgcmVxdWlyZWQgaW4gdGhlIGN1cnJlbnQgc2Nhbgor CQkgKiBkaXJlY3Rpb24KKwkJICovCisJCXNrcmVxdWlyZWQgPSAoKFNjYW5EaXJlY3Rpb25Jc0Zv cndhcmQoZGlyKSAmJgorCQkJCQkgICAoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkpIHx8 CisJCQkJCSAgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgJiYKKwkJCQkJICAgKGN1ci0+ c2tfZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSkpOworCisJCS8qCisJCSAqIE9wdGltaXphdGlvbjog d2UgZG9uJ3QgaGF2ZSB0byBhZHZhbmNlIHJlbWFpbmluZyBub24tcmVxdWlyZWQgYXJyYXkKKwkJ ICoga2V5cyB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0IHR1cGxlIHdvbid0IGJlIHJldHVybmVk IGJ5IHRoZSBzY2FuLgorCQkgKgorCQkgKiBEZWxpYmVyYXRlbHkgY2hlY2sgdGhpcyBib3RoIGhl cmUgYW5kIGFmdGVyIHRoZSBiaW5hcnkgc2VhcmNoLgorCQkgKi8KKwkJaWYgKCFza3JlcXVpcmVk ICYmICFhbGxfYXR0c19lcXVhbCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8g Y2hlY2sgcmVxdWlyZWQgbm9uLWFycmF5IHNjYW4ga2V5cyAodGhhdCB1c2UgdGhlIGVxdWFsCisJ CSAqIHN0cmF0ZWd5KSwgYXMgd2VsbCBhcyByZXF1aXJlZCBhbmQgbm9uLXJlcXVpcmVkIGFycmF5 IHNjYW4ga2V5cworCQkgKiAoYWxzbyBsaW1pdGVkIHRvIHRob3NlIHRoYXQgdXNlIHRoZSBlcXVh bCBzdHJhdGVneSwgc2luY2UgYXJyYXkKKwkJICogaW5lcXVhbGl0aWVzIGRlZ2VuZXJhdGUgaW50 byBhIHNpbXBsZSBjb21wYXJpc29uKS4KKwkJICoKKwkJICogUGVyZm9ybSBpbml0aWFsIHNldCB1 cCBmb3IgdGhpcyBzY2FuIGtleS4gIElmIGl0IGlzIGJhY2tlZCBieSBhbgorCQkgKiBhcnJheSB0 aGVuIHdlIG5lZWQgdG8gc2V0IHZhcmlhYmxlcyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHBvc2l0 aW9uCisJCSAqIGluIHRoZSBhcnJheS4KKwkJICovCisJCW9yZGVycHJvYyA9ICZzby0+b3JkZXJQ cm9jc1thdHRudW0gLSAxXTsKKwkJZmlyc3RfZWxlbV9kaXIgPSBmaW5hbF9lbGVtX2RpciA9IDA7 CS8qIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KKwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFS Q0hBUlJBWSkKKwkJeworCQkJLyogU2V0IHVwIGFycmF5IGNvbXBhcmlzb24gZnVuY3Rpb24gKi8K KwkJCUFzc2VydChhcnJheWlkeCA8IHNvLT5udW1BcnJheUtleXMpOworCQkJYXJyYXkgPSAmc28t PmFycmF5S2V5c1thcnJheWlkeCsrXTsKKwkJCXNrZXlhcnJheSA9ICZzby0+YXJyYXlLZXlEYXRh W2FycmF5LT5zY2FuX2tleV07CisJCQlBc3NlcnQoc2tleWFycmF5LT5za19hdHRubyA9PSBhdHRu dW0pOworCisJCQkvKiBQcm9hY3RpdmVseSBzZXQgdXAgc3RhdGUgdXNlZCB0byBoYW5kbGUgYXJy YXkgd3JhcGFyb3VuZCAqLworCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJ CXsKKwkJCQlmaXJzdF9lbGVtX2RpciA9IDA7CisJCQkJZmluYWxfZWxlbV9kaXIgPSBhcnJheS0+ bnVtX2VsZW1zIC0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmaXJzdF9lbGVtX2RpciA9 IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQkJCWZpbmFsX2VsZW1fZGlyID0gMDsKKwkJCX0KKwkJ fQorCQllbHNlIGlmIChhdHRudW0gPiBudHVwYXR0cykKKwkJeworCQkJLyoKKwkJCSAqIE5vdGhp bmcgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIHdlIGhhdmUgYSB0cnVuY2F0ZWQgYXR0cmlidXRlCisJ CQkgKiAocG9zc2libGUgd2hlbiBjYWxsZXIncyB0dXBsZSBpcyBhIHBhZ2UgaGlnaCBrZXkpIGFu ZCBhCisJCQkgKiBub24tYXJyYXkgc2NhbiBrZXkKKwkJCSAqLworCQkJQXNzZXJ0KFNjYW5EaXJl Y3Rpb25Jc0ZvcndhcmQoZGlyKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEhl cmUgd2UgcGVyZm9ybSBzdGVwcyBmb3IgYW55IHJlcXVpcmVkIHNjYW4ga2V5cyBhZnRlciB0aGUg Zmlyc3QKKwkJICogbm9uLWVxdWFsIHJlcXVpcmVkIHNjYW4ga2V5LiAgVGhlIGZpcnN0IHNjYW4g a2V5IG11c3QgaGF2ZSBiZWVuIHNldAorCQkgKiB0byBhIHZhbHVlID4gdGhlIHZhbHVlIGZyb20g dGhlIHR1cGxlIGJhY2sgd2hlbiB3ZSBkZWFsdCB3aXRoIGl0CisJCSAqIChvciwgZm9yIGEgYmFj a3dhcmRzIHNjYW4sIHRvIGEgdmFsdWUgPCB0aGUgdmFsdWUgZnJvbSB0aGUgdHVwbGUpLgorCQkg KiBUaGF0IG5lZWRzIHRvICJjYXNjYWRlIiB0byBsb3dlci1vcmRlciBhcnJheSBzY2FuIGtleXMu ICBUaGV5IG11c3QKKwkJICogYmUgc2V0IHRvIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGZvciB0 aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbi4KKwkJICoKKwkJICogV2UncmUgc3RpbGwgc2V0dGlu ZyB0aGUga2V5cyB0byB2YWx1ZXMgPj0gdGhlIHR1cGxlIGhlcmUgLS0gaXQganVzdAorCQkgKiBu ZWVkcyB0byB3b3JrIGZvciB0aGUgdHVwbGUgYXMgYSB3aG9sZS4gIEZvciBleGFtcGxlLCB3aGVu IGEgdHVwbGUKKwkJICogIihhLCBiKSA9ICg0MiwgNSkiIGFkdmFuY2VzIHRoZSBhcnJheSBrZXlz IG9uICJhIiBmcm9tIDQwIHRvIDQ1LCB3ZQorCQkgKiBtdXN0IGFsc28gc2V0ICJiIiB0byB3aGF0 ZXZlciB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCBmb3IgImIiIGlzLgorCQkgKiBJdCB3b3VsZCBi ZSB3cm9uZyB0byBhbGxvdyAiYiIgdG8gYmUgc2V0IHRvIGEgdmFsdWUgZnJvbSB0aGUgdHVwbGUs CisJCSAqIHNpbmNlIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBmcm9tIGEgZGlmZmVyZW50IHBhcnQg b2YgdGhlIGtleSBzcGFjZS4KKwkJICoKKwkJICogQWxzbyBkZWZlbnNpdmVseSBkbyB0aGlzIHdp dGggdHJ1bmNhdGVkIGF0dHJpYnV0ZXMgd2hlbiBjYWxsZXIncworCQkgKiB0dXBsZSBpcyBhIHBh Z2UgaGlnaCBrZXkuCisJCSAqLworCQlpZiAoYXJyYXkgJiYgKChhcnJheXNfYWR2YW5jZWQgJiYg IWFsbF9hdHRzX2VxdWFsKSB8fAorCQkJCQkgIGF0dG51bSA+IG50dXBhdHRzKSkKKwkJeworCQkJ LyoKKwkJCSAqIFdlIHNldCB0aGUgYXJyYXkgdG8gdGhlIGZpcnN0IGVsZW1lbnQgKGlmIG5lZWRl ZCkgaGVyZSwgYW5kIHdlCisJCQkgKiBkb24ndCB1bnNldCBhbGxfcmVxdWlyZWRfYXR0c193cmFw cGVkLiAgVGhpcyBhcnJheSB0aGVyZWZvcmUKKwkJCSAqIGNvdW50cyBhcyBhIHdyYXBwZWQgYXJy YXkgd2hlbiB3ZSBnbyBvbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9mCisJCQkgKiB0aGUgcmVxdWly ZWQgYXJyYXlzIGhhdmUgd3JhcHBlZCAoYWZ0ZXIgdGhpcyBsb29wKS4KKwkJCSAqLworCQkJaWYg KGFycmF5LT5jdXJfZWxlbSAhPSBmaXJzdF9lbGVtX2RpcikKKwkJCXsKKwkJCQlhcnJheS0+Y3Vy X2VsZW0gPSBmaXJzdF9lbGVtX2RpcjsKKwkJCQlza2V5YXJyYXktPnNrX2FyZ3VtZW50ID0gYXJy YXktPmVsZW1fdmFsdWVzW2ZpcnN0X2VsZW1fZGlyXTsKKwkJCQlhcnJheXNfYWR2YW5jZWQgPSB0 cnVlOworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEdvaW5nIHRvIGNv bXBhcmUgc2NhbiBrZXkgdG8gY29ycmVzcG9uZGluZyB0dXBsZSBhdHRyaWJ1dGUgdmFsdWUKKwkJ ICovCisJCWRhdHVtID0gaW5kZXhfZ2V0YXR0cih0dXBsZSwgYXR0bnVtLCBpdHVwZGVzYywgJm51 bGwpOworCisJCWlmICghYXJyYXkpCisJCXsKKwkJCWlmICghc2tyZXF1aXJlZCB8fCAhYWxsX2F0 dHNfZXF1YWwpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgcmVxdWly ZWQgbm9uLWFycmF5IHNjYW4ga2V5IHRoYXQgdXNlcyB0aGUgZXF1YWwKKwkJCSAqIHN0cmF0ZWd5 LiAgU2VlIGhlYWRlciBjb21tZW50cyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHdlCisJCQkg KiBuZWVkIHRvIGRvIHRoaXMuCisJCQkgKi8KKwkJCXJlc3VsdCA9IF9idF9jb21wYXJlX2FycmF5 X3NrZXkoY3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLAorCQkJCQkJCQkJCQljdXItPnNrX2Fy Z3VtZW50KTsKKworCQkJaWYgKHJlc3VsdCAhPSAwKQorCQkJeworCQkJCS8qCisJCQkJICogdHVw bGUgYXR0cmlidXRlIHZhbHVlIGlzID4gc2NhbiBrZXkgdmFsdWUgKG9yIDwgc2NhbiBrZXkKKwkJ CQkgKiB2YWx1ZSBpbiB0aGUgYmFja3dhcmQgc2NhbiBjYXNlKS4KKwkJCQkgKi8KKwkJCQlhbGxf YXR0c19lcXVhbCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCQljb250aW51ZTsKKwkJ fQorCisJCS8qCisJCSAqIEJpbmFyeSBzZWFyY2ggZm9yIGFuIGFycmF5IGtleSA+PSB0aGUgdHVw bGUgdmFsdWUsIHdoaWNoIHdlJ2xsIHRoZW4KKwkJICogc2V0IGFzIG91ciBjdXJyZW50IGFycmF5 IGtleSAob3IgPD0gdGhlIHR1cGxlIHZhbHVlIGlmIHRoaXMgaXMgYQorCQkgKiBiYWNrd2FyZCBz Y2FuKS4KKwkJICoKKwkJICogVGhlIGJpbmFyeSBzZWFyY2ggZXhjbHVkZXMgYXJyYXkga2V5cyB0 aGF0IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkCisJCSAqIGZyb20gY29uc2lkZXJhdGlvbiwgZXhj ZXB0IHdpdGggYSBub24tcmVxdWlyZWQgc2NhbiBrZXkncyBhcnJheS4KKwkJICogVGhpcyBpcyBu b3QganVzdCBhbiBvcHRpbWl6YXRpb24gLS0gaXQncyBpbXBvcnRhbnQgZm9yIGNvcnJlY3RuZXNz LgorCQkgKiBJdCBpcyBjcnVjaWFsIHRoYXQgcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzIG9ubHkg aGF2ZSB0aGVpciBhcnJheQorCQkgKiBrZXlzIGFkdmFuY2VkIGluIHRoZSBjdXJyZW50IHNjYW4g ZGlyZWN0aW9uLiAgV2UgbmVlZCB0byBhZHZhbmNlCisJCSAqIHJlcXVpcmVkIGFycmF5IGtleXMg aW4gbG9jayBzdGVwIHdpdGggdGhlIGluZGV4IHNjYW4uCisJCSAqCisJCSAqIE5vdGUgaW4gcGFy dGljdWxhciB0aGF0IGFycmF5c19hZHZhbmNlZCBtdXN0IG9ubHkgYmUgc2V0IHdoZW4gdGhlCisJ CSAqIGFycmF5IGlzIGFkdmFuY2VkIHRvIGEga2V5ID49IHRoZSBleGlzdGluZyBrZXksIG9yIDw9 IGZvciBhCisJCSAqIGJhY2t3YXJkcyBzY2FuLiAgKFRob3VnaCBzZWUgbm90ZXMgYWJvdXQgd3Jh cGFyb3VuZCBiZWxvdy4pCisJCSAqLworCQlzZXRfZWxlbSA9IF9idF9iaW5zcmNoX2FycmF5X3Nr ZXkoZGlyLCAoIXNrcmVxdWlyZWQgfHwgYXJyYXlzX2FkdmFuY2VkKSwKKwkJCQkJCQkJCQkgIGFy cmF5LCBjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGwsCisJCQkJCQkJCQkJICAmcmVzdWx0KTsK KworCQkvKgorCQkgKiBNYWludGFpbiB0aGUgc3RhdGUgdGhhdCB0cmFja3Mgd2hldGhlciBhbGwg YXR0cmlidXRlIGZyb20gdGhlIHR1cGxlCisJCSAqIGFyZSBlcXVhbCB0byB0aGUgYXJyYXkga2V5 cyB0aGF0IHdlJ3ZlIHNldCBhcyBjdXJyZW50IChvciBleGlzdGluZworCQkgKiBhcnJheSBrZXlz IHNldCBkdXJpbmcgZWFybGllciBjYWxscyBoZXJlKS4KKwkJICovCisJCWlmIChyZXN1bHQgIT0g MCkKKwkJCWFsbF9hdHRzX2VxdWFsID0gZmFsc2U7CisKKwkJLyoKKwkJICogT3B0aW1pemF0aW9u OiB3ZSBkb24ndCBoYXZlIHRvIGFkdmFuY2UgcmVtYWluaW5nIG5vbi1yZXF1aXJlZCBhcnJheQor CQkgKiBrZXlzIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoYXQgdHVwbGUgd29uJ3QgYmUgcmV0dXJu ZWQgYnkgdGhlIHNjYW4uCisJCSAqIFF1aXQgYmVmb3JlIHNldHRpbmcgdGhlIGFycmF5IGtleXMg dG8gYXZvaWQgX2J0X3ByZXByb2Nlc3Nfa2V5cy4KKwkJICoKKwkJICogRGVsaWJlcmF0ZWx5IGNo ZWNrIHRoaXMgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBiaW5hcnkgc2VhcmNoLgorCQkgKi8K KwkJaWYgKCFza3JlcXVpcmVkICYmICFhbGxfYXR0c19lcXVhbCkKKwkJCWJyZWFrOworCisJCS8q CisJCSAqIElmIHRoZSBiaW5hcnkgc2VhcmNoIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgc3BhY2Ug Zm9yIHRoaXMgdHVwbGUKKwkJICogYXR0cmlidXRlIHZhbHVlIGlzID4gdGhlIGtleSB2YWx1ZSBm cm9tIHRoZSBmaW5hbCBlbGVtZW50IGluIHRoZQorCQkgKiBhcnJheSAoZmluYWwgZm9yIHRoZSBj dXJyZW50IHNjYW4gZGlyZWN0aW9uKSwgd2UgaGFuZGxlIGl0IGJ5CisJCSAqIHdyYXBwaW5nIGFy b3VuZCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisJCSAqCisJCSAqIFdyYXBw aW5nIGFyb3VuZCBzaW1wbGlmaWVzIGFkdmFuY2VtZW50IHdpdGggYSBtdWx0aS1jb2x1bW4gaW5k ZXggYnkKKwkJICogYWxsb3dpbmcgdXMgdG8gdHJlYXQgd3JhcHBpbmcgYSBjb2x1bW4gYXMgYWR2 YW5jaW5nIHRoZSBjb2x1bW4uICBXZQorCQkgKiBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50IHRoYXQg YSByZXF1aXJlZCBzY2FuIGtleSdzIGFycmF5IG1heSBvbmx5IGJlCisJCSAqIHJhdGNoZXRlZCBm b3J3YXJkIChiYWNrd2FyZHMgd2hlbiB0aGUgc2NhbiBkaXJlY3Rpb24gaXMgYmFja3dhcmRzKSwK KwkJICogd2hpbGUgc3RpbGwgYWx3YXlzIGJlaW5nIGFibGUgdG8gImFkdmFuY2UiIHRoZSBhcnJh eSBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJaWYgKHNldF9lbGVtID09IGZpbmFsX2VsZW1fZGly ICYmCisJCQkoKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSAmJiByZXN1bHQgPiAwKSB8fAor CQkJIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpICYmIHJlc3VsdCA8IDApKSkKKwkJewor CQkJLyogUGVyZm9ybSB3cmFwYXJvdW5kICovCisJCQlzZXRfZWxlbSA9IGZpcnN0X2VsZW1fZGly OworCQl9CisJCWVsc2UgaWYgKHNrcmVxdWlyZWQpCisJCXsKKwkJCS8qIFdvbid0IGNhbGwgX2J0 X2FkdmFuY2VfYXJyYXlfa2V5c190b19lbmQgbGF0ZXIgKi8KKwkJCWFsbF9za3JlcXVpcmVkX2F0 dHNfd3JhcHBlZCA9IGZhbHNlOworCQl9CisKKwkJQXNzZXJ0KHNldF9lbGVtID49IDAgJiYgc2V0 X2VsZW0gPCBhcnJheS0+bnVtX2VsZW1zKTsKKwkJaWYgKGFycmF5LT5jdXJfZWxlbSAhPSBzZXRf ZWxlbSkKKwkJeworCQkJYXJyYXktPmN1cl9lbGVtID0gc2V0X2VsZW07CisJCQlza2V5YXJyYXkt PnNrX2FyZ3VtZW50ID0gYXJyYXktPmVsZW1fdmFsdWVzW3NldF9lbGVtXTsKKwkJCWFycmF5c19h ZHZhbmNlZCA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBXZSBzaG91bGRuJ3QgaGF2ZSB0byBhZHZh bmNlIGEgcmVxdWlyZWQgYXJyYXkgd2hlbiBjYWxsZWQgZHVlCisJCQkgKiB0byBfYnRfY2hlY2tf Y29tcGFyZSBkZXRlcm1pbmluZyB0aGF0IGEgbm9uLXJlcXVpcmVkIGFycmF5CisJCQkgKiBuZWVk cyB0byBiZSBhZHZhbmNlZC4gIFdlIGV4cGVjdCBfYnRfY2hlY2tfY29tcGFyZSB0byBub3RpY2UK KwkJCSAqIGFuZCByZXBvcnQgcmVxdWlyZWQgc2NhbiBrZXlzIGJlZm9yZSBub24tcmVxdWlyZWQg b25lcy4KKwkJCSAqLworCQkJQXNzZXJ0KHNrcmVxdWlyZWR0cmlnZ2VyIHx8ICFza3JlcXVpcmVk KTsKKwkJfQorCX0KKworCS8qCisJICogRmluYWxpemUgZGV0YWlscyBvZiBhcnJheSBrZXkgYWR2 YW5jZW1lbnQKKwkgKi8KKwlhcnJheXNfZG9uZSA9IGZhbHNlOworCWlmICghc2tyZXF1aXJlZHRy aWdnZXIpCisJeworCQkvKgorCQkgKiBGYWlsaW5nIHRvIHNhdGlzZnkgYSBub24tcmVxdWlyZWQg YXJyYXkgc2NhbiBrZXkgc2hvdWxkbid0IGV2ZXIKKwkJICogcmVzdWx0IGluIHRlcm1pbmF0aW5n IHRoZSAocHJpbWl0aXZlKSBpbmRleCBzY2FuCisJCSAqLworCX0KKwllbHNlIGlmIChhbGxfc2ty ZXF1aXJlZF9hdHRzX3dyYXBwZWQpCisJeworCQkvKgorCQkgKiBUaGUgYmluYXJ5IHNlYXJjaGVz IGZvciBlYWNoIHR1cGxlJ3MgYXR0cmlidXRlIHZhbHVlIGluIHRoZSBzY2FuCisJCSAqIGtleSdz IGNvcnJlc3BvbmRpbmcgU0tfU0VBUkNIQVJSQVkgYXJyYXkgYWxsIGZvdW5kIHRoYXQgdGhlIHR1 cGxlJ3MKKwkJICogdmFsdWUgYXJlICJwYXN0IHRoZSBlbmQiIG9mIHRoZSBrZXkgc3BhY2UgY292 ZXJlZCBieSBlYWNoIGFycmF5CisJCSAqLworCQlfYnRfYWR2YW5jZV9hcnJheV9rZXlzX3RvX2Vu ZChzY2FuLCBkaXIpOworCQlhcnJheXNfZG9uZSA9IHRydWU7CisJCWFsbF9hdHRzX2VxdWFsID0g ZmFsc2U7IC8qIGF0IGxlYXN0IG5vdCBub3cgKi8KKwl9CisJZWxzZSBpZiAoIWFycmF5c19hZHZh bmNlZCkKKwl7CisJCS8qCisJCSAqIFdlIG11c3QgYWx3YXlzIGFkdmFuY2UgdGhlIGFycmF5IGtl eXMgYnkgYXQgbGVhc3Qgb25lIGluY3JlbWVudAorCQkgKiAoZXhjZXB0IHdoZW4gY2FsbGVkIHRv IGFkdmFuY2UgYSBub24tcmVxdWlyZWQgc2NhbiBrZXkncyBhcnJheSkuCisJCSAqCisJCSAqIFdl IG5lZWQgdGhpcyBmYWxsYmFjayBmb3IgY2FzZXMgd2hlcmUgdGhlIGV4aXN0aW5nIGFycmF5IGtl eXMgYW5kCisJCSAqIGV4aXN0aW5nIHJlcXVpcmVkIGVxdWFsLXN0cmF0ZWd5IHNjYW4ga2V5cyB3 ZXJlIGZ1bGx5IGVxdWFsIHRvIHRoZQorCQkgKiB0dXBsZS4gIF9idF9jaGVja19jb21wYXJlIG1h eSBoYXZlIHNldCBjb250aW51ZXNjYW49ZmFsc2UgZHVlIHRvIGFuCisJCSAqIGluZXF1YWxpdHkg dGVybWluYXRpbmcgdGhlIHNjYW4sIHdoaWNoIHdlIGRvbid0IGRlYWwgd2l0aCBkaXJlY3RseS4K KwkJICogKFNlZSBmdW5jdGlvbidzIGhlYWRlciBjb21tZW50cyBmb3IgYW4gZXhhbXBsZS4pCisJ CSAqLworCQlpZiAoX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkK KwkJCWFycmF5c19hZHZhbmNlZCA9IHRydWU7CisJCWVsc2UKKwkJCWFycmF5c19kb25lID0gdHJ1 ZTsKKwkJYWxsX2F0dHNfZXF1YWwgPSBmYWxzZTsgLyogYXQgbGVhc3Qgbm90IG5vdyAqLworCX0K KworCS8qCisJICogSWYgd2UgY2hhbmdlZCB0aGUgYXJyYXkga2V5cyAod2l0aG91dCBleGhhdXN0 aW5nIGFsbCBhcnJheSBrZXlzKSwgdGhlbgorCSAqIHdlIG11c3Qgbm93IHBlcmZvcm0gYSB0YXJn ZXRlZCBmb3JtIG9mIGluLXBsYWNlIHByZXByb2Nlc3Npbmcgb2YgdGhlCisJICogc2NhbidzIHNl YXJjaC10eXBlIHNjYW4ga2V5cy4gIFRoaXMgdXBkYXRlcyB0aGUgYXJyYXkgc2NhbiBrZXlzIGlu CisJICogcGxhY2UuICBJdCBkb2Vzbid0IHRyeSB0byBlbGltaW5hdGUgcmVkdW5kYW50IGtleXMs IG5vciBjYW4gaXQgZGV0ZWN0CisJICogY29udHJhZGljdG9yeSBxdWFscy4KKwkgKi8KKwlpZiAo YXJyYXlzX2FkdmFuY2VkICYmICFhcnJheXNfZG9uZSkKKwkJX2J0X3ByZXByb2Nlc3Nfa2V5c19s ZWFmYnVmKHNjYW4pOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlbid0IHlldCBleGhhdXN0ZWQgYWxs IHJlcXVpcmVkIGFycmF5IHNjYW4ga2V5cywgdGhlIHByaW1pdGl2ZQorCSAqIHNjYW4gY29udGlu dWVzIGZvciBub3cuICBOb3RlIHRoYXQgdGhlICFhbGxfYXR0c19lcXVhbCBjYXNlIHdpbGwgaGF2 ZQorCSAqIGFub3RoZXIgY2FsbCB0byBfYnRfY2hlY2tfY29tcGFyZSByaWdodCBhd2F5LCB3aGlj aCB3aWxsIG92ZXJ3cml0ZQorCSAqIGNvbnRpbnVlc2NhbiByaWdodCBhd2F5LgorCSAqCisJICog SWYgYW55IHJlcXVpcmVkIGFycmF5IGtleXMgY2hhbmdlZCwgaXQgbWFrZXMgc2Vuc2UgdG8gY2hl Y2sgdGhlIGhpZ2gKKwkgKiBrZXkgdG8gdGVybWluYXRlIHRoZSBzY2FuIGVhcmx5ICh0aGUgZmFj dCB0aGF0IGl0IG1pZ2h0IG5vdCBoYXZlIHdvcmtlZAorCSAqIHdpdGggcHJldmlvdXMgYXJyYXkg a2V5cyBhbmQgZWFybGllciB0dXBsZXMgdGVsbHMgdXMgbm90aGluZyBhYm91dCB3aGF0CisJICog bWlnaHQgd29yayB3aXRoIG5ldyBhcnJheSBrZXlzIGFuZCBsYXRlciBpbmRleCB0dXBsZXMpLgor CSAqLworCXBzdGF0ZS0+Y29udGludWVzY2FuID0gIWFycmF5c19kb25lOworCWlmIChhcnJheXNf YWR2YW5jZWQgJiYgc2tyZXF1aXJlZHRyaWdnZXIpCisJCXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQg PSBmYWxzZTsKKworCXJldHVybiBhbGxfYXR0c19lcXVhbDsKK30KKworLyoKKyAqIEFkdmFuY2Ug dGhlIGFycmF5IGtleXMgYnkgYSBzaW5nbGUgaW5jcmVtZW50IGluIHRoZSBjdXJyZW50IHNjYW4g ZGlyZWN0aW9uCisgKi8KK3N0YXRpYyBib29sCitfYnRfYWR2YW5jZV9hcnJheV9rZXlzX2luY3Jl bWVudChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQoreworCUJUU2Nhbk9w YXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlib29sCQlmb3VuZCA9IGZh bHNlOworCisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKworCS8qCisJICogV2UgbXVzdCBh ZHZhbmNlIHRoZSBsYXN0IGFycmF5IGtleSBtb3N0IHF1aWNrbHksIHNpbmNlIGl0IHdpbGwKKwkg KiBjb3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qtb3JkZXIgaW5kZXggY29sdW1uIGFtb25nIHRoZSBh dmFpbGFibGUKKwkgKiBxdWFsaWZpY2F0aW9ucy4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJl IGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0CisJICogd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUg YXJyYXkga2V5cy4KKwkgKi8KKwlmb3IgKGludCBpID0gc28tPm51bUFycmF5S2V5cyAtIDE7IGkg Pj0gMDsgaS0tKQorCXsKKwkJQlRBcnJheUtleUluZm8gKmN1ckFycmF5S2V5ID0gJnNvLT5hcnJh eUtleXNbaV07CisJCVNjYW5LZXkJCXNrZXkgPSAmc28tPmFycmF5S2V5RGF0YVtjdXJBcnJheUtl eS0+c2Nhbl9rZXldOworCQlpbnQJCQljdXJfZWxlbSA9IGN1ckFycmF5S2V5LT5jdXJfZWxlbTsK KwkJaW50CQkJbnVtX2VsZW1zID0gY3VyQXJyYXlLZXktPm51bV9lbGVtczsKKworCQlpZiAoU2Nh bkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkKKwkJeworCQkJaWYgKC0tY3VyX2VsZW0gPCAwKQor CQkJeworCQkJCWN1cl9lbGVtID0gbnVtX2VsZW1zIC0gMTsKKwkJCQlmb3VuZCA9IGZhbHNlOwkv KiBuZWVkIHRvIGFkdmFuY2UgbmV4dCBhcnJheSBrZXkgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCQlm b3VuZCA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKytjdXJfZWxlbSA+PSBudW1f ZWxlbXMpCisJCQl7CisJCQkJY3VyX2VsZW0gPSAwOworCQkJCWZvdW5kID0gZmFsc2U7CS8qIG5l ZWQgdG8gYWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLworCQkJfQorCQkJZWxzZQorCQkJCWZvdW5k ID0gdHJ1ZTsKKwkJfQorCisJCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IGN1cl9lbGVtOworCQlz a2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tjdXJfZWxlbV07CisJ CWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworLyoKKyAq IFBlcmZvcm0gZmluYWwgc3RlcHMgd2hlbiB0aGUgImVuZCBwb2ludCIgaXMgcmVhY2hlZCBvbiB0 aGUgbGVhZiBsZXZlbAorICogd2l0aG91dCBhbnkgY2FsbCB0byBfYnRfY2hlY2trZXlzIHNldHRp bmcgKmNvbnRpbnVlc2NhbiB0byBmYWxzZS4KKyAqLworc3RhdGljIHZvaWQKK19idF9hZHZhbmNl X2FycmF5X2tleXNfdG9fZW5kKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIp Cit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCisJ QXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisK Kwlmb3IgKGludCBpID0gMDsgaSA8IHNvLT5udW1BcnJheUtleXM7IGkrKykKKwl7CisJCUJUQXJy YXlLZXlJbmZvICpjdXJBcnJheUtleSA9ICZzby0+YXJyYXlLZXlzW2ldOworCQlTY2FuS2V5CQlz a2V5ID0gJnNvLT5hcnJheUtleURhdGFbY3VyQXJyYXlLZXktPnNjYW5fa2V5XTsKKwkJaW50CQkJ cmVzZXRfZWxlbTsKKworCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJcmVz ZXRfZWxlbSA9IGN1ckFycmF5S2V5LT5udW1fZWxlbXMgLSAxOworCQllbHNlCisJCQlyZXNldF9l bGVtID0gMDsKKworCQlpZiAoY3VyQXJyYXlLZXktPmN1cl9lbGVtICE9IHJlc2V0X2VsZW0pCisJ CXsKKwkJCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IHJlc2V0X2VsZW07CisJCQlza2V5LT5za19h cmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tyZXNldF9lbGVtXTsKKwkJfQorCX0K K30KIAogLyoKICAqCV9idF9wcmVwcm9jZXNzX2tleXMoKSAtLSBQcmVwcm9jZXNzIHNjYW4ga2V5 cwpAQCAtNzQ5LDYgKzE1NjgsMjEgQEAgX2J0X3Jlc3RvcmVfYXJyYXlfa2V5cyhJbmRleFNjYW5E ZXNjIHNjYW4pCiAgKiBBZ2FpbiwgbWlzc2luZyBjcm9zcy10eXBlIG9wZXJhdG9ycyBtaWdodCBj YXVzZSB1cyB0byBmYWlsIHRvIHByb3ZlIHRoZQogICogcXVhbHMgY29udHJhZGljdG9yeSB3aGVu IHRoZXkgcmVhbGx5IGFyZSwgYnV0IHRoZSBzY2FuIHdpbGwgd29yayBjb3JyZWN0bHkuCiAgKgor ICogSW5kZXggc2NhbnMgd2l0aCBhcnJheSBrZXlzIG5lZWQgdG8gYmUgYWJsZSB0byBhZHZhbmNl IGVhY2ggYXJyYXkncyBrZXlzCisgKiBhbmQgbWFrZSB0aGVtIHRoZSBjdXJyZW50IHNlYXJjaC10 eXBlIHNjYW4ga2V5cyB3aXRob3V0IGNhbGxpbmcgaGVyZS4gIFRoZXkKKyAqIGV4cGVjdCB0byBi ZSBhYmxlIHRvIGNhbGwgX2J0X3ByZXByb2Nlc3Nfa2V5c19sZWFmYnVmIGluc3RlYWQgKGEgc3Ry aXBwZWQKKyAqIGRvd24gdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIHRoYXQncyBzcGVjaWFsaXpl ZCB0byBhcnJheSBrZXkgaW5kZXggc2NhbnMpLgorICogV2UgbmVlZCB0byBiZSBjYXJlZnVsIGFi b3V0IHRoYXQgY2FzZSBoZXJlIHdoZW4gd2UgZGV0ZXJtaW5lIHJlZHVuZGFuY3k7CisgKiBlcXVh bGl0eSBxdWFscyBtdXN0IG5vdCBiZSBlbGltaW5hdGVkIGFzIHJlZHVuZGFudCBvbiB0aGUgYmFz aXMgb2YgYXJyYXkKKyAqIGlucHV0IGtleXMgdGhhdCBtaWdodCBjaGFuZ2UgYmVmb3JlIGFub3Ro ZXIgY2FsbCBoZXJlIHRha2VzIHBsYWNlLgorICoKKyAqIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhl IHByZXNlbmNlIG9mIGFuIGFycmF5IHNjYW4ga2V5IGRvZXNuJ3QgYWZmZWN0IGhvdyB3ZQorICog ZGV0ZXJtaW5lIGlmIGluZGV4IHF1YWxzIGFyZSBjb250cmFkaWN0b3J5LiAgQ29udHJhZGljdG9y eSBxdWFsIHNjYW5zIG1vdmUKKyAqIG9uIHRvIHRoZSBuZXh0IHByaW1pdGl2ZSBpbmRleCBzY2Fu IHJpZ2h0IGF3YXksIGJ5IGluY3JlbWVudGluZyB0aGUgc2NhbidzCisgKiBhcnJheSBrZXlzIG9u Y2UgY29udHJvbCByZWFjaGVzIF9idF9hcnJheV9rZXlzX3JlbWFpbi4gIFRoZXJlIHdvbid0IGV2 ZXIgYmUKKyAqIGEgY2FsbCB0byBfYnRfcHJlcHJvY2Vzc19rZXlzX2xlYWZidWYgYmVmb3JlIHRo ZSBuZXh0IGNhbGwgaGVyZSwgc28gdGhlcmUKKyAqIGlzIG5vdGhpbmcgZm9yIHVzIHRvIGJyZWFr LgorICoKICAqIFJvdyBjb21wYXJpc29uIGtleXMgYXJlIGN1cnJlbnRseSBhbHNvIHRyZWF0ZWQg d2l0aG91dCBhbnkgc21hcnRzOgogICogd2UganVzdCB0cmFuc2ZlciB0aGVtIGludG8gdGhlIHBy ZXByb2Nlc3NlZCBhcnJheSB3aXRob3V0IGFueQogICogZWRpdG9yaWFsaXphdGlvbi4gIFdlIGNh biB0cmVhdCB0aGVtIHRoZSBzYW1lIGFzIGFuIG9yZGluYXJ5IGluZXF1YWxpdHkKQEAgLTg5NSw4 ICsxNzI5LDExIEBAIF9idF9wcmVwcm9jZXNzX2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCQkJ CQkJCXNvLT5xdWFsX29rID0gZmFsc2U7CiAJCQkJCQkJcmV0dXJuOwogCQkJCQkJfQotCQkJCQkJ LyogZWxzZSBkaXNjYXJkIHRoZSByZWR1bmRhbnQgbm9uLWVxdWFsaXR5IGtleSAqLwotCQkJCQkJ eGZvcm1bal0gPSBOVUxMOworCQkJCQkJZWxzZSBpZiAoIShlcS0+c2tfZmxhZ3MgJiBTS19TRUFS Q0hBUlJBWSkpCisJCQkJCQl7CisJCQkJCQkJLyogZWxzZSBkaXNjYXJkIHRoZSByZWR1bmRhbnQg bm9uLWVxdWFsaXR5IGtleSAqLworCQkJCQkJCXhmb3JtW2pdID0gTlVMTDsKKwkJCQkJCX0KIAkJ CQkJfQogCQkJCQkvKiBlbHNlLCBjYW5ub3QgZGV0ZXJtaW5lIHJlZHVuZGFuY3ksIGtlZXAgYm90 aCBrZXlzICovCiAJCQkJfQpAQCAtOTk0LDEyICsxODMxLDI4IEBAIF9idF9wcmVwcm9jZXNzX2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCQl9CiAJCWVsc2UKIAkJewotCQkJLyogeXVwLCBrZWVw IG9ubHkgdGhlIG1vcmUgcmVzdHJpY3RpdmUga2V5ICovCisJCQkvKiB5dXAsIGtlZXAgb25seSB0 aGUgbW9yZSByZXN0cmljdGl2ZSBub24tZXF1YWxpdHkga2V5ICovCiAJCQlpZiAoX2J0X2NvbXBh cmVfc2NhbmtleV9hcmdzKHNjYW4sIGN1ciwgY3VyLCB4Zm9ybVtqXSwKIAkJCQkJCQkJCQkgJnRl c3RfcmVzdWx0KSkKIAkJCXsKIAkJCQlpZiAodGVzdF9yZXN1bHQpCi0JCQkJCXhmb3JtW2pdID0g Y3VyOworCQkJCXsKKwkJCQkJaWYgKGogPT0gKEJURXF1YWxTdHJhdGVneU51bWJlciAtIDEpKQor CQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICogS2VlcCByZWR1bmRhbnQgPSBvcGVyYXRvcnMgc28g dGhhdCBhcnJheSBzY2FuIGtleXMKKwkJCQkJCSAqIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQsIGFz IGV4cGVjdGVkIGJ5IG91ciBzaWJsaW5nCisJCQkJCQkgKiBfYnRfcHJlcHJvY2Vzc19rZXlzX2xl YWZidWYgZnVuY3Rpb24uCisJCQkJCQkgKi8KKwkJCQkJCVNjYW5LZXkJCW91dGtleSA9ICZvdXRr ZXlzW25ld19udW1iZXJPZktleXMrK107CisKKwkJCQkJCW1lbWNweShvdXRrZXksIGN1ciwgc2l6 ZW9mKFNjYW5LZXlEYXRhKSk7CisJCQkJCQlpZiAobnVtYmVyT2ZFcXVhbENvbHMgPT0gYXR0bm8g LSAxKQorCQkJCQkJCV9idF9tYXJrX3NjYW5rZXlfcmVxdWlyZWQob3V0a2V5KTsKKwkJCQkJfQor CQkJCQllbHNlCisJCQkJCQl4Zm9ybVtqXSA9IGN1cjsKKwkJCQl9CiAJCQkJZWxzZSBpZiAoaiA9 PSAoQlRFcXVhbFN0cmF0ZWd5TnVtYmVyIC0gMSkpCiAJCQkJewogCQkJCQkvKiBrZXkgPT0gYSAm JiBrZXkgPT0gYiwgYnV0IGEgIT0gYiAqLwpAQCAtMTAyNyw2ICsxODgwLDUxIEBAIF9idF9wcmVw cm9jZXNzX2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCXNvLT5udW1iZXJPZktleXMgPSBuZXdf bnVtYmVyT2ZLZXlzOwogfQogCisvKgorICoJX2J0X3ByZXByb2Nlc3Nfa2V5c19sZWFmYnVmKCkg LS0gUHJlcHJvY2VzcyBhcnJheSBzY2FuIGtleXMgb25seQorICoKKyAqIFN0cmlwcGVkIGRvd24g dmVyc2lvbiBvZiBfYnRfcHJlcHJvY2Vzc19rZXlzIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIGEK KyAqIGJ1ZmZlciBsb2NrIGhlbGQuICBSZXVzZXMgbXVjaCBvZiB0aGUgd29yayBwZXJmb3JtZWQg ZHVyaW5nIHRoZSBwcmV2aW91cworICogX2J0X3ByZXByb2Nlc3Nfa2V5cyBjYWxsLgorICoKKyAq IFRoaXMgZnVuY3Rpb24ganVzdCB0cmFuc2ZlcnMgbmV3bHkgYWR2YW5jZWQgYXJyYXkga2V5cyB0 aGF0IHdlcmUgc2V0IGluCisgKiAic28tPmFycmF5S2V5RGF0YSIgdG8gY29ycmVzcG9uZGluZyAi c28tPmtleURhdGEiIHNlYXJjaC10eXBlIHNjYW4ga2V5cy4KKyAqIEl0IGRvZXMgbm90IGluZGVw ZW5kZW50bHkgZGV0ZWN0IHJlZHVuYW50IG9yIGNvbnRyYWRpY3Rvcnkgc2NhbiBrZXlzLiAgVGhp cworICogbWFrZXMgbGl0dGxlIGRpZmZlcmVuY2UgaW4gcHJhY3RpY2UgLS0gd2UgcmVseSBvbiBf YnRfcHJlcHJvY2Vzc19rZXlzIGNhbGxzCisgKiBmcm9tIF9idF9maXJzdCB0byBnZXQgbW9zdCBv ZiB0aGUgYXZhaWxhYmxlIGJlbmVmaXQuCisgKi8KK3N0YXRpYyB2b2lkCitfYnRfcHJlcHJvY2Vz c19rZXlzX2xlYWZidWYoSW5kZXhTY2FuRGVzYyBzY2FuKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9 IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlTY2FuS2V5CQljdXI7CisJaW50CQkJaWtl eSwKKwkJCQlhcnJheWlkeCA9IDA7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlEYXRhLCBpa2V5ID0g MDsgaWtleSA8IHNvLT5udW1iZXJPZktleXM7IGN1cisrLCBpa2V5KyspCisJeworCQlCVEFycmF5 S2V5SW5mbyAqYXJyYXk7CisJCVNjYW5LZXkJCXNrZXlhcnJheTsKKworCQkvKiBKdXN0IHVwZGF0 ZSBlcXVhbGl0eSBhcnJheSBzY2FuIGtleXMgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgIT0g QlRFcXVhbFN0cmF0ZWd5TnVtYmVyIHx8CisJCQkhKGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hB UlJBWSkpCisJCQljb250aW51ZTsKKworCQlBc3NlcnQoYXJyYXlpZHggPCBzby0+bnVtQXJyYXlL ZXlzKTsKKwkJYXJyYXkgPSAmc28tPmFycmF5S2V5c1thcnJheWlkeCsrXTsKKwkJc2tleWFycmF5 ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsKKworCQkvKgorCQkgKiBVcGRh dGUgdGhlIHNjYW4ga2V5J3MgYXJndW1lbnQsIGJ1dCBub3RoaW5nIG1vcmUKKwkJICovCisJCUFz c2VydChjdXItPnNrX2F0dG5vID09IHNrZXlhcnJheS0+c2tfYXR0bm8pOworCQljdXItPnNrX2Fy Z3VtZW50ID0gc2tleWFycmF5LT5za19hcmd1bWVudDsKKwl9CisKKwlBc3NlcnQoYXJyYXlpZHgg PT0gc28tPm51bUFycmF5S2V5cyk7Cit9CisKIC8qCiAgKiBDb21wYXJlIHR3byBzY2Fua2V5IHZh bHVlcyB1c2luZyBhIHNwZWNpZmllZCBvcGVyYXRvci4KICAqCkBAIC0xMzYwLDQxICsyMjU4LDIw OSBAQCBfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVkKFNjYW5LZXkgc2tleSkKICAqCiAgKiBSZXR1 cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90LiAgSWYgdGhlIHR1cGxlIGZhaWxzIHRvIHBhc3Mg dGhlIHF1YWwsCiAgKiB3ZSBhbHNvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlJ3MgYW55IG5lZWQg dG8gY29udGludWUgdGhlIHNjYW4gYmV5b25kCi0gKiB0aGlzIHR1cGxlLCBhbmQgc2V0ICpjb250 aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9yCisgKiB0aGlzIHR1cGxlLCBh bmQgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9y CiAgKiBfYnRfcHJlcHJvY2Vzc19rZXlzKCksIGFib3ZlLCBhYm91dCBob3cgdGhpcyBpcyBkb25l LgogICoKLSAqIEZvcndhcmQgc2NhbiBjYWxsZXJzIGNhbiBwYXNzIGEgaGlnaCBrZXkgdHVwbGUg aW4gdGhlIGhvcGVzIG9mIGhhdmluZwotICogdXMgc2V0ICpjb250aW51ZXNjYW4gdG8gZmFsc2Us IGFuZCBhdm9pZGluZyBhbiB1bm5lY2Vzc2FyeSB2aXNpdCB0bwotICogdGhlIHBhZ2UgdG8gdGhl IHJpZ2h0LgorICogRm9yd2FyZCBzY2FuIGNhbGxlcnMgY2FuIHBhc3MgYSBoaWdoIGtleSB0dXBs ZSBpbiB0aGUgaG9wZXMgb2YgaGF2aW5nIHVzCisgKiBzZXQgcHN0YXRlLmNvbnRpbnVlc2NhbiB0 byBmYWxzZSwgYW5kIGF2b2lkaW5nIGFuIHVubmVjZXNzYXJ5IHZpc2l0IHRvIHRoZQorICogcGFn ZSB0byB0aGUgcmlnaHQuCisgKgorICogRm9yd2FyZHMgc2NhbiBjYWxsZXJzIHdpdGggZXF1YWxp dHkgdHlwZSBhcnJheSBzY2FuIGtleXMgYXJlIG9ibGlnYXRlZCB0bworICogc2V0IHVwIHBhZ2Ug c3RhdGUgaW4gYSB3YXkgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXMgdG8gY2hlY2sgdGhl IGhpZ2gKKyAqIGtleSBlYXJseSwgYmVmb3JlIHdlJ3ZlIGV4cGVuZGVkIHRvbyBtdWNoIGVmZm9y dCBvbiBjb21wYXJpbmcgdHVwbGVzIHRoYXQKKyAqIGNhbm5vdCBwb3NzaWJseSBiZSBtYXRjaGVz IGZvciBhbnkgc2V0IG9mIGFycmF5IGtleXMuICBUaGlzIGlzIGp1c3QgYW4KKyAqIG9wdGltaXph dGlvbi4KKyAqCisgKiBBZHZhbmNlcyB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cyBmb3Ig U0tfU0VBUkNIQVJSQVkgc2NhbnMgd2hlcmUKKyAqIGFwcHJvcHJpYXRlLiAgVGhlc2UgY2FsbGVy cyBhcmUgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFnZSBsZXZlbCBoaWdoCisgKiBrZXkg aW4gcHN0YXRlIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBoZXJlIGZvciB0aGUgcGFnZSAod2hlbiB0 aGUgc2NhbgorICogZGlyZWN0aW9uIGlzIGZvcndhcmRzKS4gIE5vdGUgdGhhdCB3ZSByZWx5IG9u IF9idF9yZWFkcGFnZSBjYWxsaW5nIGhlcmUgaW4KKyAqIHBhZ2Ugb2Zmc2V0IG51bWJlciBvcmRl ciAoZm9yIGl0cyBzY2FuIGRpcmVjdGlvbikuICBBbnkgb3RoZXIgb3JkZXIgd2lsbAorICogbGVh ZCB0byBpbmNvbnNpc3RlbnQgYXJyYXkga2V5IHN0YXRlLgogICoKICAqIHNjYW46IGluZGV4IHNj YW4gZGVzY3JpcHRvciAoY29udGFpbmluZyBhIHNlYXJjaC10eXBlIHNjYW5rZXkpCisgKiBwc3Rh dGU6IFBhZ2UgbGV2ZWwgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzCiAgKiB0dXBsZTogaW5k ZXggdHVwbGUgdG8gdGVzdAotICogdHVwbmF0dHM6IG51bWJlciBvZiBhdHRyaWJ1dGVzIGluIHR1 cG5hdHRzIChoaWdoIGtleSBtYXkgYmUgdHJ1bmNhdGVkKQotICogZGlyOiBkaXJlY3Rpb24gd2Ug YXJlIHNjYW5uaW5nIGluCi0gKiBjb250aW51ZXNjYW46IG91dHB1dCBwYXJhbWV0ZXIgKHdpbGwg YmUgc2V0IGNvcnJlY3RseSBpbiBhbGwgY2FzZXMpCisgKiBmaW5hbHR1cDogSXMgdHVwbGUgdGhl IGZpbmFsIG9uZSB3ZSdsbCBiZSBjYWxsZWQgd2l0aCBmb3IgdGhpcyBwYWdlPwogICogcmVxdWly ZWRNYXRjaGVkQnlQcmVjaGVjazogaW5kaWNhdGVzIHRoYXQgc2NhbiBrZXlzIHJlcXVpcmVkIGZv cgogICogCQkJCQkJCSAgZGlyZWN0aW9uIHNjYW4gYXJlIGFscmVhZHkgbWF0Y2hlZAogICovCiBi b29sCi1fYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwg aW50IHR1cG5hdHRzLAotCQkJICBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCAqY29udGludWVzY2Fu LAorX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0 YXRlLAorCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVwLAogCQkJICBib29sIHJl cXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spCiB7Ci0JVHVwbGVEZXNjCXR1cGRlc2M7Ci0JQlRTY2Fu T3BhcXVlIHNvOwotCWludAkJCWtleXN6OworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25H ZXREZXNjcihzY2FuLT5pbmRleFJlbGF0aW9uKTsKKwlpbnQJCQluYXR0cyA9IEJUcmVlVHVwbGVH ZXROQXR0cyh0dXBsZSwgc2Nhbi0+aW5kZXhSZWxhdGlvbik7CisJQlRTY2FuT3BhcXVlIHNvID0g KEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCWJvb2wJCXJlczsKKwlib29sCQlza3JlcXVp cmVkdHJpZ2dlcjsKKworCUFzc2VydChzby0+cXVhbF9vayk7CisJQXNzZXJ0KHBzdGF0ZS0+Y29u dGludWVzY2FuKTsKKwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJcmVzID0gX2J0X2No ZWNrX2NvbXBhcmUocHN0YXRlLT5kaXIsIHNvLCB0dXBsZSwgbmF0dHMsIHR1cGRlc2MsCisJCQkJ CQkJJnBzdGF0ZS0+Y29udGludWVzY2FuLCAmc2tyZXF1aXJlZHRyaWdnZXIsCisJCQkJCQkJcmVx dWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CisKKwkvKgorCSAqIE9ubHkgb25lIF9idF9jaGVja19j b21wYXJlIGNhbGwgaXMgcmVxdWlyZWQgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlCisJICogdGhl cmUgYXJlIG5vIGVxdWFsaXR5LXR5cGUgYXJyYXkgc2NhbiBrZXlzLgorCSAqCisJICogV2hlbiB0 aGVyZSBhcmUgYXJyYXkgc2NhbiBrZXlzIHRoZW4gd2UgY2FuIHN0aWxsIGFjY2VwdCB0aGUgZmly c3QKKwkgKiBhbnN3ZXIgd2UgZ2V0IGZyb20gX2J0X2NoZWNrX2NvbXBhcmUgd2hlbiBjb250aW51 ZXNjYW4gd2Fzbid0IHVuc2V0LgorCSAqLworCWlmICghc28tPm51bUFycmF5S2V5cyB8fCBwc3Rh dGUtPmNvbnRpbnVlc2NhbikKKwkJcmV0dXJuIHJlczsKKworCS8qCisJICogX2J0X2NoZWNrX2Nv bXBhcmUgc2V0IGNvbnRpbnVlc2Nhbj1mYWxzZSBpbiB0aGUgcHJlc2VuY2Ugb2YgZXF1YWxpdHkK KwkgKiB0eXBlIGFycmF5IGtleXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZW4ndCByZWFj aGVkIHRoZSBzdGFydCBvZgorCSAqIHRoZSBhcnJheSBrZXlzIGp1c3QgeWV0LiAgSXQncyBhbHNv IHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBhZHZhbmNlCisJICogdGhlIGFycmF5IGtleXMgbm93 LiAgKE9yIHBlcmhhcHMgd2UgcmVhbGx5IGRvIG5lZWQgdG8gdGVybWluYXRlIHRoZQorCSAqIHRv cC1sZXZlbCBzY2FuLikKKwkgKi8KKwlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRydWU7CS8qIG5l dyBpbml0aWFsIGFzc3VtcHRpb24gKi8KKworCWlmIChza3JlcXVpcmVkdHJpZ2dlciAmJiBfYnRf dHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKHNjYW4sIHBzdGF0ZSwgdHVwbGUpKQorCXsKKwkJLyoK KwkJICogVHVwbGUgaXMgc3RpbGwgPCB0aGUgY3VycmVudCBhcnJheSBzY2FuIGtleSB2YWx1ZXMg KGFzIHdlbGwgYXMKKwkJICogb3RoZXIgZXF1YWxpdHkgdHlwZSBzY2FuIGtleXMpIGlmIHRoaXMg aXMgYSBmb3J3YXJkIHNjYW4uCisJCSAqIChCYWNrd2FyZHMgc2NhbnMgcmVhY2ggaGVyZSB3aXRo IGEgdHVwbGUgPiBlcXVhbGl0eSBjb25zdHJhaW50cy4pCisJCSAqIFdlIG11c3Qgbm93IGNvbnNp ZGVyIGhvdyB0byBwcm9jZWVkIHdpdGggdGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJCSAqIGluZGV4 IHNjYW4uCisJCSAqCisJCSAqIFNob3VsZCBfYnRfcmVhZHBhZ2UgY29udGludWUgd2l0aCB0aGlz IHBhZ2UgZm9yIG5vdywgaW4gdGhlIGhvcGUgb2YKKwkJICogZmluZGluZyB0dXBsZXMgd2hvc2Ug a2V5IHNwYWNlIGlzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgYXJyYXkga2V5cworCQkgKiBiZWZv cmUgdG9vIGxvbmc/ICBPciwgc2hvdWxkIGl0IGdpdmUgdXAgYW5kIHN0YXJ0IGEgbmV3IHByaW1p dGl2ZQorCQkgKiBpbmRleCBzY2FuIGluc3RlYWQ/CisJCSAqCisJCSAqIE91ciBwb2xpY3kgaXMg dG8gdGVybWluYXRlIHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBhdCB0aGUgZW5kIG9mCisJCSAq IHRoZSBjdXJyZW50IHBhZ2UgaWYgdGhlIGN1cnJlbnQgKG1vc3QgcmVjZW50bHkgYWR2YW5jZWQp IGFycmF5IGtleXMKKwkJICogZG9uJ3QgY292ZXIgdGhlIGZpbmFsIHR1cGxlIGZyb20gdGhlIHBh Z2UuICBUaGlzIHBvbGljeSBpcyBmYWlybHkKKwkJICogY29uc2VydmF0aXZlLgorCQkgKgorCQkg KiBOb3RlOiBJbiBzb21lIGNhc2VzIHdlJ3JlIGVmZmVjdGl2ZWx5IHNwZWN1bGF0aW5nIHRoYXQg dGhlIG5leHQKKwkJICogc2libGluZyBsZWFmIHBhZ2Ugd2lsbCBoYXZlIHR1cGxlcyB0aGF0IGFy ZSBjb3ZlcmVkIGJ5IHRoZSBrZXkKKwkJICogc3BhY2Ugb2Ygb3VyIGFycmF5IGtleXMgKHRoZSBj dXJyZW50IHNldCBvciBzb21lIG5lYXJieSBzZXQpLCBiYXNlZAorCQkgKiBvbiBhIGN1ZSBmcm9t IHRoZSBjdXJyZW50IHBhZ2UncyBmaW5hbCB0dXBsZS4gIFRoZXJlIGlzIGF0IGxlYXN0IGEKKwkJ ICogbm9uLXplcm8gcmlzayBvZiB3YXN0aW5nIGEgcGFnZSBhY2Nlc3MgLS0gd2UgY291bGQgZ2Ft YmxlIGFuZCBsb3NlLgorCQkgKiBUaGUgZGV0YWlscyBvZiBhbGwgdGhpcyBhcmUgaGFuZGxlZCB3 aXRoaW4gX2J0X2FkdmFuY2VfYXJyYXlfa2V5cy4KKwkJICovCisJCWlmIChmaW5hbHR1cCB8fCAo IXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQgJiYgcHN0YXRlLT5oaWdoa2V5ICYmCisJCQkJCQkgX2J0 X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyhzY2FuLCBwc3RhdGUsCisJCQkJCQkJCQkJCQkJICBw c3RhdGUtPmhpZ2hrZXkpKSkKKwkJeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIGZpbmFsIHR1 cGxlICh0aGUgaGlnaCBrZXkgZm9yIGZvcndhcmQgc2NhbnMsIG9yIHRoZQorCQkJICogdHVwbGUg YXQgdGhlIGZpcnN0IG9mZnNldCBudW1iZXIgZm9yIGJhY2t3YXJkIHNjYW5zKSwgYnV0IGl0IGlz CisJCQkgKiBzdGlsbCBiZWZvcmUgdGhlIGN1cnJlbnQgYXJyYXkga2V5cy4gIEFzIHN1Y2gsIHdl J3JlIHVud2lsbGluZworCQkJICogdG8gYWxsb3cgdGhlIGN1cnJlbnQgcHJpbWl0aXZlIGluZGV4 IHNjYW4gdG8gY29udGludWUgdG8gdGhlCisJCQkgKiBuZXh0IGxlYWYgcGFnZS4KKwkJCSAqCisJ CQkgKiBTdGFydCBhIG5ldyBwcmltaXRpdmUgaW5kZXggc2Nhbi4gIFRoZSBuZXh0IHByaW1pdGl2 ZSBpbmRleAorCQkJICogc2NhbiAoaW4gdGhlIG5leHQgX2J0X2ZpcnN0IGNhbGwpIGlzIGV4cGVj dGVkIHRvIHJlcG9zaXRpb24gdGhlCisJCQkgKiBzY2FuIHRvIHNvbWUgbXVjaCBsYXRlciBsZWFm IHBhZ2UuICAoSWYgd2UgaGFkIGEgZ29vZCByZWFzb24gdG8KKwkJCSAqIHRoaW5rIHRoYXQgdGhl IG5leHQgbGVhZiBwYWdlIHRoYXQgd2lsbCBiZSBzY2FubmVkIHdpbGwgdHVybgorCQkJICogb3V0 IHRvIGJlIGNsb3NlIHRvIG91ciBjdXJyZW50IHBvc2l0aW9uLCB0aGVuIHdlIHdvdWxkbid0IGJl CisJCQkgKiBzdGFydGluZyBhbm90aGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuLikKKwkJCSAqCisJ CQkgKiBOb3RlOiBfYnRfcmVhZHBhZ2Ugc3Rhc2hlcyB0aGUgcGFnZSBoaWdoIGtleSwgd2hpY2gg YWxsb3dzIHVzCisJCQkgKiB0byBtYWtlIHRoaXMgY2hlY2sgZWFybHkgKGZvciBmb3J3YXJkIHNj YW5zKS4gIFdlIHRoZXJlYnkgYXZvaWQKKwkJCSAqIHNjYW5uaW5nIHZlcnkgbWFueSBleHRyYSB0 dXBsZXMgb24gdGhlIHBhZ2UuICBUaGlzIGlzIGp1c3QgYW4KKwkJCSAqIG9wdGltaXphdGlvbjsg c2tpcHBpbmcgdGhlc2UgdXNlbGVzcyBjb21wYXJpc29ucyBzaG91bGQgbmV2ZXIKKwkJCSAqIGNo YW5nZSBvdXIgZmluYWwgY29uY2x1c2lvbiBhYm91dCB3aGF0IHRoZSBzY2FuIHNob3VsZCBkbyBu ZXh0LgorCQkJICovCisJCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IGZhbHNlOworCQkJc28tPm5l ZWRQcmltU2NhbiA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIWZpbmFsdHVwICYmIHBzdGF0ZS0+ aGlnaGtleSkKKwkJeworCQkJLyoKKwkJCSAqIFJlbWVtYmVyIHRoYXQgdGhlIGhpZ2gga2V5IGhh cyBiZWVuIGNoZWNrZWQgd2l0aCB0aGlzCisJCQkgKiBwYXJ0aWN1bGFyIHNldCBvZiBhcnJheSBr ZXlzLgorCQkJICoKKwkJCSAqIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgdGhlIHNhbWUg aGlnaCBrZXkgYWdhaW4gYXQgc29tZQorCQkJICogcG9pbnQgZHVyaW5nIHRoZSBvbmdvaW5nIF9i dF9yZWFkcGFnZS13aXNlIHNjYW4gb2YgdGhpcyBwYWdlLgorCQkJICogQnV0IGl0IGlzIGRlZmlu aXRlbHkgd2FzdGVmdWwgdG8gcmVwZWF0IHRoZSBzYW1lIGhpZ2gga2V5IGNoZWNrCisJCQkgKiBi ZWZvcmUgdGhlIGFycmF5IGtleXMgYXJlIGFkdmFuY2VkIGJ5IHNvbWUgbGF0ZXIgdHVwbGUuCisJ CQkgKi8KKwkJCXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQgPSB0cnVlOworCQl9CisKKwkJLyoKKwkJ ICogSW4gYW55IGNhc2UsIHRoaXMgaW5kZXh0dXBsZSBkb2Vzbid0IG1hdGNoIHRoZSBxdWFsCisJ CSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBDYWxsZXIncyB0dXBsZSBpcyA+ PSB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cyBhbmQgb3RoZXIgZXF1YWxpdHkKKwkgKiBj b25zdHJhaW50IHNjYW4ga2V5cyAob3IgPD0gaWYgdGhpcyBpcyBhIGJhY2t3YXJkcyBzY2Fucyku CisJICoKKwkgKiBJdCBtaWdodCBiZSB0aW1lIHRvIGFkdmFuY2UgdGhlIGFycmF5IGtleXMgdG8g dGhlIG5leHQgc2V0LiAgVHJ5IGRvaW5nCisJICogdGhhdCBub3csIHdoaWxlIGRldGVybWluaW5n IGluIHBhc3NpbmcgaWYgdGhlIHR1cGxlIG1hdGNoZXMgdGhlIG5ld2x5CisJICogYWR2YW5jZWQg c2V0IG9mIGFycmF5IGtleXMgKGlmIHdlJ3ZlIGFueSBsZWZ0KS4KKwkgKgorCSAqIFRoaXMgY2Fs bCB3aWxsIGFsc28gc2V0IGNvbnRpbnVlc2NhbiBmb3IgdXMgKG9yIHRlbGxzIHVzIHRvIHBlcmZv cm0KKwkgKiBhbm90aGVyIF9idF9jaGVja19jb21wYXJlIGNhbGwsIHdoaWNoIHRoZW4gc2V0cyBj b250aW51ZXNjYW4gZm9yIHVzKS4KKwkgKi8KKwlpZiAoIV9idF9hZHZhbmNlX2FycmF5X2tleXMo c2NhbiwgcHN0YXRlLCB0dXBsZSwgc2tyZXF1aXJlZHRyaWdnZXIpKQorCXsKKwkJLyoKKwkJICog VHVwbGUgZG9lc24ndCBtYXRjaCBhbnkgbGF0ZXIgYXJyYXkga2V5cywgZWl0aGVyLiAgR2l2ZSB1 cCBvbiB0aGlzCisJCSAqIHR1cGxlIGJlaW5nIGEgbWF0Y2guICAoQ2FsbCBtYXkgaGF2ZSBhbHNv IHRlcm1pbmF0ZWQgdGhlIHByaW1pdGl2ZQorCQkgKiBzY2FuLCBvciB0aGUgdG9wLWxldmVsIHNj YW4uKQorCQkgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQWR2YW5jZWQgYXJy YXkga2V5cyB0byB2YWx1ZXMgdGhhdCBhcmUgZXhhY3QgbWF0Y2hlcyBmb3IgY29ycmVzcG9uZGlu ZworCSAqIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisJICoKKwkgKiBJdCdzIGZh aXJseSBsaWtlbHkgdGhhdCB0aGUgdHVwbGUgc2F0aXNmaWVzIGFsbCBpbmRleCBzY2FuIGNvbmRp dGlvbnMKKwkgKiBhdCB0aGlzIHBvaW50LCBidXQgd2UgbmVlZCBjb25maXJtYXRpb24gb2YgdGhh dC4gIFdlIGFsc28gbmVlZCB0byBnaXZlCisJICogX2J0X2NoZWNrX2NvbXBhcmUgYSByZWFsIG9w cG9ydHVuaXR5IHRvIGVuZCB0aGUgdG9wLWxldmVsIGluZGV4IHNjYW4gYnkKKwkgKiBzZXR0aW5n IGNvbnRpbnVlc2Nhbj1mYWxzZS4gIChfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGNhbm5vdCBkZWFs IHdpdGgKKwkgKiBpbmVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5czsgd2UgbmVlZCBfYnRfY2hl Y2tfY29tcGFyZSBmb3IgdGhvc2UuKQorCSAqLworCXJldHVybiBfYnRfY2hlY2tfY29tcGFyZShw c3RhdGUtPmRpciwgc28sIHR1cGxlLCBuYXR0cywgdHVwZGVzYywKKwkJCQkJCQkgJnBzdGF0ZS0+ Y29udGludWVzY2FuLCAmc2tyZXF1aXJlZHRyaWdnZXIsCisJCQkJCQkJIGZhbHNlKTsKK30KKwor LyoKKyAqIFRlc3Qgd2hldGhlciBhbiBpbmRleHR1cGxlIHNhdGlzZmllcyBjdXJyZW50IHNjYW4g Y29uZGl0aW9uLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHNvLCBmYWxzZSBpZiBub3QuICBJZiBu b3QsIGFsc28gY2xlYXIgKmNvbnRpbnVlc2NhbiBpZgorICogaXQncyBub3QgcG9zc2libGUgZm9y IGFueSBmdXR1cmUgdHVwbGVzIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uIHRvCisgKiBw YXNzIHRoZSBxdWFsIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5IGtleXMuCisgKgorICog VGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja2tleXMuICBJdCBpcyB3cml0dGVuIHdp dGggdGhlIGFzc3VtcHRpb24KKyAqIHRoYXQgcmVhY2hpbmcgdGhlIGVuZCBvZiBlYWNoIGRpc3Rp bmN0IHNldCBvZiBhcnJheSBrZXlzIHRlcm1pbmF0ZXMgdGhlCisgKiBvbmdvaW5nIHByaW1pdGl2 ZSBpbmRleCBzY2FuLiAgSXQgaXMgdXAgdG8gb3VyIGNhbGxlciAodGhhdCBoYXMgbW9yZQorICog Y29udGV4dCB0aGFuIHdlIGhhdmUgYXZhaWxhYmxlIGhlcmUpIHRvIG92ZXJyaWRlIHRoYXQgaW5p dGlhbCBkZXRlcm1pbmF0aW9uCisgKiB3aGVuIGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gYWR2YW5j ZSB0aGUgYXJyYXkga2V5cyBhbmQgY29udGludWUgd2l0aAorICogZnVydGhlciB0dXBsZXMgZnJv bSB0aGUgc2FtZSBsZWFmIHBhZ2UuCisgKi8KK3N0YXRpYyBib29sCitfYnRfY2hlY2tfY29tcGFy ZShTY2FuRGlyZWN0aW9uIGRpciwgQlRTY2FuT3BhcXVlIHNvLAorCQkJCSAgSW5kZXhUdXBsZSB0 dXBsZSwgaW50IHR1cG5hdHRzLCBUdXBsZURlc2MgdHVwZGVzYywKKwkJCQkgIGJvb2wgKmNvbnRp bnVlc2NhbiwgYm9vbCAqc2tyZXF1aXJlZHRyaWdnZXIsCisJCQkJICBib29sIHJlcXVpcmVkTWF0 Y2hlZEJ5UHJlY2hlY2spCit7CiAJaW50CQkJaWtleTsKIAlTY2FuS2V5CQlrZXk7CiAKLQlBc3Nl cnQoQlRyZWVUdXBsZUdldE5BdHRzKHR1cGxlLCBzY2FuLT5pbmRleFJlbGF0aW9uKSA9PSB0dXBu YXR0cyk7CisJQXNzZXJ0KCFzby0+bnVtQXJyYXlLZXlzIHx8ICFyZXF1aXJlZE1hdGNoZWRCeVBy ZWNoZWNrKTsKIAogCSpjb250aW51ZXNjYW4gPSB0cnVlOwkJLyogZGVmYXVsdCBhc3N1bXB0aW9u ICovCisJKnNrcmVxdWlyZWR0cmlnZ2VyID0gdHJ1ZTsJLyogZGVmYXVsdCBhc3N1bXB0aW9uICov CiAKLQl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihzY2FuLT5pbmRleFJlbGF0aW9uKTsKLQlz byA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKLQlrZXlzeiA9IHNvLT5udW1iZXJPZktl eXM7Ci0KLQlmb3IgKGtleSA9IHNvLT5rZXlEYXRhLCBpa2V5ID0gMDsgaWtleSA8IGtleXN6OyBr ZXkrKywgaWtleSsrKQorCWZvciAoa2V5ID0gc28tPmtleURhdGEsIGlrZXkgPSAwOyBpa2V5IDwg c28tPm51bWJlck9mS2V5czsga2V5KyssIGlrZXkrKykKIAl7CiAJCURhdHVtCQlkYXR1bTsKIAkJ Ym9vbAkJaXNOdWxsOwpAQCAtMTUyNiw3ICsyNTkyLDcgQEAgX2J0X2NoZWNra2V5cyhJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKIAkJICogX2J0X2Zp cnN0KCkgZXhjZXB0IGZvciB0aGUgTlVMTHMgY2hlY2tpbmcsIHdoaWNoIGhhdmUgYWxyZWFkeSBk b25lCiAJCSAqIGFib3ZlLgogCQkgKi8KLQkJaWYgKCFyZXF1aXJlZE9wcG9zaXRlRGlyKQorCQlp ZiAoIXJlcXVpcmVkT3Bwb3NpdGVEaXIgfHwgc28tPm51bUFycmF5S2V5cykKIAkJewogCQkJdGVz dCA9IEZ1bmN0aW9uQ2FsbDJDb2xsKCZrZXktPnNrX2Z1bmMsIGtleS0+c2tfY29sbGF0aW9uLAog CQkJCQkJCQkJIGRhdHVtLCBrZXktPnNrX2FyZ3VtZW50KTsKQEAgLTE1NDksMTAgKzI2MTUsMjIg QEAgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGlu dCB0dXBuYXR0cywKIAkJCSAqIHF1YWwgZmFpbHMsIGl0IGlzIGNyaXRpY2FsIHRoYXQgZXF1YWxp dHkgcXVhbHMgYmUgdXNlZCBmb3IgdGhlCiAJCQkgKiBpbml0aWFsIHBvc2l0aW9uaW5nIGluIF9i dF9maXJzdCgpIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlLiBTZWUKIAkJCSAqIGNvbW1lbnRzIGlu IF9idF9maXJzdCgpLgorCQkJICoKKwkJCSAqIFNjYW5zIHdpdGggZXF1YWxpdHktdHlwZSBhcnJh eSBzY2FuIGtleXMgcnVuIGludG8gYSBzaW1pbGFyCisJCQkgKiBwcm9ibGVtIHdoZW5ldmVyIHRo ZXkgYWR2YW5jZSB0aGUgYXJyYXkga2V5cy4gIE91ciBjYWxsZXIgdXNlcworCQkJICogX2J0X3R1 cGxlX2JlZm9yZV9hcnJheV9za2V5cyB0byBhdm9pZCB0aGUgcHJvYmxlbSB0aGVyZS4KIAkJCSAq LwogCQkJaWYgKHJlcXVpcmVkU2FtZURpcikKIAkJCQkqY29udGludWVzY2FuID0gZmFsc2U7CiAK KwkJCWlmICgoa2V5LT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKSAmJgorCQkJCWtleS0+c2tf c3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJeworCQkJCWlmICghcmVxdWly ZWRTYW1lRGlyKQorCQkJCQkqc2tyZXF1aXJlZHRyaWdnZXIgPSBmYWxzZTsKKwkJCQkqY29udGlu dWVzY2FuID0gZmFsc2U7CisJCQl9CisKIAkJCS8qCiAJCQkgKiBJbiBhbnkgY2FzZSwgdGhpcyBp bmRleHR1cGxlIGRvZXNuJ3QgbWF0Y2ggdGhlIHF1YWwuCiAJCQkgKi8KQEAgLTE1NzEsNyArMjY0 OSw3IEBAIF9idF9jaGVja2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxl LCBpbnQgdHVwbmF0dHMsCiAgKiBpdCdzIG5vdCBwb3NzaWJsZSBmb3IgYW55IGZ1dHVyZSB0dXBs ZXMgaW4gdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24KICAqIHRvIHBhc3MgdGhlIHF1YWwuCiAg KgotICogVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja2tleXMsIHdoaWNoIHNlZSBm b3IgbW9yZSBpbmZvLgorICogVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja19jb21w YXJlL19idF9jaGVja2tleXNfY29tcGFyZS4KICAqLwogc3RhdGljIGJvb2wKIF9idF9jaGVja19y b3djb21wYXJlKFNjYW5LZXkgc2tleSwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLApk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyBiL3NyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKaW5kZXggNmE5M2Q3NjdhLi5mMDRjYTFl ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMTA2LDggKzEwNiw3 IEBAIHN0YXRpYyBMaXN0ICpidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLAogCQkJCQkJCSAgIEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNl U2V0ICpjbGF1c2VzLAogCQkJCQkJCSAgIGJvb2wgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkJCQkg ICBTY2FuVHlwZUNvbnRyb2wgc2NhbnR5cGUsCi0JCQkJCQkJICAgYm9vbCAqc2tpcF9ub25uYXRp dmVfc2FvcCwKLQkJCQkJCQkgICBib29sICpza2lwX2xvd2VyX3Nhb3ApOworCQkJCQkJCSAgIGJv b2wgKnNraXBfbm9ubmF0aXZlX3Nhb3ApOwogc3RhdGljIExpc3QgKmJ1aWxkX3BhdGhzX2Zvcl9P UihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQlMaXN0ICpjbGF1 c2VzLCBMaXN0ICpvdGhlcl9jbGF1c2VzKTsKIHN0YXRpYyBMaXN0ICpnZW5lcmF0ZV9iaXRtYXBf b3JfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKQEAgLTcwNiw4ICs3 MDUsNiBAQCBlY2xhc3NfYWxyZWFkeV91c2VkKEVxdWl2YWxlbmNlQ2xhc3MgKnBhcmVudF9lYywg UmVsaWRzIG9sZHJlbGlkcywKICAqIGluZGV4IEFNIHN1cHBvcnRzIHRoZW0gbmF0aXZlbHksIHdl IHNob3VsZCBqdXN0IGluY2x1ZGUgdGhlbSBpbiBzaW1wbGUKICAqIGluZGV4IHBhdGhzLiAgSWYg bm90LCB3ZSBzaG91bGQgZXhjbHVkZSB0aGVtIHdoaWxlIGJ1aWxkaW5nIHNpbXBsZSBpbmRleAog ICogcGF0aHMsIGFuZCB0aGVuIG1ha2UgYSBzZXBhcmF0ZSBhdHRlbXB0IHRvIGluY2x1ZGUgdGhl bSBpbiBiaXRtYXAgcGF0aHMuCi0gKiBGdXJ0aGVybW9yZSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGV4 Y2x1ZGluZyBsb3dlci1vcmRlciBTY2FsYXJBcnJheU9wRXhwcgotICogcXVhbHMgc28gYXMgdG8g Y3JlYXRlIG9yZGVyZWQgcGF0aHMuCiAgKi8KIHN0YXRpYyB2b2lkCiBnZXRfaW5kZXhfcGF0aHMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKQEAgLTcxNiwzNyArNzEzLDE3IEBA IGdldF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogewog CUxpc3QJICAgKmluZGV4cGF0aHM7CiAJYm9vbAkJc2tpcF9ub25uYXRpdmVfc2FvcCA9IGZhbHNl OwotCWJvb2wJCXNraXBfbG93ZXJfc2FvcCA9IGZhbHNlOwogCUxpc3RDZWxsICAgKmxjOwogCiAJ LyoKIAkgKiBCdWlsZCBzaW1wbGUgaW5kZXggcGF0aHMgdXNpbmcgdGhlIGNsYXVzZXMuICBBbGxv dyBTY2FsYXJBcnJheU9wRXhwcgotCSAqIGNsYXVzZXMgb25seSBpZiB0aGUgaW5kZXggQU0gc3Vw cG9ydHMgdGhlbSBuYXRpdmVseSwgYW5kIHNraXAgYW55IHN1Y2gKLQkgKiBjbGF1c2VzIGZvciBp bmRleCBjb2x1bW5zIGFmdGVyIHRoZSBmaXJzdCAoc28gdGhhdCB3ZSBwcm9kdWNlIG9yZGVyZWQK LQkgKiBwYXRocyBpZiBwb3NzaWJsZSkuCisJICogY2xhdXNlcyBvbmx5IGlmIHRoZSBpbmRleCBB TSBzdXBwb3J0cyB0aGVtIG5hdGl2ZWx5LgogCSAqLwogCWluZGV4cGF0aHMgPSBidWlsZF9pbmRl eF9wYXRocyhyb290LCByZWwsCiAJCQkJCQkJCSAgIGluZGV4LCBjbGF1c2VzLAogCQkJCQkJCQkg ICBpbmRleC0+cHJlZE9LLAogCQkJCQkJCQkgICBTVF9BTllTQ0FOLAotCQkJCQkJCQkgICAmc2tp cF9ub25uYXRpdmVfc2FvcCwKLQkJCQkJCQkJICAgJnNraXBfbG93ZXJfc2FvcCk7Ci0KLQkvKgot CSAqIElmIHdlIHNraXBwZWQgYW55IGxvd2VyLW9yZGVyIFNjYWxhckFycmF5T3BFeHBycyBvbiBh biBpbmRleCB3aXRoIGFuIEFNCi0JICogdGhhdCBzdXBwb3J0cyB0aGVtLCB0aGVuIHRyeSBhZ2Fp biBpbmNsdWRpbmcgdGhvc2UgY2xhdXNlcy4gIFRoaXMgd2lsbAotCSAqIHByb2R1Y2UgcGF0aHMg d2l0aCBtb3JlIHNlbGVjdGl2aXR5IGJ1dCBubyBvcmRlcmluZy4KLQkgKi8KLQlpZiAoc2tpcF9s b3dlcl9zYW9wKQotCXsKLQkJaW5kZXhwYXRocyA9IGxpc3RfY29uY2F0KGluZGV4cGF0aHMsCi0J CQkJCQkJCSBidWlsZF9pbmRleF9wYXRocyhyb290LCByZWwsCi0JCQkJCQkJCQkJCQkgICBpbmRl eCwgY2xhdXNlcywKLQkJCQkJCQkJCQkJCSAgIGluZGV4LT5wcmVkT0ssCi0JCQkJCQkJCQkJCQkg ICBTVF9BTllTQ0FOLAotCQkJCQkJCQkJCQkJICAgJnNraXBfbm9ubmF0aXZlX3Nhb3AsCi0JCQkJ CQkJCQkJCQkgICBOVUxMKSk7Ci0JfQorCQkJCQkJCQkgICAmc2tpcF9ub25uYXRpdmVfc2FvcCk7 CiAKIAkvKgogCSAqIFN1Ym1pdCBhbGwgdGhlIG9uZXMgdGhhdCBjYW4gZm9ybSBwbGFpbiBJbmRl eFNjYW4gcGxhbnMgdG8gYWRkX3BhdGguIChBCkBAIC03ODQsNyArNzYxLDYgQEAgZ2V0X2luZGV4 X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkgICBp bmRleCwgY2xhdXNlcywKIAkJCQkJCQkJCSAgIGZhbHNlLAogCQkJCQkJCQkJICAgU1RfQklUTUFQ U0NBTiwKLQkJCQkJCQkJCSAgIE5VTEwsCiAJCQkJCQkJCQkgICBOVUxMKTsKIAkJKmJpdGluZGV4 cGF0aHMgPSBsaXN0X2NvbmNhdCgqYml0aW5kZXhwYXRocywgaW5kZXhwYXRocyk7CiAJfQpAQCAt ODE3LDI3ICs3OTMsMTkgQEAgZ2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwsCiAgKiB0byB0cnVlIGlmIHdlIGZvdW5kIGFueSBzdWNoIGNsYXVzZXMgKGNh bGxlciBtdXN0IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlCiAgKiB0byBmYWxzZSkuICBJZiBpdCdz IE5VTEwsIHdlIGRvIG5vdCBpZ25vcmUgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcy4KICAqCi0g KiBJZiBza2lwX2xvd2VyX3Nhb3AgaXMgbm9uLU5VTEwsIHdlIGlnbm9yZSBTY2FsYXJBcnJheU9w RXhwciBjbGF1c2VzIGZvcgotICogbm9uLWZpcnN0IGluZGV4IGNvbHVtbnMsIGFuZCB3ZSBzZXQg KnNraXBfbG93ZXJfc2FvcCB0byB0cnVlIGlmIHdlIGZvdW5kCi0gKiBhbnkgc3VjaCBjbGF1c2Vz IChjYWxsZXIgbXVzdCBpbml0aWFsaXplIHRoZSB2YXJpYWJsZSB0byBmYWxzZSkuICBJZiBpdCdz Ci0gKiBOVUxMLCB3ZSBkbyBub3QgaWdub3JlIG5vbi1maXJzdCBTY2FsYXJBcnJheU9wRXhwciBj bGF1c2VzLCBidXQgdGhleSB3aWxsCi0gKiByZXN1bHQgaW4gY29uc2lkZXJpbmcgdGhlIHNjYW4n cyBvdXRwdXQgdG8gYmUgdW5vcmRlcmVkLgotICoKICAqICdyZWwnIGlzIHRoZSBpbmRleCdzIGhl YXAgcmVsYXRpb24KICAqICdpbmRleCcgaXMgdGhlIGluZGV4IGZvciB3aGljaCB3ZSB3YW50IHRv IGdlbmVyYXRlIHBhdGhzCiAgKiAnY2xhdXNlcycgaXMgdGhlIGNvbGxlY3Rpb24gb2YgaW5kZXhh YmxlIGNsYXVzZXMgKEluZGV4Q2xhdXNlIG5vZGVzKQogICogJ3VzZWZ1bF9wcmVkaWNhdGUnIGlu ZGljYXRlcyB3aGV0aGVyIHRoZSBpbmRleCBoYXMgYSB1c2VmdWwgcHJlZGljYXRlCiAgKiAnc2Nh bnR5cGUnIGluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgcGxhaW4gb3IgYml0bWFwIHNjYW4gc3Vw cG9ydAogICogJ3NraXBfbm9ubmF0aXZlX3Nhb3AnIGluZGljYXRlcyB3aGV0aGVyIHRvIGFjY2Vw dCBTQU9QIGlmIGluZGV4IEFNIGRvZXNuJ3QKLSAqICdza2lwX2xvd2VyX3Nhb3AnIGluZGljYXRl cyB3aGV0aGVyIHRvIGFjY2VwdCBub24tZmlyc3QtY29sdW1uIFNBT1AKICAqLwogc3RhdGljIExp c3QgKgogYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJl bCwKIAkJCQkgIEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzLAog CQkJCSAgYm9vbCB1c2VmdWxfcHJlZGljYXRlLAogCQkJCSAgU2NhblR5cGVDb250cm9sIHNjYW50 eXBlLAotCQkJCSAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCwKLQkJCQkgIGJvb2wgKnNraXBf bG93ZXJfc2FvcCkKKwkJCQkgIGJvb2wgKnNraXBfbm9ubmF0aXZlX3Nhb3ApCiB7CiAJTGlzdAkg ICAqcmVzdWx0ID0gTklMOwogCUluZGV4UGF0aCAgKmlwYXRoOwpAQCAtODQ4LDcgKzgxNiw2IEBA IGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJ TGlzdAkgICAqb3JkZXJieWNsYXVzZWNvbHM7CiAJTGlzdAkgICAqaW5kZXhfcGF0aGtleXM7CiAJ TGlzdAkgICAqdXNlZnVsX3BhdGhrZXlzOwotCWJvb2wJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNl OwogCWJvb2wJCXBhdGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bDsKIAlib29sCQlpbmRleF9pc19vcmRl cmVkOwogCWJvb2wJCWluZGV4X29ubHlfc2NhbjsKQEAgLTg4MCwxOSArODQ3LDExIEBAIGJ1aWxk X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJICogb24g YnkgYnRyZWUgYW5kIHBvc3NpYmx5IG90aGVyIHBsYWNlcy4pICBUaGUgbGlzdCBjYW4gYmUgZW1w dHksIGlmIHRoZQogCSAqIGluZGV4IEFNIGFsbG93cyB0aGF0LgogCSAqCi0JICogZm91bmRfbG93 ZXJfc2FvcF9jbGF1c2UgaXMgc2V0IHRydWUgaWYgd2UgYWNjZXB0IGEgU2NhbGFyQXJyYXlPcEV4 cHIKLQkgKiBpbmRleCBjbGF1c2UgZm9yIGEgbm9uLWZpcnN0IGluZGV4IGNvbHVtbi4gIFRoaXMg cHJldmVudHMgdXMgZnJvbQotCSAqIGFzc3VtaW5nIHRoYXQgdGhlIHNjYW4gcmVzdWx0IGlzIG9y ZGVyZWQuICAoQWN0dWFsbHksIHRoZSByZXN1bHQgaXMKLQkgKiBzdGlsbCBvcmRlcmVkIGlmIHRo ZXJlIGFyZSBlcXVhbGl0eSBjb25zdHJhaW50cyBmb3IgYWxsIGVhcmxpZXIKLQkgKiBjb2x1bW5z LCBidXQgaXQgc2VlbXMgdG9vIGV4cGVuc2l2ZSBhbmQgbm9uLW1vZHVsYXIgZm9yIHRoaXMgY29k ZSB0byBiZQotCSAqIGF3YXJlIG9mIHRoYXQgcmVmaW5lbWVudC4pCi0JICoKIAkgKiBXZSBhbHNv IGJ1aWxkIGEgUmVsaWRzIHNldCBzaG93aW5nIHdoaWNoIG91dGVyIHJlbHMgYXJlIHJlcXVpcmVk IGJ5IHRoZQogCSAqIHNlbGVjdGVkIGNsYXVzZXMuICBBbnkgbGF0ZXJhbF9yZWxpZHMgYXJlIGlu Y2x1ZGVkIGluIHRoYXQsIGJ1dCBub3QKIAkgKiBvdGhlcndpc2UgYWNjb3VudGVkIGZvci4KIAkg Ki8KIAlpbmRleF9jbGF1c2VzID0gTklMOwotCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlID0gZmFs c2U7CiAJb3V0ZXJfcmVsaWRzID0gYm1zX2NvcHkocmVsLT5sYXRlcmFsX3JlbGlkcyk7CiAJZm9y IChpbmRleGNvbCA9IDA7IGluZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5zOyBpbmRleGNvbCsr KQogCXsKQEAgLTkxNywxNiArODc2LDYgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJLyogQ2FsbGVyIGhhZCBiZXR0ZXIgaW50ZW5k IHRoaXMgb25seSBmb3IgYml0bWFwIHNjYW4gKi8KIAkJCQkJQXNzZXJ0KHNjYW50eXBlID09IFNU X0JJVE1BUFNDQU4pOwogCQkJCX0KLQkJCQlpZiAoaW5kZXhjb2wgPiAwKQotCQkJCXsKLQkJCQkJ aWYgKHNraXBfbG93ZXJfc2FvcCkKLQkJCQkJewotCQkJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2Fu dCB0byBsb3NlIGluZGV4IG9yZGVyaW5nICovCi0JCQkJCQkqc2tpcF9sb3dlcl9zYW9wID0gdHJ1 ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNl ID0gdHJ1ZTsKLQkJCQl9CiAJCQl9CiAKIAkJCS8qIE9LIHRvIGluY2x1ZGUgdGhpcyBjbGF1c2Ug Ki8KQEAgLTk1NiwxMSArOTA1LDkgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAkvKgogCSAqIDIuIENvbXB1dGUgcGF0aGtleXMgZGVzY3Jp YmluZyBpbmRleCdzIG9yZGVyaW5nLCBpZiBhbnksIHRoZW4gc2VlIGhvdwogCSAqIG1hbnkgb2Yg dGhlbSBhcmUgYWN0dWFsbHkgdXNlZnVsIGZvciB0aGlzIHF1ZXJ5LiAgVGhpcyBpcyBub3QgcmVs ZXZhbnQKLQkgKiBpZiB3ZSBhcmUgb25seSB0cnlpbmcgdG8gYnVpbGQgYml0bWFwIGluZGV4c2Nh bnMsIG5vciBpZiB3ZSBoYXZlIHRvCi0JICogYXNzdW1lIHRoZSBzY2FuIGlzIHVub3JkZXJlZC4K KwkgKiBpZiB3ZSBhcmUgb25seSB0cnlpbmcgdG8gYnVpbGQgYml0bWFwIGluZGV4c2NhbnMuCiAJ ICovCiAJcGF0aGtleXNfcG9zc2libHlfdXNlZnVsID0gKHNjYW50eXBlICE9IFNUX0JJVE1BUFND QU4gJiYKLQkJCQkJCQkJIWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlICYmCiAJCQkJCQkJCWhhc191 c2VmdWxfcGF0aGtleXMocm9vdCwgcmVsKSk7CiAJaW5kZXhfaXNfb3JkZXJlZCA9IChpbmRleC0+ c29ydG9wZmFtaWx5ICE9IE5VTEwpOwogCWlmIChpbmRleF9pc19vcmRlcmVkICYmIHBhdGhrZXlz X3Bvc3NpYmx5X3VzZWZ1bCkKQEAgLTEyMTIsNyArMTE1OSw2IEBAIGJ1aWxkX3BhdGhzX2Zvcl9P UihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJICAgaW5kZXgs ICZjbGF1c2VzZXQsCiAJCQkJCQkJCQkgICB1c2VmdWxfcHJlZGljYXRlLAogCQkJCQkJCQkJICAg U1RfQklUTUFQU0NBTiwKLQkJCQkJCQkJCSAgIE5VTEwsCiAJCQkJCQkJCQkgICBOVUxMKTsKIAkJ cmVzdWx0ID0gbGlzdF9jb25jYXQocmVzdWx0LCBpbmRleHBhdGhzKTsKIAl9CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9zZWxmdW5jcy5jCmluZGV4IGM0ZmNkMDA3Ni4uYzc5NmI1M2E2IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQv c2VsZnVuY3MuYwpAQCAtNjQ0NCw4ICs2NDQ0LDYgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFu bmVySW5mbyAqcm9vdCwKIAlkb3VibGUJCW51bUluZGV4VHVwbGVzOwogCWRvdWJsZQkJc3BjX3Jh bmRvbV9wYWdlX2Nvc3Q7CiAJZG91YmxlCQludW1fc2Ffc2NhbnM7Ci0JZG91YmxlCQludW1fb3V0 ZXJfc2NhbnM7Ci0JZG91YmxlCQludW1fc2NhbnM7CiAJZG91YmxlCQlxdWFsX29wX2Nvc3Q7CiAJ ZG91YmxlCQlxdWFsX2FyZ19jb3N0OwogCUxpc3QJICAgKnNlbGVjdGl2aXR5UXVhbHM7CkBAIC02 NDYwLDcgKzY0NTgsNyBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAog CiAJLyoKIAkgKiBDaGVjayBmb3IgU2NhbGFyQXJyYXlPcEV4cHIgaW5kZXggcXVhbHMsIGFuZCBl c3RpbWF0ZSB0aGUgbnVtYmVyIG9mCi0JICogaW5kZXggc2NhbnMgdGhhdCB3aWxsIGJlIHBlcmZv cm1lZC4KKwkgKiBwcmltaXRpdmUgaW5kZXggc2NhbnMgdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBm b3IgY2FsbGVyCiAJICovCiAJbnVtX3NhX3NjYW5zID0gMTsKIAlmb3JlYWNoKGwsIGluZGV4UXVh bHMpCkBAIC02NDkwLDE5ICs2NDg4LDggQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5m byAqcm9vdCwKIAkgKi8KIAludW1JbmRleFR1cGxlcyA9IGNvc3RzLT5udW1JbmRleFR1cGxlczsK IAlpZiAobnVtSW5kZXhUdXBsZXMgPD0gMC4wKQotCXsKIAkJbnVtSW5kZXhUdXBsZXMgPSBpbmRl eFNlbGVjdGl2aXR5ICogaW5kZXgtPnJlbC0+dHVwbGVzOwogCi0JCS8qCi0JCSAqIFRoZSBhYm92 ZSBjYWxjdWxhdGlvbiBjb3VudHMgYWxsIHRoZSB0dXBsZXMgdmlzaXRlZCBhY3Jvc3MgYWxsCi0J CSAqIHNjYW5zIGluZHVjZWQgYnkgU2NhbGFyQXJyYXlPcEV4cHIgbm9kZXMuICBXZSB3YW50IHRv IGNvbnNpZGVyIHRoZQotCQkgKiBhdmVyYWdlIHBlci1pbmRleHNjYW4gbnVtYmVyLCBzbyBhZGp1 c3QuICBUaGlzIGlzIGEgaGFuZHkgcGxhY2UgdG8KLQkJICogcm91bmQgdG8gaW50ZWdlciwgdG9v LiAgKElmIGNhbGxlciBzdXBwbGllZCB0dXBsZSBlc3RpbWF0ZSwgaXQncwotCQkgKiByZXNwb25z aWJsZSBmb3IgaGFuZGxpbmcgdGhlc2UgY29uc2lkZXJhdGlvbnMuKQotCQkgKi8KLQkJbnVtSW5k ZXhUdXBsZXMgPSByaW50KG51bUluZGV4VHVwbGVzIC8gbnVtX3NhX3NjYW5zKTsKLQl9Ci0KIAkv KgogCSAqIFdlIGNhbiBib3VuZCB0aGUgbnVtYmVyIG9mIHR1cGxlcyBieSB0aGUgaW5kZXggc2l6 ZSBpbiBhbnkgY2FzZS4gQWxzbywKIAkgKiBhbHdheXMgZXN0aW1hdGUgYXQgbGVhc3Qgb25lIHR1 cGxlIGlzIHRvdWNoZWQsIGV2ZW4gd2hlbgpAQCAtNjU0MCwyNyArNjUyNywzMSBAQCBnZW5lcmlj Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCSAqCiAJICogVGhlIGFib3ZlIGNhbGN1 bGF0aW9ucyBhcmUgYWxsIHBlci1pbmRleC1zY2FuLiAgSG93ZXZlciwgaWYgd2UgYXJlIGluIGEK IAkgKiBuZXN0bG9vcCBpbm5lciBzY2FuLCB3ZSBjYW4gZXhwZWN0IHRoZSBzY2FuIHRvIGJlIHJl cGVhdGVkICh3aXRoCi0JICogZGlmZmVyZW50IHNlYXJjaCBrZXlzKSBmb3IgZWFjaCByb3cgb2Yg dGhlIG91dGVyIHJlbGF0aW9uLiAgTGlrZXdpc2UsCi0JICogU2NhbGFyQXJyYXlPcEV4cHIgcXVh bHMgcmVzdWx0IGluIG11bHRpcGxlIGluZGV4IHNjYW5zLiAgVGhpcyBjcmVhdGVzCi0JICogdGhl IHBvdGVudGlhbCBmb3IgY2FjaGUgZWZmZWN0cyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkaXNr IHBhZ2UKLQkgKiBmZXRjaGVzIG5lZWRlZC4gIFdlIHdhbnQgdG8gZXN0aW1hdGUgdGhlIGF2ZXJh Z2UgcGVyLXNjYW4gSS9PIGNvc3QgaW4KLQkgKiB0aGUgcHJlc2VuY2Ugb2YgY2FjaGluZy4KKwkg KiBkaWZmZXJlbnQgc2VhcmNoIGtleXMpIGZvciBlYWNoIHJvdyBvZiB0aGUgb3V0ZXIgcmVsYXRp b24uICBUaGlzCisJICogY3JlYXRlcyB0aGUgcG90ZW50aWFsIGZvciBjYWNoZSBlZmZlY3RzIHRv IHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRpc2sKKwkgKiBwYWdlIGZldGNoZXMgbmVlZGVkLiAgV2Ug d2FudCB0byBlc3RpbWF0ZSB0aGUgYXZlcmFnZSBwZXItc2NhbiBJL08gY29zdAorCSAqIGluIHRo ZSBwcmVzZW5jZSBvZiBjYWNoaW5nLgogCSAqCiAJICogV2UgdXNlIHRoZSBNYWNrZXJ0LUxvaG1h biBmb3JtdWxhIChzZWUgY29zdHNpemUuYyBmb3IgZGV0YWlscykgdG8KIAkgKiBlc3RpbWF0ZSB0 aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2UgZmV0Y2hlcyB0aGF0IG9jY3VyLiAgV2hpbGUgdGhpcwog CSAqIHdhc24ndCB3aGF0IGl0IHdhcyBkZXNpZ25lZCBmb3IsIGl0IHNlZW1zIGEgcmVhc29uYWJs ZSBtb2RlbCBhbnl3YXkuCiAJICogTm90ZSB0aGF0IHdlIGFyZSBjb3VudGluZyBwYWdlcyBub3Qg dHVwbGVzIGFueW1vcmUsIHNvIHdlIHRha2UgTiA9IFQgPQogCSAqIGluZGV4IHNpemUsIGFzIGlm IHRoZXJlIHdlcmUgb25lICJ0dXBsZSIgcGVyIHBhZ2UuCisJICoKKwkgKiBOb3RlOiB3ZSBhc3N1 bWUgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIHJlcGVhdCBpbmRleCBwYWdlIGZldGNoZXMgYWNyb3Nz CisJICogU2NhbGFyQXJyYXlPcEV4cHIgcHJpbWl0aXZlIHNjYW5zIGZyb20gdGhlIHNhbWUgbG9n aWNhbCBpbmRleCBzY2FuLgorCSAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB0cnVlIGZvciBi dHJlZSBpbmRleGVzLCBidXQgaXMgdmVyeSBvcHRpbWlzdGljCisJICogd2l0aCBpbmRleCBBTXMg dGhhdCBjYW5ub3QgbmF0aXZlbHkgZXhlY3V0ZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscy4KKwkg KiBIb3dldmVyLCB0aGVzZSBzYW1lIGluZGV4IEFNcyBhbHNvIGFjY2VwdCBvdXIgZGVmYXVsdCBw ZXNzaW1pc3RpYworCSAqIGFwcHJvYWNoIHRvIGNvdW50aW5nIG51bV9zYV9zY2FucyAoYnRyZWUg Y2FsbGVyIGNhcHMgdGhpcyksIHNvIHdlIGRvbid0CisJICogZXhwZWN0IHRoZSBmaW5hbCBpbmRl eFRvdGFsQ29zdCB0byBiZSB3aWxkbHkgb3Zlci1vcHRpbWlzdGljLgogCSAqLwotCW51bV9vdXRl cl9zY2FucyA9IGxvb3BfY291bnQ7Ci0JbnVtX3NjYW5zID0gbnVtX3NhX3NjYW5zICogbnVtX291 dGVyX3NjYW5zOwotCi0JaWYgKG51bV9zY2FucyA+IDEpCisJaWYgKGxvb3BfY291bnQgPiAxKQog CXsKIAkJZG91YmxlCQlwYWdlc19mZXRjaGVkOwogCiAJCS8qIHRvdGFsIHBhZ2UgZmV0Y2hlcyBp Z25vcmluZyBjYWNoZSBlZmZlY3RzICovCi0JCXBhZ2VzX2ZldGNoZWQgPSBudW1JbmRleFBhZ2Vz ICogbnVtX3NjYW5zOworCQlwYWdlc19mZXRjaGVkID0gbnVtSW5kZXhQYWdlcyAqIGxvb3BfY291 bnQ7CiAKIAkJLyogdXNlIE1hY2tlcnQgYW5kIExvaG1hbiBmb3JtdWxhIHRvIGFkanVzdCBmb3Ig Y2FjaGUgZWZmZWN0cyAqLwogCQlwYWdlc19mZXRjaGVkID0gaW5kZXhfcGFnZXNfZmV0Y2hlZChw YWdlc19mZXRjaGVkLApAQCAtNjU3MCwxMSArNjU2MSw5IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUo UGxhbm5lckluZm8gKnJvb3QsCiAKIAkJLyoKIAkJICogTm93IGNvbXB1dGUgdGhlIHRvdGFsIGRp c2sgYWNjZXNzIGNvc3QsIGFuZCB0aGVuIHJlcG9ydCBhIHByby1yYXRlZAotCQkgKiBzaGFyZSBm b3IgZWFjaCBvdXRlciBzY2FuLiAgKERvbid0IHByby1yYXRlIGZvciBTY2FsYXJBcnJheU9wRXhw ciwKLQkJICogc2luY2UgdGhhdCdzIGludGVybmFsIHRvIHRoZSBpbmRleHNjYW4uKQorCQkgKiBz aGFyZSBmb3IgZWFjaCBvdXRlciBzY2FuCiAJCSAqLwotCQlpbmRleFRvdGFsQ29zdCA9IChwYWdl c19mZXRjaGVkICogc3BjX3JhbmRvbV9wYWdlX2Nvc3QpCi0JCQkvIG51bV9vdXRlcl9zY2FuczsK KwkJaW5kZXhUb3RhbENvc3QgPSAocGFnZXNfZmV0Y2hlZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0 KSAvIGxvb3BfY291bnQ7CiAJfQogCWVsc2UKIAl7CkBAIC02NTkwLDEwICs2NTc5LDggQEAgZ2Vu ZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKiBldmFsdWF0ZWQgb25jZSBh dCB0aGUgc3RhcnQgb2YgdGhlIHNjYW4gdG8gcmVkdWNlIHRoZW0gdG8gcnVudGltZSBrZXlzCiAJ ICogdG8gcGFzcyB0byB0aGUgaW5kZXggQU0gKHNlZSBub2RlSW5kZXhzY2FuLmMpLiAgV2UgbW9k ZWwgdGhlIHBlci10dXBsZQogCSAqIENQVSBjb3N0cyBhcyBjcHVfaW5kZXhfdHVwbGVfY29zdCBw bHVzIG9uZSBjcHVfb3BlcmF0b3JfY29zdCBwZXIKLQkgKiBpbmRleHF1YWwgb3BlcmF0b3IuICBC ZWNhdXNlIHdlIGhhdmUgbnVtSW5kZXhUdXBsZXMgYXMgYSBwZXItc2NhbgotCSAqIG51bWJlciwg d2UgaGF2ZSB0byBtdWx0aXBseSBieSBudW1fc2Ffc2NhbnMgdG8gZ2V0IHRoZSBjb3JyZWN0IHJl c3VsdAotCSAqIGZvciBTY2FsYXJBcnJheU9wRXhwciBjYXNlcy4gIFNpbWlsYXJseSBhZGQgaW4g Y29zdHMgZm9yIGFueSBpbmRleAotCSAqIE9SREVSIEJZIGV4cHJlc3Npb25zLgorCSAqIGluZGV4 cXVhbCBvcGVyYXRvci4gIFNpbWlsYXJseSBhZGQgaW4gY29zdHMgZm9yIGFueSBpbmRleCBPUkRF UiBCWQorCSAqIGV4cHJlc3Npb25zLgogCSAqCiAJICogTm90ZTogdGhpcyBuZWdsZWN0cyB0aGUg cG9zc2libGUgY29zdHMgb2YgcmVjaGVja2luZyBsb3NzeSBvcGVyYXRvcnMuCiAJICogRGV0ZWN0 aW5nIHRoYXQgdGhhdCBtaWdodCBiZSBuZWVkZWQgc2VlbXMgbW9yZSBleHBlbnNpdmUgdGhhbiBp dCdzCkBAIC02NjA2LDcgKzY1OTMsNyBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZv ICpyb290LAogCiAJaW5kZXhTdGFydHVwQ29zdCA9IHF1YWxfYXJnX2Nvc3Q7CiAJaW5kZXhUb3Rh bENvc3QgKz0gcXVhbF9hcmdfY29zdDsKLQlpbmRleFRvdGFsQ29zdCArPSBudW1JbmRleFR1cGxl cyAqIG51bV9zYV9zY2FucyAqIChjcHVfaW5kZXhfdHVwbGVfY29zdCArIHF1YWxfb3BfY29zdCk7 CisJaW5kZXhUb3RhbENvc3QgKz0gbnVtSW5kZXhUdXBsZXMgKiAoY3B1X2luZGV4X3R1cGxlX2Nv c3QgKyBxdWFsX29wX2Nvc3QpOwogCiAJLyoKIAkgKiBHZW5lcmljIGFzc3VtcHRpb24gYWJvdXQg aW5kZXggY29ycmVsYXRpb246IHRoZXJlIGlzbid0IGFueS4KQEAgLTY2ODQsNyArNjY3MSw2IEBA IGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJs ZSBsb29wX2NvdW50LAogCWJvb2wJCWVxUXVhbEhlcmU7CiAJYm9vbAkJZm91bmRfc2FvcDsKIAli b29sCQlmb3VuZF9pc19udWxsX29wOwotCWRvdWJsZQkJbnVtX3NhX3NjYW5zOwogCUxpc3RDZWxs ICAgKmxjOwogCiAJLyoKQEAgLTY2OTksMTcgKzY2ODUsMTIgQEAgYnRjb3N0ZXN0aW1hdGUoUGxh bm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICoK IAkgKiBGb3IgYSBSb3dDb21wYXJlRXhwciwgd2UgY29uc2lkZXIgb25seSB0aGUgZmlyc3QgY29s dW1uLCBqdXN0IGFzCiAJICogcm93Y29tcGFyZXNlbCgpIGRvZXMuCi0JICoKLQkgKiBJZiB0aGVy ZSdzIGEgU2NhbGFyQXJyYXlPcEV4cHIgaW4gdGhlIHF1YWxzLCB3ZSdsbCBhY3R1YWxseSBwZXJm b3JtIE4KLQkgKiBpbmRleCBzY2FucyBub3Qgb25lLCBidXQgdGhlIFNjYWxhckFycmF5T3BFeHBy J3Mgb3BlcmF0b3IgY2FuIGJlCi0JICogY29uc2lkZXJlZCB0byBhY3QgdGhlIHNhbWUgYXMgaXQg bm9ybWFsbHkgZG9lcy4KIAkgKi8KIAlpbmRleEJvdW5kUXVhbHMgPSBOSUw7CiAJaW5kZXhjb2wg PSAwOwogCWVxUXVhbEhlcmUgPSBmYWxzZTsKIAlmb3VuZF9zYW9wID0gZmFsc2U7CiAJZm91bmRf aXNfbnVsbF9vcCA9IGZhbHNlOwotCW51bV9zYV9zY2FucyA9IDE7CiAJZm9yZWFjaChsYywgcGF0 aC0+aW5kZXhjbGF1c2VzKQogCXsKIAkJSW5kZXhDbGF1c2UgKmljbGF1c2UgPSBsZmlyc3Rfbm9k ZShJbmRleENsYXVzZSwgbGMpOwpAQCAtNjc0OSwxNCArNjczMCw5IEBAIGJ0Y29zdGVzdGltYXRl KFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAog CQkJZWxzZSBpZiAoSXNBKGNsYXVzZSwgU2NhbGFyQXJyYXlPcEV4cHIpKQogCQkJewogCQkJCVNj YWxhckFycmF5T3BFeHByICpzYW9wID0gKFNjYWxhckFycmF5T3BFeHByICopIGNsYXVzZTsKLQkJ CQlOb2RlCSAgICpvdGhlcl9vcGVyYW5kID0gKE5vZGUgKikgbHNlY29uZChzYW9wLT5hcmdzKTsK LQkJCQlpbnQJCQlhbGVuZ3RoID0gZXN0aW1hdGVfYXJyYXlfbGVuZ3RoKG90aGVyX29wZXJhbmQp OwogCiAJCQkJY2xhdXNlX29wID0gc2FvcC0+b3BubzsKIAkJCQlmb3VuZF9zYW9wID0gdHJ1ZTsK LQkJCQkvKiBjb3VudCBudW1iZXIgb2YgU0Egc2NhbnMgaW5kdWNlZCBieSBpbmRleEJvdW5kUXVh bHMgb25seSAqLwotCQkJCWlmIChhbGVuZ3RoID4gMSkKLQkJCQkJbnVtX3NhX3NjYW5zICo9IGFs ZW5ndGg7CiAJCQl9CiAJCQllbHNlIGlmIChJc0EoY2xhdXNlLCBOdWxsVGVzdCkpCiAJCQl7CkBA IC02ODA1LDkgKzY3ODEsOSBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5k ZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkJU2VsZWN0aXZpdHkgYnRyZWVTZWxl Y3Rpdml0eTsKIAogCQkvKgotCQkgKiBJZiB0aGUgaW5kZXggaXMgcGFydGlhbCwgQU5EIHRoZSBp bmRleCBwcmVkaWNhdGUgd2l0aCB0aGUKLQkJICogaW5kZXgtYm91bmQgcXVhbHMgdG8gcHJvZHVj ZSBhIG1vcmUgYWNjdXJhdGUgaWRlYSBvZiB0aGUgbnVtYmVyIG9mCi0JCSAqIHJvd3MgY292ZXJl ZCBieSB0aGUgYm91bmQgY29uZGl0aW9ucy4KKwkJICogQU5EIHRoZSBpbmRleCBwcmVkaWNhdGUg d2l0aCB0aGUgaW5kZXgtYm91bmQgcXVhbHMgdG8gcHJvZHVjZSBhCisJCSAqIG1vcmUgYWNjdXJh dGUgaWRlYSBvZiB0aGUgbnVtYmVyIG9mIHJvd3MgY292ZXJlZCBieSB0aGUgYm91bmQKKwkJICog Y29uZGl0aW9ucwogCQkgKi8KIAkJc2VsZWN0aXZpdHlRdWFscyA9IGFkZF9wcmVkaWNhdGVfdG9f aW5kZXhfcXVhbHMoaW5kZXgsIGluZGV4Qm91bmRRdWFscyk7CiAKQEAgLTY4MTYsMTMgKzY3OTIs NiBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBk b3VibGUgbG9vcF9jb3VudCwKIAkJCQkJCQkJCQkJCSAgSk9JTl9JTk5FUiwKIAkJCQkJCQkJCQkJ CSAgTlVMTCk7CiAJCW51bUluZGV4VHVwbGVzID0gYnRyZWVTZWxlY3Rpdml0eSAqIGluZGV4LT5y ZWwtPnR1cGxlczsKLQotCQkvKgotCQkgKiBBcyBpbiBnZW5lcmljY29zdGVzdGltYXRlKCksIHdl IGhhdmUgdG8gYWRqdXN0IGZvciBhbnkKLQkJICogU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgaW5j bHVkZWQgaW4gaW5kZXhCb3VuZFF1YWxzLCBhbmQgdGhlbiByb3VuZAotCQkgKiB0byBpbnRlZ2Vy LgotCQkgKi8KLQkJbnVtSW5kZXhUdXBsZXMgPSByaW50KG51bUluZGV4VHVwbGVzIC8gbnVtX3Nh X3NjYW5zKTsKIAl9CiAKIAkvKgpAQCAtNjgzMiw2ICs2ODAxLDQzIEBAIGJ0Y29zdGVzdGltYXRl KFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAog CiAJZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShyb290LCBwYXRoLCBsb29wX2NvdW50LCAmY29zdHMpOwog CisJLyoKKwkgKiBOb3cgY29tcGVuc2F0ZSBmb3IgYnRyZWUncyBhYmlsaXR5IHRvIGVmZmljaWVu dGx5IGV4ZWN1dGUgc2NhbnMgd2l0aAorCSAqIFNBT1AgY2xhdXNlcy4KKwkgKgorCSAqIGJ0cmVl IGF1dG9tYXRpY2FsbHkgY29tYmluZXMgaW5kaXZpZHVhbCBTY2FsYXJBcnJheU9wRXhwciBwcmlt aXRpdmUKKwkgKiBpbmRleCBzY2FucyB3aGVuZXZlciB0aGUgdHVwbGVzIGNvdmVyZWQgYnkgdGhl IG5leHQgc2V0IG9mIGFycmF5IGtleXMKKwkgKiBhcmUgY2xvc2UgdG8gdHVwbGVzIGNvdmVyZWQg YnkgdGhlIGN1cnJlbnQgc2V0LiAgVGhpcyBtYWtlcyB0aGUgZmluYWwKKwkgKiBudW1iZXIgb2Yg ZGVzY2VudHMgcGFydGljdWxhcmx5IGRpZmZpY3VsdCB0byBlc3RpbWF0ZS4gIEhvd2V2ZXIsIGJ0 cmVlCisJICogc2NhbnMgbmV2ZXIgdmlzaXQgYW55IHNpbmdsZSBsZWFmIHBhZ2UgbW9yZSB0aGFu IG9uY2UuICBUaGF0IHB1dHMgYQorCSAqIG5hdHVyYWwgZmxvb3IgdW5kZXIgdGhlIHdvcnN0IGNh c2UgbnVtYmVyIG9mIGRlc2NlbnRzLgorCSAqCisJICogSXQncyBwYXJ0aWN1bGFybHkgaW1wb3J0 YW50IHRoYXQgd2Ugbm90IHdpbGRseSBvdmVyZXN0aW1hdGUgdGhlIG51bWJlcgorCSAqIG9mIGRl c2NlbnRzIG5lZWRlZCBmb3IgYSBjbGF1c2UgbGlzdCB3aXRoIHNldmVyYWwgU0FPUHMgLS0gdGhl IGNvc3RzCisJICogcmVhbGx5IGFyZW4ndCBtdWx0aXBsaWNhdGl2ZSBpbiB0aGUgd2F5IGdlbmVy aWNjb3N0ZXN0aW1hdGUgZXhwZWN0cy4gSW4KKwkgKiBnZW5lcmFsLCBtb3N0IGRpc3RpbmN0IGNv bWJpbmF0aW9ucyBvZiBTQU9QIGtleXMgd2lsbCB0ZW5kIHRvIG5vdCBmaW5kCisJICogYW55IG1h dGNoaW5nIHR1cGxlcy4gIEZ1cnRoZXJtb3JlLCBidHJlZSBzY2FucyBzZWFyY2ggZm9yIHRoZSBu ZXh0IHNldAorCSAqIG9mIGFycmF5IGtleXMgdXNpbmcgdGhlIG5leHQgdHVwbGUgaW4gbGluZSwg YW5kIHNvIHdvbid0IGV2ZW4gbmVlZCBhCisJICogZGlyZWN0IGNvbXBhcmlzb24gdG8gZWxpbWlu YXRlIG1vc3Qgbm9uLW1hdGNoaW5nIHNldHMgb2YgYXJyYXkga2V5cy4KKwkgKgorCSAqIENsYW1w IHRoZSBudW1iZXIgb2YgZGVzY2VudHMgdG8gdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgbGVhZiBw YWdlCisJICogdmlzaXRzLiAgVGhpcyBpcyBzdGlsbCBmYWlybHkgcGVzc2ltaXN0aWMsIGJ1dCB0 ZW5kcyB0byByZXN1bHQgaW4gbW9yZQorCSAqIGFjY3VyYXRlIGNvc3Rpbmcgb2Ygc2NhbnMgd2l0 aCBzZXZlcmFsIFNBT1AgY2xhdXNlcyAtLSBlc3BlY2lhbGx5IHdoZW4KKwkgKiBlYWNoIGFycmF5 IGhhcyBtb3JlIHRoYW4gYSBmZXcgZWxlbWVudHMuICBUaGUgY29zdCBvZiBhZGRpbmcgYWRkaXRp b25hbAorCSAqIGFycmF5IGNvbnN0YW50cyB0byBhIGxvdy1vcmRlciBTQU9QIGNvbHVtbiBzaG91 bGQgc2F0dXJhdGUgcGFzdCBhCisJICogY2VydGFpbiBwb2ludCAoZXhjZXB0IHdoZXJlIHNlbGVj dGl2aXR5IGVzdGltYXRlcyBjb250aW51ZSB0byBzaGlmdCkuCisJICoKKwkgKiBBbHNvIGNsYW1w IHRoZSBudW1iZXIgb2YgZGVzY2VudHMgdG8gMS8zIHRoZSBudW1iZXIgb2YgaW5kZXggcGFnZXMu CisJICogVGhpcyBhdm9pZHMgaW1wbGF1c2libHkgaGlnaCBlc3RpbWF0ZXMgd2l0aCBsb3cgc2Vs ZWN0aXZpdHkgcGF0aHMsCisJICogd2hlcmUgc2NhbnMgZnJlcXVlbnRseSByZXF1aXJlIG5vIG1v cmUgdGhhbiBvbmUgb3IgdHdvIGRlc2NlbnRzLgorCSAqLworCWlmIChjb3N0cy5udW1fc2Ffc2Nh bnMgPiAxKQorCXsKKwkJY29zdHMubnVtX3NhX3NjYW5zID0gTWluKGNvc3RzLm51bV9zYV9zY2Fu cywgY29zdHMubnVtSW5kZXhQYWdlcyk7CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1pbihjb3N0 cy5udW1fc2Ffc2NhbnMsIGluZGV4LT5wYWdlcyAvIDMpOworCQljb3N0cy5udW1fc2Ffc2NhbnMg PSBNYXgoY29zdHMubnVtX3NhX3NjYW5zLCAxKTsKKwl9CisKIAkvKgogCSAqIEFkZCBhIENQVS1j b3N0IGNvbXBvbmVudCB0byByZXByZXNlbnQgdGhlIGNvc3RzIG9mIGluaXRpYWwgYnRyZWUKIAkg KiBkZXNjZW50LiAgV2UgZG9uJ3QgY2hhcmdlIGFueSBJL08gY29zdCBmb3IgdG91Y2hpbmcgdXBw ZXIgYnRyZWUgbGV2ZWxzLApAQCAtNjgzOSw5ICs2ODQ1LDkgQEAgYnRjb3N0ZXN0aW1hdGUoUGxh bm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICog Y29tcGFyaXNvbnMgdG8gZGVzY2VuZCBhIGJ0cmVlIG9mIE4gbGVhZiB0dXBsZXMuICBXZSBjaGFy Z2Ugb25lCiAJICogY3B1X29wZXJhdG9yX2Nvc3QgcGVyIGNvbXBhcmlzb24uCiAJICoKLQkgKiBJ ZiB0aGVyZSBhcmUgU2NhbGFyQXJyYXlPcEV4cHJzLCBjaGFyZ2UgdGhpcyBvbmNlIHBlciBTQSBz Y2FuLiAgVGhlCi0JICogb25lcyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBub3Qgc3RhcnR1cCBj b3N0IHNvIGZhciBhcyB0aGUgb3ZlcmFsbAotCSAqIHBsYW4gaXMgY29uY2VybmVkLCBzbyBhZGQg dGhlbSBvbmx5IHRvICJ0b3RhbCIgY29zdC4KKwkgKiBJZiB0aGVyZSBhcmUgU2NhbGFyQXJyYXlP cEV4cHJzLCBjaGFyZ2UgdGhpcyBvbmNlIHBlciBlc3RpbWF0ZWQKKwkgKiBwcmltaXRpdmUgU0Eg c2Nhbi4gIFRoZSBvbmVzIGFmdGVyIHRoZSBmaXJzdCBvbmUgYXJlIG5vdCBzdGFydHVwIGNvc3QK KwkgKiBzbyBmYXIgYXMgdGhlIG92ZXJhbGwgcGxhbiBnb2VzLCBzbyBqdXN0IGFkZCB0aGVtIHRv ICJ0b3RhbCIgY29zdC4KIAkgKi8KIAlpZiAoaW5kZXgtPnR1cGxlcyA+IDEpCQkvKiBhdm9pZCBj b21wdXRpbmcgbG9nKDApICovCiAJewpAQCAtNjg1OCw3ICs2ODY0LDggQEAgYnRjb3N0ZXN0aW1h dGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQs CiAJICogaW4gY2FzZXMgd2hlcmUgb25seSBhIHNpbmdsZSBsZWFmIHBhZ2UgaXMgZXhwZWN0ZWQg dG8gYmUgdmlzaXRlZC4gIFRoaXMKIAkgKiBjb3N0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IHNl dCBhdCA1MHggY3B1X29wZXJhdG9yX2Nvc3QgcGVyIHBhZ2UKIAkgKiB0b3VjaGVkLiAgVGhlIG51 bWJlciBvZiBzdWNoIHBhZ2VzIGlzIGJ0cmVlIHRyZWUgaGVpZ2h0IHBsdXMgb25lIChpZSwKLQkg KiB3ZSBjaGFyZ2UgZm9yIHRoZSBsZWFmIHBhZ2UgdG9vKS4gIEFzIGFib3ZlLCBjaGFyZ2Ugb25j ZSBwZXIgU0Egc2Nhbi4KKwkgKiB3ZSBjaGFyZ2UgZm9yIHRoZSBsZWFmIHBhZ2UgdG9vKS4gIEFz IGFib3ZlLCBjaGFyZ2Ugb25jZSBwZXIgZXN0aW1hdGVkCisJICogcHJpbWl0aXZlIFNBIHNjYW4u CiAJICovCiAJZGVzY2VudENvc3QgPSAoaW5kZXgtPnRyZWVfaGVpZ2h0ICsgMSkgKiBERUZBVUxU X1BBR0VfQ1BVX01VTFRJUExJRVIgKiBjcHVfb3BlcmF0b3JfY29zdDsKIAljb3N0cy5pbmRleFN0 YXJ0dXBDb3N0ICs9IGRlc2NlbnRDb3N0OwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL21vbml0 b3Jpbmcuc2dtbCBiL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKaW5kZXggMTE0OTA5M2E4 Li42YTUwNjhjNzIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKKysr IGIvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbApAQCAtNDAwNSw2ICs0MDA1LDE5IEBAIGRl c2NyaXB0aW9uIHwgV2FpdGluZyBmb3IgYSBuZXdseSBpbml0aWFsaXplZCBXQUwgZmlsZSB0byBy ZWFjaCBkdXJhYmxlIHN0b3JhZ2UKICAgIDwvcGFyYT4KICAgPC9ub3RlPgogCisgIDxub3RlPgor ICAgPHBhcmE+CisgICAgRXZlcnkgdGltZSBhbiBpbmRleCBpcyBzZWFyY2hlZCwgdGhlIGluZGV4 J3MKKyAgICA8c3RydWN0bmFtZT5wZ19zdGF0X2FsbF9pbmRleGVzPC9zdHJ1Y3RuYW1lPi48c3Ry dWN0ZmllbGQ+aWR4X3NjYW48L3N0cnVjdGZpZWxkPgorICAgIGZpZWxkIGlzIGluY3JlbWVudGVk LiAgVGhpcyB1c3VhbGx5IGhhcHBlbnMgb25jZSBwZXIgaW5kZXggc2NhbiBub2RlCisgICAgZXhl Y3V0aW9uLCBidXQgbWlnaHQgdGFrZSBwbGFjZSBzZXZlcmFsIHRpbWVzIGR1cmluZyBleGVjdXRp b24gb2YgYSBzY2FuCisgICAgdGhhdCBzZWFyY2hlcyBmb3IgbXVsdGlwbGUgdmFsdWVzIHRvZ2V0 aGVyLiAgT25seSBxdWVyaWVzIHRoYXQgdXNlIGNlcnRhaW4KKyAgICA8YWNyb255bT5TUUw8L2Fj cm9ueW0+IGNvbnN0cnVjdHMgdG8gc2VhcmNoIGZvciByb3dzIG1hdGNoaW5nIGFueSB2YWx1ZQor ICAgIG91dCBvZiBhIGxpc3QgKG9yIGFuIGFycmF5KSBvZiBtdWx0aXBsZSBzY2FsYXIgdmFsdWVz IGFyZSBhZmZlY3RlZC4gIFNlZQorICAgIDx4cmVmIGxpbmtlbmQ9ImZ1bmN0aW9ucy1jb21wYXJp c29ucyIvPiBmb3IgZGV0YWlscy4KKyAgIDwvcGFyYT4KKyAgPC9ub3RlPgorCiAgPC9zZWN0Mj4K IAogIDxzZWN0MiBpZD0ibW9uaXRvcmluZy1wZy1zdGF0aW8tYWxsLXRhYmxlcy12aWV3Ij4KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAppbmRleCBhY2ZkOWQxZjQu Ljg0YzA2OGFlMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVf aW5kZXgub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91 dApAQCAtMTkxMCw3ICsxOTEwLDcgQEAgU0VMRUNUIGNvdW50KCopIEZST00gZHVwaW5kZXhjb2xz CiAoMSByb3cpCiAKIC0tCi0tLSBDaGVjayBvcmRlcmluZyBvZiA9QU5ZIGluZGV4cXVhbCByZXN1 bHRzIChidWcgaW4gOS4yLjApCistLSBDaGVjayB0aGF0IGluZGV4IHNjYW5zIHdpdGggPUFOWSBp bmRleHF1YWxzIHJldHVybiByb3dzIGluIGluZGV4IG9yZGVyCiAtLQogZXhwbGFpbiAoY29zdHMg b2ZmKQogU0VMRUNUIHVuaXF1ZTEgRlJPTSB0ZW5rMQpAQCAtMTkzNiwxMiArMTkzNiwxMSBAQCBl eHBsYWluIChjb3N0cyBvZmYpCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEK IFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZ IHRob3VzYW5kOwotICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsx Ci0gICBJbmRleCBDb25kOiAodGhvdXNhbmQgPCAyKQotICAgRmlsdGVyOiAodGVudGhvdXMgPSBB TlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpCi0oMyByb3dzKQorICAgSW5kZXggQ29uZDog KCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVn ZXJbXSkpKQorKDIgcm93cykKIAogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsx CiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCkBAIC0xOTUy LDE4ICsxOTUxLDM1IEBAIE9SREVSIEJZIHRob3VzYW5kOwogICAgICAgICAxIHwgICAgIDEwMDEK ICgyIHJvd3MpCiAKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB0aG91c2FuZCwgdGVudGhv dXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwz MDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluZGV4IE9ubHkgU2NhbiBC YWNrd2FyZCB1c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMQorICAgSW5kZXggQ29u ZDogKCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6Omlu dGVnZXJbXSkpKQorKDIgcm93cykKKworU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRl bmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitPUkRF UiBCWSB0aG91c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOworIHRob3VzYW5kIHwgdGVudGhvdXMg CistLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAgICAgICAgMSB8ICAgICAxMDAxCisgICAgICAgIDAg fCAgICAgMzAwMAorKDIgcm93cykKKwogU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuID0gT0ZGOwog ZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsx CiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBC WSB0aG91c2FuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQotIFNvcnQKLSAgIFNvcnQgS2V5OiB0aG91c2FuZAotICAgLT4gIElu ZGV4IFNjYW4gdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24gdGVuazEKLSAgICAgICAgIElu ZGV4IENvbmQ6ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgnezEwMDEsMzAw MH0nOjppbnRlZ2VyW10pKSkKLSg0IHJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRo b3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91 cyA9IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQogCiBTRUxFQ1Qg dGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVu dGhvdXMgSU4gKDEwMDEsMzAwMCkKQEAgLTE5NzQsNiArMTk5MCwyNSBAQCBPUkRFUiBCWSB0aG91 c2FuZDsKICAgICAgICAgMSB8ICAgICAxMDAxCiAoMiByb3dzKQogCitleHBsYWluIChjb3N0cyBv ZmYpCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5k IDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0Ms IHRlbnRob3VzIERFU0M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBJbmRleCBTY2FuIEJhY2t3YXJkIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3Vz IG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9 IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQorCitTRUxFQ1QgdGhv dXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhv dXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7 CisgdGhvdXNhbmQgfCB0ZW50aG91cyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICAgICAgICAx IHwgICAgIDEwMDEKKyAgICAgICAgMCB8ICAgICAzMDAwCisoMiByb3dzKQorCiBSRVNFVCBlbmFi bGVfaW5kZXhvbmx5c2NhbjsKIC0tCiAtLSBDaGVjayBlbGltaW5hdGlvbiBvZiBjb25zdGFudC1O VUxMIHN1YmV4cHJlc3Npb25zCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCBiOTVk MzBmNjUuLjI1ODE1NjM0YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9q b2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC03Nzk1 LDEwICs3Nzk1LDkgQEAgd2hlcmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAg PSAxIGFuZCBqMi5pZDEgPj0gYW55IChhcnJheVsxLDVdKTsKICAgIE1lcmdlIENvbmQ6IChqMS5p ZDEgPSBqMi5pZDEpCiAgICBKb2luIEZpbHRlcjogKGoyLmlkMiA9IGoxLmlkMikKICAgIC0+ICBJ bmRleCBTY2FuIHVzaW5nIGoxX2lkMV9pZHggb24gajEKLSAgIC0+ICBJbmRleCBPbmx5IFNjYW4g dXNpbmcgajJfcGtleSBvbiBqMgorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajJfaWQxX2lkeCBv biBqMgogICAgICAgICAgSW5kZXggQ29uZDogKGlkMSA+PSBBTlkgKCd7MSw1fSc6OmludGVnZXJb XSkpCi0gICAgICAgICBGaWx0ZXI6ICgoaWQxICUgMTAwMCkgPSAxKQotKDcgcm93cykKKyg2IHJv d3MpCiAKIHNlbGVjdCAqIGZyb20gajEKIGlubmVyIGpvaW4gajIgb24gajEuaWQxID0gajIuaWQx IGFuZCBqMS5pZDIgPSBqMi5pZDIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Ny ZWF0ZV9pbmRleC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCmlu ZGV4IGQ0OWNlOWYzMC4uNDFiOTU1YTI3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9jcmVhdGVfaW5kZXguc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRl eC5zcWwKQEAgLTc1Myw3ICs3NTMsNyBAQCBTRUxFQ1QgY291bnQoKikgRlJPTSBkdXBpbmRleGNv bHMKICAgV0hFUkUgZjEgQkVUV0VFTiAnV0EnIEFORCAnWlpaJyBhbmQgaWQgPCAxMDAwIGFuZCBm MSB+PH4gJ1lYJzsKIAogLS0KLS0tIENoZWNrIG9yZGVyaW5nIG9mID1BTlkgaW5kZXhxdWFsIHJl c3VsdHMgKGJ1ZyBpbiA5LjIuMCkKKy0tIENoZWNrIHRoYXQgaW5kZXggc2NhbnMgd2l0aCA9QU5Z IGluZGV4cXVhbHMgcmV0dXJuIHJvd3MgaW4gaW5kZXggb3JkZXIKIC0tCiAKIGV4cGxhaW4gKGNv c3RzIG9mZikKQEAgLTc3NCw2ICs3NzQsMTUgQEAgU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBG Uk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDAp CiBPUkRFUiBCWSB0aG91c2FuZDsKIAorZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIHRob3Vz YW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3Vz IElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOwor CitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwg MiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRl bnRob3VzIERFU0M7CisKIFNFVCBlbmFibGVfaW5kZXhvbmx5c2NhbiA9IE9GRjsKIAogZXhwbGFp biAoY29zdHMgb2ZmKQpAQCAtNzg1LDYgKzc5NCwxNSBAQCBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRo b3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEs MzAwMCkKIE9SREVSIEJZIHRob3VzYW5kOwogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1Qg dGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVu dGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERF U0M7CisKK1NFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNh bmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVT QywgdGVudGhvdXMgREVTQzsKKwogUkVTRVQgZW5hYmxlX2luZGV4b25seXNjYW47CiAKIC0tCi0t IAoyLjQyLjAKCg== --00000000000015453d06082d8ecc--