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 1qs850-006svA-1J for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Oct 2023 20:51:18 +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 1qs84x-00CcAp-Qo for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Oct 2023 20:51:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qs84x-00CcAh-7w for pgsql-hackers@lists.postgresql.org; Sun, 15 Oct 2023 20:51:16 +0000 Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qs84t-000qVV-5M for pgsql-hackers@lists.postgresql.org; Sun, 15 Oct 2023 20:51:15 +0000 Received: by mail-vk1-xa35.google.com with SMTP id 71dfb90a1353d-49e035bdca7so1233700e0c.2 for ; Sun, 15 Oct 2023 13:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1697403069; x=1698007869; 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=sRK60tfb3j+1n+pl/zPvcQuMD948M4ff3EAt3rjwjZs=; b=0U4TQ4PC8dzs8a8/NMxYXFkenMFlVKNCQPwvtjqxVqIaCrfQD42AsBVxImoTgzZV6+ /9Ba9ROM4dA6mMpTPyjCnscn+5PpqRnFNUQQKbNQfyCwVEre+oHlHEv1xhM/KpdfM42i yXRPq0+pvN/vSeQ0OkF4e0dWn2MAXM6lqrHuHjFjl04hu0kYXpolLxzuDpT9jYl/gX9Q 4q0oN8ReKhh1cnvGNRxwLHupPX2B8/gYkxGpSDHgMb+94M1fnVvZ77qSO7y3XrKWqL8J sgP7/bCdrlHI3V9QQMnSXkIGQzo63i3Pr42iZSSfbtFPIeCamzF03ylcI9ixsXjAUTNe q/wQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697403069; x=1698007869; 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=sRK60tfb3j+1n+pl/zPvcQuMD948M4ff3EAt3rjwjZs=; b=TrSG4e/q1m/5SAI5ua35UqJ29fxSUe+AFHHo6jt+IacKdAE7CsjN3LuGBExbS7uASN UEjfe2PWFv34TFFyikRVSXG0UihXzQNybx31wv998UvsyEZvSSOsuA6dCx3qxjTuBilX BQ1eFGTt/MQ10S8BpVWuwOJmvWXkzC1Bd84VvZREyNpo5oq9C+6bDK09YWT1gjxN/iKc yoafB/2Hc/V0bl8hjwAXJ1RLtE7H8hDTvUO8feEJCZELPe4bhrMFlNeTyplVKlj/hSB3 pie6SnAfu8dEB5V50GLxUfNCUT1rOKbhLVR65Sj8C3P+eGKM/aAUp8X2VgGhj5/d1ywc 4mJQ== X-Gm-Message-State: AOJu0YxO6M2BnAWWwJCB40B/L13Z7+ZZPaNOHh5eDODnQjmvDqVcOoMV Muw+CKoRbcbmlNx18Wlvlru1TdkD5ETWigqG4mlshw== X-Google-Smtp-Source: AGHT+IHYEAXG2Ky+cY249J581eo1JEcpF3VJ8OmuvWczt051zWWri7shn/Bc6sWocsUlXQe79wKJkTovcAArxqfKNgE= X-Received: by 2002:a1f:62c2:0:b0:4a1:79e9:e6b with SMTP id w185-20020a1f62c2000000b004a179e90e6bmr13892508vkb.15.1697403069173; Sun, 15 Oct 2023 13:51:09 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Sun, 15 Oct 2023 13:50:43 -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="000000000000fb240f0607c77218" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000fb240f0607c77218 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Sep 28, 2023 at 5:32=E2=80=AFPM Peter Geoghegan wrote: > On Sun, Sep 17, 2023 at 4:47=E2=80=AFPM Peter Geoghegan wrot= e: > > Attached is v2, which makes all array key advancement take place using > > the "next index tuple" approach (using binary searches to find array > > keys using index tuple values). > > Attached is v3, which fixes bitrot caused by today's bugfix commit 714780= dc. 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. The commit in question is rather poorly documented, and it's not immediately clear how to integrate it with my work. I just want to make sure that there's a testable patch available. --=20 Peter Geoghegan --000000000000fb240f0607c77218 Content-Type: application/octet-stream; name="v4-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v4-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lnrxy0jm0 RnJvbSA5OGJlZGE5YjY0ZDkyNThiOTg4NmU1ZjE0MjhhYmQ2OTUyN2RhZDJmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHY0XSBFbmhhbmNl 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 UCBxdWFscy4KCm5idHJlZSBpcyBub3cgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBhdm9pZCBhbGwg cmVwZWF0IGFjY2Vzc2VzIHRvIGFueQppbmRpdmlkdWFsIGxlYWYgcGFnZSwgZXZlbiBpbiBjYXNl cyB3aXRoIGluZXF1YWxpdGllcyBvbiBoaWdoIG9yZGVyCmNvbHVtbnMgKGV4Y2VwdCB3aGVuIHRo ZSBzY2FuIGRpcmVjdGlvbiBjaGFuZ2VzLCBvciB0aGUgc2NhbiByZXN0YXJ0cykuCldlIG5vdyBo YXZlIHN0cm9uZyBndWFyYW50ZWVzIGFib3V0IHRoZSB3b3JzdCBjYXNlLCB3aGljaCBpcyB2ZXJ5 IHVzZWZ1bAp3aGVuIGNvc3RpbmcgaW5kZXggc2NhbnMgd2l0aCBTQU9QIGNsYXVzZXMuICBUaGUg Y29zdCBwcm9maWxlIG9mIGluZGV4CnBhdGhzIHdpdGggbXVsdGlwbGUgU0FPUCBjbGF1c2VzIGlz IG5vdyBhIGxvdCBjbG9zZXIgdG8gb3RoZXIgY2FzZXM7Cm1vcmUgc2VsZWN0aXZlIGluZGV4IHNj YW5zIHdpbGwgbm93IGdlbmVyYWxseSBoYXZlIGxvd2VyIGNvc3RzIHRoYW4gbGVzcwpzZWxlY3Rp dmUgaW5kZXggc2NhbnMuICBUaGUgYWRkZWQgY29zdCBmcm9tIHJlcGVhdGVkbHkgZGVzY2VuZGlu ZyB0aGUKaW5kZXggc3RpbGwgbWF0dGVycywgYnV0IGl0IGNhbiBuZXZlciBkb21pbmF0ZS4KCkFu IGltcG9ydGFudCBnb2FsIG9mIHRoaXMgd29yayBpcyB0byByZW1vdmUgYWxsIFNjYWxhckFycmF5 T3BFeHByIGNsYXVzZQpzcGVjaWFsIGNhc2VzIGZyb20gdGhlIHBsYW5uZXIgLS0gU2NhbGFyQXJy YXlPcEV4cHIgY2xhdXNlcyBjYW4gbm93IGJlCnRob3VnaHQgb2YgYSBnZW5lcmFsaXphdGlvbiBv ZiBzaW1wbGUgZXF1YWxpdHkgY2xhdXNlcyAoZXhjZXB0IHdoZW4KY29zdGluZyBpbmRleCBzY2Fu cywgcGVyaGFwcykuICBUaGUgcGxhbm5lciBubyBsb25nZXIgbmVlZHMgdG8gZ2VuZXJhdGUKYWx0 ZXJuYXRpdmUgaW5kZXggcGF0aHMgd2l0aCBmaWx0ZXIgcXVhbHMvcXBxdWFscy4gIFdlIGFzc3Vt ZSB0aGF0IHRydWUKU0FPUCBpbmRleCBxdWFscyBhcmUgc3RyaWN0bHkgYmV0dGVyIHRoYW4gZmls dGVyL3FwcXVhbHMsIHNpbmNlIHRoZSB3b3JrCmluIG5idHJlZSBndWFyYW50ZWVzIHRoYXQgdGhl eSdsbCBiZSBhdCBsZWFzdCBzbGlnaHRseSBmYXN0ZXIuCgpNYW55IG9mIHRoZSBxdWVyaWVzIHNw ZWQgdXAgYnkgdGhlIHdvcmsgZnJvbSB0aGlzIGNvbW1pdCBkb24ndCBkaXJlY3RseQpiZW5lZml0 IGZyb20gdGhlIG5idHJlZS9leGVjdXRvciBlbmhhbmNlbWVudHMuICBUaGV5IGJlbmVmaXQgaW5k aXJlY3RseS4KVGhlIHBsYW5uZXIgbm8gbG9uZ2VyIHNob3dzIGFueSByZXN0cmFpbnQgYXJvdW5k IG1ha2luZyBTQU9QIGNsYXVzZXMKaW50byB0cnVlIG5idHJlZSBpbmRleCBxdWFscywgd2hpY2gg dGVuZHMgdG8gcmVzdWx0IGluIHNpZ25pZmljYW50CnNhdmluZ3Mgb24gaGVhcCBwYWdlIGFjY2Vz c2VzLiAgSW4gZ2VuZXJhbCB3ZSBuZXZlciBuZWVkIHZpc2liaWxpdHkKY2hlY2tzIHRvIGV2YWx1 YXRlIHRydWUgaW5kZXggcXVhbHMsIHdoZXJlYXMgZmlsdGVyIHF1YWxzIG9mdGVuIG5lZWQgdG8K cGVyZm9ybSBleHRyYSBoZWFwIGFjY2Vzc2VzLCBqdXN0IHRvIGVsaW1pbmF0ZSBub24tbWF0Y2hp bmcgdHVwbGVzCihleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgb25seSBzYWZlIHdpdGgga25vd24g dmlzaWJsZSB0dXBsZXMpLgoKQXV0aG9yOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRp c2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FIMi1Xej1rc3ZOX3NqY25EMStCdC1XdGlm UkE1b2s0OGFEWW5xM3BrS2h4Z01RcGN3QG1haWwuZ21haWwuY29tCi0tLQogc3JjL2luY2x1ZGUv YWNjZXNzL25idHJlZS5oICAgICAgICAgICAgICAgIHwgICAzOSArLQogc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRyZWUuYyAgICAgICAgIHwgICA2NSArLQogc3JjL2JhY2tlbmQvYWNjZXNz L25idHJlZS9uYnRzZWFyY2guYyAgICAgIHwgICA5NSArLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR1dGlscy5jICAgICAgIHwgMTM4NiArKysrKysrKysrKysrKysrKystLQogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgIHwgICA2NCArLQogc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgIHwgIDEyMyArLQogZG9jL3NyYy9zZ21s L21vbml0b3Jpbmcuc2dtbCAgICAgICAgICAgICAgIHwgICAxMyArCiBzcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgfCAgIDYxICstCiBzcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2pvaW4ub3V0ICAgICAgICAgfCAgICA1ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9j cmVhdGVfaW5kZXguc3FsICAgICAgfCAgIDIwICstCiAxMCBmaWxlcyBjaGFuZ2VkLCAxNTE2IGlu c2VydGlvbnMoKyksIDM1NSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9h Y2Nlc3MvbmJ0cmVlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKaW5kZXggN2JmYmYz MDg2Li5kZTdkZWE0MWMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUuaAor KysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKQEAgLTEwNDMsMTMgKzEwNDMsMTMgQEAg dHlwZWRlZiBzdHJ1Y3QgQlRTY2FuT3BhcXVlRGF0YQogCiAJLyogd29ya3NwYWNlIGZvciBTS19T RUFSQ0hBUlJBWSBzdXBwb3J0ICovCiAJU2NhbktleQkJYXJyYXlLZXlEYXRhOwkvKiBtb2RpZmll ZCBjb3B5IG9mIHNjYW4tPmtleURhdGEgKi8KLQlib29sCQlhcnJheXNTdGFydGVkOwkvKiBTdGFy dGVkIGFycmF5IGtleXMsIGJ1dCBoYXZlIHlldCB0byAicmVhY2gKLQkJCQkJCQkJICogcGFzdCB0 aGUgZW5kIiBvZiBhbGwgYXJyYXlzPyAqLwogCWludAkJCW51bUFycmF5S2V5czsJLyogbnVtYmVy IG9mIGVxdWFsaXR5LXR5cGUgYXJyYXkga2V5cyAoLTEgaWYKIAkJCQkJCQkJICogdGhlcmUgYXJl IGFueSB1bnNhdGlzZmlhYmxlIGFycmF5IGtleXMpICovCi0JaW50CQkJYXJyYXlLZXlDb3VudDsJ LyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2YgYXJyYXkgc2NhbiBrZXlzCi0JCQkJCQkJCSAq IHByb2Nlc3NlZCAqLworCWJvb2wJCW5lZWRQcmltU2NhbjsJLyogUGVyZm9ybSBhbm90aGVyIHBy aW1pdGl2ZSBzY2FuPyAqLwogCUJUQXJyYXlLZXlJbmZvICphcnJheUtleXM7CS8qIGluZm8gYWJv dXQgZWFjaCBlcXVhbGl0eS10eXBlIGFycmF5IGtleSAqLworCUZtZ3JJbmZvICAgKm9yZGVyUHJv Y3M7CQkvKiBPUkRFUiBwcm9jcyBmb3IgZXF1YWxpdHkgY29uc3RyYWludCBrZXlzICovCisJaW50 CQkJbnVtUHJpbVNjYW5zOwkvKiBSdW5uaW5nIHRhbGx5IG9mICMgcHJpbWl0aXZlIGluZGV4IHNj YW5zCisJCQkJCQkJCSAqICh1c2VkIHRvIGNvb3JkaW5hdGUgcGFyYWxsZWwgd29ya2VycykgKi8K IAlNZW1vcnlDb250ZXh0IGFycmF5Q29udGV4dDsgLyogc2Nhbi1saWZlc3BhbiBjb250ZXh0IGZv ciBhcnJheSBkYXRhICovCiAKIAkvKiBpbmZvIGFib3V0IGtpbGxlZCBpdGVtcyBpZiBhbnkgKGtp bGxlZEl0ZW1zIGlzIE5VTEwgaWYgbmV2ZXIgdXNlZCkgKi8KQEAgLTEwODMsNiArMTA4MywyOSBA QCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5PcGFxdWVEYXRhCiAKIHR5cGVkZWYgQlRTY2FuT3BhcXVl RGF0YSAqQlRTY2FuT3BhcXVlOwogCisvKgorICogX2J0X3JlYWRwYWdlIHN0YXRlIHVzZWQgYWNy b3NzIF9idF9jaGVja2tleXMgY2FsbHMgZm9yIGEgcGFnZQorICoKKyAqIFdoZW4gX2J0X3JlYWRw YWdlIGlzIGNhbGxlZCBkdXJpbmcgYSBmb3J3YXJkIHNjYW4gdGhhdCBoYXMgb25lIG9yIG1vcmUK KyAqIGVxdWFsaXR5LXR5cGUgU0tfU0VBUkNIQVJSQVkgc2NhbiBrZXlzLCBpdCBoYXMgYW4gZXh0 cmEgcmVzcG9uc2liaWxpdHk6IHRvCisgKiBzZXQgdXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBh Z2UgaGlnaCBrZXkuICBUaGlzIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUKKyAqIGZpcnN0IGNhbGwg dG8gX2J0X2NoZWNra2V5cy4gIF9idF9jaGVja2tleXMgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRv IG1hbmFnZQorICogYWR2YW5jZW1lbnQgb2YgdGhlIHNjYW4ncyBhcnJheSBrZXlzLgorICovCit0 eXBlZGVmIHN0cnVjdCBCVFJlYWRQYWdlU3RhdGUKK3sKKwkvKiBJbnB1dCBwYXJhbWV0ZXJzLCBz ZXQgYnkgX2J0X3JlYWRwYWdlICovCisJU2NhbkRpcmVjdGlvbiBkaXI7CQkJLyogY3VycmVudCBz Y2FuIGRpcmVjdGlvbiAqLworCUluZGV4VHVwbGUJaGlnaGtleTsJCS8qIHBhZ2UgaGlnaCBrZXks IHNldCBieSBmb3J3YXJkIHNjYW5zICovCisKKwkvKiBPdXRwdXQgcGFyYW1ldGVycywgc2V0IGJ5 IF9idF9jaGVja2tleXMgKi8KKwlib29sCQljb250aW51ZXNjYW47CS8qIFRlcm1pbmF0ZSBvbmdv aW5nIChwcmltaXRpdmUpIGluZGV4IHNjYW4/ICovCisKKwkvKiBQcml2YXRlIF9idF9jaGVja2tl eXMtbWFuYWdlZCBzdGF0ZSAqLworCWJvb2wJCWhpZ2hrZXljaGVja2VkOyAvKiBoaWdoIGtleSBj aGVja2VkIGFnYWluc3QgY3VycmVudAorCQkJCQkJCQkgKiBTS19TRUFSQ0hBUlJBWSBhcnJheSBr ZXlzPyAqLworfSBCVFJlYWRQYWdlU3RhdGU7CisKIC8qCiAgKiBXZSB1c2Ugc29tZSBwcml2YXRl IHNrX2ZsYWdzIGJpdHMgaW4gcHJlcHJvY2Vzc2VkIHNjYW4ga2V5cy4gIFdlJ3JlIGFsbG93ZWQK ICAqIHRvIHVzZSBiaXRzIDE2LTMxIChzZWUgc2tleS5oKS4gIFRoZSB1cHBlcm1vc3QgYml0cyBh cmUgY29waWVkIGZyb20gdGhlCkBAIC0xMTYwLDcgKzExODMsNyBAQCBleHRlcm4gYm9vbCBidGNh bnJldHVybihSZWxhdGlvbiBpbmRleCwgaW50IGF0dG5vKTsKIGV4dGVybiBib29sIF9idF9wYXJh bGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pOwogZXh0 ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX3JlbGVhc2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051 bWJlciBzY2FuX3BhZ2UpOwogZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX2RvbmUoSW5kZXhTY2Fu RGVzYyBzY2FuKTsKLWV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMo SW5kZXhTY2FuRGVzYyBzY2FuKTsKK2V4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9uZXh0X3ByaW1p dGl2ZV9zY2FuKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZvciBm dW5jdGlvbnMgaW4gbmJ0ZGVkdXAuYwpAQCAtMTI1MywxMiArMTI3NiwxMiBAQCBleHRlcm4gQlRT Y2FuSW5zZXJ0IF9idF9ta3NjYW5rZXkoUmVsYXRpb24gcmVsLCBJbmRleFR1cGxlIGl0dXApOwog ZXh0ZXJuIHZvaWQgX2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKTsKIGV4dGVybiB2b2lkIF9i dF9wcmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lk IF9idF9zdGFydF9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIpOwotZXh0ZXJuIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiBib29sIF9idF9hcnJheV9rZXlzX3JlbWFp bihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKIGV4dGVybiB2b2lkIF9i dF9tYXJrX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9y ZXN0b3JlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9idF9w cmVwcm9jZXNzX2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKLWV4dGVybiBib29sIF9idF9jaGVj a2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLAotCQkJCQkJICBpbnQg dHVwbmF0dHMsIFNjYW5EaXJlY3Rpb24gZGlyLCBib29sICpjb250aW51ZXNjYW4sCitleHRlcm4g Ym9vbCBfYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpw c3RhdGUsCisJCQkJCQkgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgZmluYWx0dXAsCiAJCQkJCQkg IGJvb2wgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CiBleHRlcm4gdm9pZCBfYnRfa2lsbGl0 ZW1zKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBleHRlcm4gQlRDeWNsZUlkIF9idF92YWN1dW1fY3lj bGVpZChSZWxhdGlvbiByZWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJl ZS9uYnRyZWUuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMKaW5kZXggOTI5 NTBiMzc3Li4yYTQ2M2M0MjAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUv bmJ0cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwpAQCAtNDgs OCArNDgsOCBAQAogICogQlRQQVJBTExFTF9JRExFIGluZGljYXRlcyB0aGF0IG5vIGJhY2tlbmQg aXMgY3VycmVudGx5IGFkdmFuY2luZyB0aGUgc2NhbgogICogdG8gYSBuZXcgcGFnZTsgc29tZSBw cm9jZXNzIGNhbiBzdGFydCBkb2luZyB0aGF0LgogICoKLSAqIEJUUEFSQUxMRUxfRE9ORSBpbmRp Y2F0ZXMgdGhhdCB0aGUgc2NhbiBpcyBjb21wbGV0ZSAoaW5jbHVkaW5nIGVycm9yIGV4aXQpLgot ICogV2UgcmVhY2ggdGhpcyBzdGF0ZSBvbmNlIGZvciBldmVyeSBkaXN0aW5jdCBjb21iaW5hdGlv biBvZiBhcnJheSBrZXlzLgorICogQlRQQVJBTExFTF9ET05FIGluZGljYXRlcyB0aGF0IHRoZSBw cmltaXRpdmUgaW5kZXggc2NhbiBpcyBjb21wbGV0ZQorICogKGluY2x1ZGluZyBlcnJvciBleGl0 KS4gIFJlYWNoZWQgb25jZSBwZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4uCiAgKi8KIHR5cGVkZWYg ZW51bQogewpAQCAtNjksOCArNjksOCBAQCB0eXBlZGVmIHN0cnVjdCBCVFBhcmFsbGVsU2NhbkRl c2NEYXRhCiAJQlRQU19TdGF0ZQlidHBzX3BhZ2VTdGF0dXM7CS8qIGluZGljYXRlcyB3aGV0aGVy IG5leHQgcGFnZSBpcwogCQkJCQkJCQkJICogYXZhaWxhYmxlIGZvciBzY2FuLiBzZWUgYWJvdmUg Zm9yCiAJCQkJCQkJCQkgKiBwb3NzaWJsZSBzdGF0ZXMgb2YgcGFyYWxsZWwgc2Nhbi4gKi8KLQlp bnQJCQlidHBzX2FycmF5S2V5Q291bnQ7IC8qIGNvdW50IGluZGljYXRpbmcgbnVtYmVyIG9mIGFy cmF5IHNjYW4KLQkJCQkJCQkJCSAqIGtleXMgcHJvY2Vzc2VkIGJ5IHBhcmFsbGVsIHNjYW4gKi8K KwlpbnQJCQlidHBzX251bVByaW1TY2FuczsJLyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2Yg cHJpbWl0aXZlCisJCQkJCQkJCQkgKiBpbmRleCBzY2FucyAodXNlZCB3aXRoIGFycmF5IGtleXMp ICovCiAJc2xvY2tfdAkJYnRwc19tdXRleDsJCS8qIHByb3RlY3RzIGFib3ZlIHZhcmlhYmxlcyAq LwogCUNvbmRpdGlvblZhcmlhYmxlIGJ0cHNfY3Y7CS8qIHVzZWQgdG8gc3luY2hyb25pemUgcGFy YWxsZWwgc2NhbiAqLwogfQkJCUJUUGFyYWxsZWxTY2FuRGVzY0RhdGE7CkBAIC0yNzYsNyArMjc2 LDcgQEAgYnRnZXR0dXBsZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQog CQlpZiAocmVzKQogCQkJYnJlYWs7CiAJCS8qIC4uLiBvdGhlcndpc2Ugc2VlIGlmIHdlIGhhdmUg bW9yZSBhcnJheSBrZXlzIHRvIGRlYWwgd2l0aCAqLwotCX0gd2hpbGUgKHNvLT5udW1BcnJheUtl eXMgJiYgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhzY2FuLCBkaXIpKTsKKwl9IHdoaWxlIChzby0+ bnVtQXJyYXlLZXlzICYmIF9idF9hcnJheV9rZXlzX3JlbWFpbihzY2FuLCBkaXIpKTsKIAogCXJl dHVybiByZXM7CiB9CkBAIC0zMzQsNyArMzM0LDcgQEAgYnRnZXRiaXRtYXAoSW5kZXhTY2FuRGVz YyBzY2FuLCBUSURCaXRtYXAgKnRibSkKIAkJCX0KIAkJfQogCQkvKiBOb3cgc2VlIGlmIHdlIGhh dmUgbW9yZSBhcnJheSBrZXlzIHRvIGRlYWwgd2l0aCAqLwotCX0gd2hpbGUgKHNvLT5udW1BcnJh eUtleXMgJiYgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlv bikpOworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMgJiYgX2J0X2FycmF5X2tleXNfcmVtYWlu KHNjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uKSk7CiAKIAlyZXR1cm4gbnRpZHM7CiB9CkBAIC0z NjQsOSArMzY0LDEwIEBAIGJ0YmVnaW5zY2FuKFJlbGF0aW9uIHJlbCwgaW50IG5rZXlzLCBpbnQg bm9yZGVyYnlzKQogCQlzby0+a2V5RGF0YSA9IE5VTEw7CiAKIAlzby0+YXJyYXlLZXlEYXRhID0g TlVMTDsJLyogYXNzdW1lIG5vIGFycmF5IGtleXMgZm9yIG5vdyAqLwotCXNvLT5hcnJheXNTdGFy dGVkID0gZmFsc2U7CiAJc28tPm51bUFycmF5S2V5cyA9IDA7CisJc28tPm5lZWRQcmltU2NhbiA9 IGZhbHNlOwogCXNvLT5hcnJheUtleXMgPSBOVUxMOworCXNvLT5vcmRlclByb2NzID0gTlVMTDsK IAlzby0+YXJyYXlDb250ZXh0ID0gTlVMTDsKIAogCXNvLT5raWxsZWRJdGVtcyA9IE5VTEw7CQkv KiB1bnRpbCBuZWVkZWQgKi8KQEAgLTQwNiw3ICs0MDcsOCBAQCBidHJlc2NhbihJbmRleFNjYW5E ZXNjIHNjYW4sIFNjYW5LZXkgc2NhbmtleSwgaW50IG5zY2Fua2V5cywKIAl9CiAKIAlzby0+bWFy a0l0ZW1JbmRleCA9IC0xOwotCXNvLT5hcnJheUtleUNvdW50ID0gMDsKKwlzby0+bmVlZFByaW1T Y2FuID0gZmFsc2U7CisJc28tPm51bVByaW1TY2FucyA9IDA7CiAJc28tPmZpcnN0UGFnZSA9IGZh bHNlOwogCUJUU2NhblBvc1VucGluSWZQaW5uZWQoc28tPm1hcmtQb3MpOwogCUJUU2NhblBvc0lu dmFsaWRhdGUoc28tPm1hcmtQb3MpOwpAQCAtNTg4LDcgKzU5MCw3IEBAIGJ0aW5pdHBhcmFsbGVs c2Nhbih2b2lkICp0YXJnZXQpCiAJU3BpbkxvY2tJbml0KCZidF90YXJnZXQtPmJ0cHNfbXV0ZXgp OwogCWJ0X3RhcmdldC0+YnRwc19zY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsKIAlidF90 YXJnZXQtPmJ0cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfTk9UX0lOSVRJQUxJWkVEOwotCWJ0 X3RhcmdldC0+YnRwc19hcnJheUtleUNvdW50ID0gMDsKKwlidF90YXJnZXQtPmJ0cHNfbnVtUHJp bVNjYW5zID0gMDsKIAlDb25kaXRpb25WYXJpYWJsZUluaXQoJmJ0X3RhcmdldC0+YnRwc19jdik7 CiB9CiAKQEAgLTYxNCw3ICs2MTYsNyBAQCBidHBhcmFsbGVscmVzY2FuKEluZGV4U2NhbkRlc2Mg c2NhbikKIAlTcGluTG9ja0FjcXVpcmUoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiAJYnRzY2FuLT5i dHBzX3NjYW5QYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCWJ0c2Nhbi0+YnRwc19wYWdlU3Rh dHVzID0gQlRQQVJBTExFTF9OT1RfSU5JVElBTElaRUQ7Ci0JYnRzY2FuLT5idHBzX2FycmF5S2V5 Q291bnQgPSAwOworCWJ0c2Nhbi0+YnRwc19udW1QcmltU2NhbnMgPSAwOwogCVNwaW5Mb2NrUmVs ZWFzZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIH0KIApAQCAtNjI1LDcgKzYyNywxNyBAQCBidHBh cmFsbGVscmVzY2FuKEluZGV4U2NhbkRlc2Mgc2NhbikKICAqCiAgKiBUaGUgcmV0dXJuIHZhbHVl IGlzIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHNlaXplZCB0aGUgc2NhbiBhbmQgZmFsc2UKICAq IGlmIHdlIGRpZCBub3QuICBUaGUgbGF0dGVyIGNhc2Ugb2NjdXJzIGlmIG5vIHBhZ2VzIHJlbWFp biBmb3IgdGhlIGN1cnJlbnQKLSAqIHNldCBvZiBzY2Fua2V5cy4KKyAqIHByaW1pdGl2ZSBpbmRl eCBzY2FuLgorICoKKyAqIFdoZW4gYXJyYXkgc2NhbiBrZXlzIGFyZSBpbiB1c2UsIGVhY2ggd29y a2VyIHByb2Nlc3MgaW5kZXBlbmRlbnRseSBhZHZhbmNlcworICogaXRzIGFycmF5IGtleXMuICBJ dCdzIGNydWNpYWwgdGhhdCBlYWNoIHdvcmtlciBwcm9jZXNzIG5ldmVyIGJlIGFsbG93ZWQgdG8K KyAqIHNjYW4gYSBwYWdlIGZyb20gYmVmb3JlIHRoZSBjdXJyZW50IHNjYW4gcG9zaXRpb24uCisg KgorICogWFhYIFRoaXMgcGFydGljdWxhciBhc3BlY3Qgb2YgdGhlIHBhdGNoIGlzIHN0aWxsIGF0 IHRoZSBwcm9vZiBvZiBjb25jZXB0CisgKiBzdGFnZS4gIEhhdmluZyB0aGlzIG11Y2ggYXZhaWxh YmxlIGZvciByZXZpZXcgYXQgbGVhc3Qgc3VnZ2VzdHMgdGhhdCBpdCdsbAorICogYmUgZmVhc2li bGUgdG8gcG9ydCB0aGUgZXhpc3RpbmcgcGFyYWxsZWwgc2NhbiBhcnJheSBzY2FuIGtleSBzdHVm ZiBvdmVyIHRvCisgKiB1c2luZyBhIHByaW1pdGl2ZSBpbmRleCBzY2FuIGNvdW50ZXIgKGFzIG9w cG9zZWQgdG8gYW4gYXJyYXkga2V5IGNvdW50ZXIpCisgKiB0aGUgdG9wLWxldmVsIHNjYW4uICBJ IGhhdmUgeWV0IHRvIHJlYWxseSBwdXQgdGhpcyBjb2RlIHRocm91Z2ggaXRzIHBhY2VzLgogICoK ICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgKnBhZ2VubyByZXR1cm5zIHRoZSBuZXh0 IG9yIGN1cnJlbnQgcGFnZQogICogb2YgdGhlIHNjYW4gKGRlcGVuZGluZyBvbiB0aGUgc2NhbiBk aXJlY3Rpb24pLiAgQW4gaW52YWxpZCBibG9jayBudW1iZXIKQEAgLTY1NiwxNiArNjY4LDE3IEBA IF9idF9wYXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdl bm8pCiAJCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIAkJcGFnZVN0YXR1 cyA9IGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzOwogCi0JCWlmIChzby0+YXJyYXlLZXlDb3VudCA8 IGJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50KQorCQlpZiAoc28tPm51bVByaW1TY2FucyA8IGJ0 c2Nhbi0+YnRwc19udW1QcmltU2NhbnMpCiAJCXsKLQkJCS8qIFBhcmFsbGVsIHNjYW4gaGFzIGFs cmVhZHkgYWR2YW5jZWQgdG8gYSBuZXcgc2V0IG9mIHNjYW5rZXlzLiAqLworCQkJLyogVG9wLWxl dmVsIHNjYW4gYWxyZWFkeSBtb3ZlZCBvbiB0byBuZXh0IHByaW1pdGl2ZSBpbmRleCBzY2FuICov CiAJCQlzdGF0dXMgPSBmYWxzZTsKIAkJfQogCQllbHNlIGlmIChwYWdlU3RhdHVzID09IEJUUEFS QUxMRUxfRE9ORSkKIAkJewogCQkJLyoKLQkJCSAqIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHNldCBv ZiBzY2Fua2V5cy4gIFRoaXMgbWF5IGJlIHRoZSBlbmQsIG9yCi0JCQkgKiB0aGVyZSBjb3VsZCBi ZSBtb3JlIHNldHMgdG8gdHJ5LgorCQkJICogV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJpbWl0aXZl IGluZGV4IHNjYW4uICBUaGlzIG1pZ2h0IGhhdmUKKwkJCSAqIGJlZW4gdGhlIGZpbmFsIHByaW1p dGl2ZSBpbmRleCBzY2FuIHJlcXVpcmVkLCBvciB0aGUgdG9wLWxldmVsCisJCQkgKiBpbmRleCBz Y2FuIG1pZ2h0IHJlcXVpcmUgYWRkaXRpb25hbCBwcmltaXRpdmUgc2NhbnMuCiAJCQkgKi8KIAkJ CXN0YXR1cyA9IGZhbHNlOwogCQl9CkBAIC02OTcsOSArNzEwLDEyIEBAIF9idF9wYXJhbGxlbF9z ZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pCiB2b2lkCiBfYnRf cGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyIHNjYW5fcGFn ZSkKIHsKKwlCVFNjYW5PcGFxdWUgc28gUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZID0gKEJUU2Nh bk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwYXJhbGxlbF9z Y2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKIAlCVFBhcmFsbGVsU2NhbkRlc2MgYnRzY2FuOwog CisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwogCWJ0c2NhbiA9IChCVFBhcmFsbGVsU2Nh bkRlc2MpIE9mZnNldFRvUG9pbnRlcigodm9pZCAqKSBwYXJhbGxlbF9zY2FuLAogCQkJCQkJCQkJ CQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwogCkBAIC03MzMsMTIgKzc0OSwxMSBAQCBf YnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJCQkJCQkJCQkgIHBhcmFs bGVsX3NjYW4tPnBzX29mZnNldCk7CiAKIAkvKgotCSAqIE1hcmsgdGhlIHBhcmFsbGVsIHNjYW4g YXMgZG9uZSBmb3IgdGhpcyBjb21iaW5hdGlvbiBvZiBzY2FuIGtleXMsCi0JICogdW5sZXNzIHNv bWUgb3RoZXIgcHJvY2VzcyBhbHJlYWR5IGRpZCBzby4gIFNlZSBhbHNvCi0JICogX2J0X2FkdmFu Y2VfYXJyYXlfa2V5cy4KKwkgKiBNYXJrIHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBhcyBkb25l LCB1bmxlc3Mgc29tZSBvdGhlciBwcm9jZXNzCisJICogYWxyZWFkeSBkaWQgc28uICBTZWUgYWxz byBfYnRfYXJyYXlfa2V5c19yZW1haW4uCiAJICovCiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4t PmJ0cHNfbXV0ZXgpOwotCWlmIChzby0+YXJyYXlLZXlDb3VudCA+PSBidHNjYW4tPmJ0cHNfYXJy YXlLZXlDb3VudCAmJgorCWlmIChzby0+bnVtUHJpbVNjYW5zID49IGJ0c2Nhbi0+YnRwc19udW1Q cmltU2NhbnMgJiYKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgIT0gQlRQQVJBTExFTF9ET05F KQogCXsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX0RPTkU7CkBAIC03 NTIsMTQgKzc2NywxNCBAQCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5EZXNjIHNjYW4pCiB9 CiAKIC8qCi0gKiBfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlzKCkgLS0gQWR2YW5jZXMg dGhlIHBhcmFsbGVsIHNjYW4gZm9yIGFycmF5Ci0gKgkJCWtleXMuCisgKiBfYnRfcGFyYWxsZWxf bmV4dF9wcmltaXRpdmVfc2NhbigpIC0tIEFkdmFuY2VzIHBhcmFsbGVsIHByaW1pdGl2ZSBzY2Fu CisgKgkJCWNvdW50ZXIgd2hlbiBhcnJheSBrZXlzIGFyZSBpbiB1c2UuCiAgKgotICogVXBkYXRl cyB0aGUgY291bnQgb2YgYXJyYXkga2V5cyBwcm9jZXNzZWQgZm9yIGJvdGggbG9jYWwgYW5kIHBh cmFsbGVsCisgKiBVcGRhdGVzIHRoZSBjb3VudCBvZiBwcmltaXRpdmUgaW5kZXggc2NhbnMgZm9y IGJvdGggbG9jYWwgYW5kIHBhcmFsbGVsCiAgKiBzY2Fucy4KICAqLwogdm9pZAotX2J0X3BhcmFs bGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCitfYnRfcGFyYWxsZWxf bmV4dF9wcmltaXRpdmVfc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiB7CiAJQlRTY2FuT3BhcXVl IHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCVBhcmFsbGVsSW5kZXhTY2FuRGVz YyBwYXJhbGxlbF9zY2FuID0gc2Nhbi0+cGFyYWxsZWxfc2NhbjsKQEAgLTc2OCwxMyArNzgzLDEz IEBAIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQog CWJ0c2NhbiA9IChCVFBhcmFsbGVsU2NhbkRlc2MpIE9mZnNldFRvUG9pbnRlcigodm9pZCAqKSBw YXJhbGxlbF9zY2FuLAogCQkJCQkJCQkJCQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwog Ci0Jc28tPmFycmF5S2V5Q291bnQrKzsKKwlzby0+bnVtUHJpbVNjYW5zKys7CiAJU3BpbkxvY2tB Y3F1aXJlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogCWlmIChidHNjYW4tPmJ0cHNfcGFnZVN0YXR1 cyA9PSBCVFBBUkFMTEVMX0RPTkUpCiAJewogCQlidHNjYW4tPmJ0cHNfc2NhblBhZ2UgPSBJbnZh bGlkQmxvY2tOdW1iZXI7CiAJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0gQlRQQVJBTExFTF9O T1RfSU5JVElBTElaRUQ7Ci0JCWJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50Kys7CisJCWJ0c2Nh bi0+YnRwc19udW1QcmltU2NhbnMrKzsKIAl9CiAJU3BpbkxvY2tSZWxlYXNlKCZidHNjYW4tPmJ0 cHNfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRz ZWFyY2guYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKaW5kZXggZWZj NTI4NGU1Li5hMmZjOWM2OTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUv bmJ0c2VhcmNoLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwpA QCAtODkzLDcgKzg5Myw3IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKQogCSAqLwogCWlmICghc28tPnF1YWxfb2spCiAJewotCQkvKiBOb3RpZnkgYW55 IG90aGVyIHdvcmtlcnMgdGhhdCB3ZSdyZSBkb25lIHdpdGggdGhpcyBzY2FuIGtleS4gKi8KKwkJ LyogTm90aWZ5IGFueSBvdGhlciB3b3JrZXJzIHRoYXQgdGhpcyBwcmltaXRpdmUgc2NhbiBpcyBk b25lICovCiAJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpA QCAtOTUyLDYgKzk1MiwxMCBAQCBfYnRfZmlyc3QoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGly ZWN0aW9uIGRpcikKIAkgKiBvbmUgd2UgdXNlIC0tLSBieSBkZWZpbml0aW9uLCB0aGV5IGFyZSBl aXRoZXIgcmVkdW5kYW50IG9yCiAJICogY29udHJhZGljdG9yeS4KIAkgKgorCSAqIFdoZW4gU0tf U0VBUkNIQVJSQVkga2V5cyBhcmUgaW4gdXNlLCBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X2tleXMg aXMKKwkgKiB1c2VkIHRvIGF2b2lkIHByZW1hdHVyZWx5IHN0b3BwaW5nIHRoZSBzY2FuIHdoZW4g YW4gYXJyYXkgZXF1YWxpdHkgcXVhbAorCSAqIGhhcyBpdHMgYXJyYXkga2V5cyBhZHZhbmNlZC4K KwkgKgogCSAqIEFueSByZWd1bGFyIChub3QgU0tfU0VBUkNITlVMTCkga2V5IGltcGxpZXMgYSBO T1QgTlVMTCBxdWFsaWZpZXIuCiAJICogSWYgdGhlIGluZGV4IHN0b3JlcyBudWxscyBhdCB0aGUg ZW5kIG9mIHRoZSBpbmRleCB3ZSdsbCBiZSBzdGFydGluZwogCSAqIGZyb20sIGFuZCB3ZSBoYXZl IG5vIGJvdW5kYXJ5IGtleSBmb3IgdGhlIGNvbHVtbiAod2hpY2ggbWVhbnMgdGhlIGtleQpAQCAt MTUzNywxMCArMTU0MSw4IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCUJUUGFnZU9wYXF1ZSBvcGFxdWU7 CiAJT2Zmc2V0TnVtYmVyIG1pbm9mZjsKIAlPZmZzZXROdW1iZXIgbWF4b2ZmOworCUJUUmVhZFBh Z2VTdGF0ZSBwc3RhdGU7CiAJaW50CQkJaXRlbUluZGV4OwotCWJvb2wJCWNvbnRpbnVlc2NhbjsK LQlpbnQJCQlpbmRuYXR0czsKLQlib29sCQlyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrOwogCiAJ LyoKIAkgKiBXZSBtdXN0IGhhdmUgdGhlIGJ1ZmZlciBwaW5uZWQgYW5kIGxvY2tlZCwgYnV0IHRo ZSB1c3VhbCBtYWNybyBjYW4ndCBiZQpAQCAtMTU2MCw4ICsxNTYyLDExIEBAIF9idF9yZWFkcGFn ZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2Zm bnVtKQogCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgQnVmZmVyR2V0QmxvY2tOdW1iZXIo c28tPmN1cnJQb3MuYnVmKSk7CiAJfQogCi0JY29udGludWVzY2FuID0gdHJ1ZTsJCS8qIGRlZmF1 bHQgYXNzdW1wdGlvbiAqLwotCWluZG5hdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mQXR0 cmlidXRlcyhzY2FuLT5pbmRleFJlbGF0aW9uKTsKKwlwc3RhdGUuZGlyID0gZGlyOworCXBzdGF0 ZS5oaWdoa2V5ID0gTlVMTDsKKwlwc3RhdGUuY29udGludWVzY2FuID0gdHJ1ZTsgLyogZGVmYXVs dCBhc3N1bXB0aW9uICovCisJcHN0YXRlLmhpZ2hrZXljaGVja2VkID0gZmFsc2U7CisKIAltaW5v ZmYgPSBQX0ZJUlNUREFUQUtFWShvcGFxdWUpOwogCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXRO dW1iZXIocGFnZSk7CiAKQEAgLTE2MTMsMjkgKzE2MTgsMzAgQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ ICovCiAJaWYgKCFzby0+Zmlyc3RQYWdlICYmIG1pbm9mZiA8IG1heG9mZikKIAl7Ci0JCUl0ZW1J ZAkJaWlkOwotCQlJbmRleFR1cGxlCWl0dXA7Ci0KLQkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdl LCBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgPyBtYXhvZmYgOiBtaW5vZmYpOwotCQlpdHVw ID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7Ci0KIAkJLyoKIAkJICogRG8g dGhlIHByZWNoZWNrLiAgTm90ZSB0aGF0IHdlIHBhc3MgdGhlIHBvaW50ZXIgdG8KIAkJICogJ3Jl cXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2snIHRvICdjb250aW51ZXNjYW4nIGFyZ3VtZW50LiAgVGhh dCB3aWxsCiAJCSAqIHNldCBmbGFnIHRvIHRydWUgaWYgYWxsIHJlcXVpcmVkIGtleXMgYXJlIHNh dGlzZmllZCBhbmQgZmFsc2UKIAkJICogb3RoZXJ3aXNlLgorCQkgKgorCQkgKiBYWFggRklYTUUK IAkJICovCi0JCSh2b2lkKSBfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAsIGluZG5hdHRzLCBkaXIs Ci0JCQkJCQkJICZyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrLCBmYWxzZSk7CiAJfQogCWVsc2UK IAl7CiAJCXNvLT5maXJzdFBhZ2UgPSBmYWxzZTsKLQkJcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVj ayA9IGZhbHNlOwogCX0KIAogCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCiAJewor CQkvKiBTS19TRUFSQ0hBUlJBWSBzY2FucyBtdXN0IHByb3ZpZGUgaGlnaCBrZXkgdXAgZnJvbnQg Ki8KKwkJaWYgKHNvLT5udW1BcnJheUtleXMgJiYgIVBfUklHSFRNT1NUKG9wYXF1ZSkpCisJCXsK KwkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJS0VZKTsKKworCQkJcHN0 YXRlLmhpZ2hrZXkgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJfQor CiAJCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KIAkJaXRlbUluZGV4ID0g MDsKIApAQCAtMTY0NSw3ICsxNjUxLDYgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCXsKIAkJCUl0ZW1J ZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBvZmZudW0pOwogCQkJSW5kZXhUdXBsZQlpdHVw OwotCQkJYm9vbAkJcGFzc2VzX3F1YWxzOwogCiAJCQkvKgogCQkJICogSWYgdGhlIHNjYW4gc3Bl Y2lmaWVzIG5vdCB0byByZXR1cm4ga2lsbGVkIHR1cGxlcywgdGhlbiB3ZQpAQCAtMTY1OSwxOCAr MTY2NCw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24g ZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCiAJCQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VH ZXRJdGVtKHBhZ2UsIGlpZCk7CiAKLQkJCXBhc3Nlc19xdWFscyA9IF9idF9jaGVja2tleXMoc2Nh biwgaXR1cCwgaW5kbmF0dHMsIGRpciwKLQkJCQkJCQkJCQkgJmNvbnRpbnVlc2NhbiwgcmVxdWly ZWRNYXRjaGVkQnlQcmVjaGVjayk7Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgcmVzdWx0IG9mIHBy ZWNoZWNraW5nIHJlcXVpcmVkIGtleXMgd2FzIHRydWUsIHRoZW4gaW4KLQkJCSAqIGFzc2VydC1l bmFibGVkIGJ1aWxkcyB3ZSBhbHNvIHJlY2hlY2sgdGhhdCB0aGUgX2J0X2NoZWNra2V5cygpCi0J CQkgKiByZXN1bHQgaXMgdGhlIHNhbWUuCi0JCQkgKi8KLQkJCUFzc2VydCghcmVxdWlyZWRNYXRj aGVkQnlQcmVjaGVjayB8fAotCQkJCSAgIHBhc3Nlc19xdWFscyA9PSBfYnRfY2hlY2trZXlzKHNj YW4sIGl0dXAsIGluZG5hdHRzLCBkaXIsCi0JCQkJCQkJCQkJCQkgJmNvbnRpbnVlc2NhbiwgZmFs c2UpKTsKLQkJCWlmIChwYXNzZXNfcXVhbHMpCisJCQlpZiAoX2J0X2NoZWNra2V5cyhzY2FuLCAm cHN0YXRlLCBpdHVwLCBmYWxzZSwgZmFsc2UpKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3NlcyBh bGwgc2NhbiBrZXkgY29uZGl0aW9ucyAqLwogCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhp dHVwKSkKQEAgLTE3MDMsNyArMTY5Nyw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJCX0KIAkJCX0K IAkJCS8qIFdoZW4gIWNvbnRpbnVlc2NhbiwgdGhlcmUgY2FuJ3QgYmUgYW55IG1vcmUgbWF0Y2hl cywgc28gc3RvcCAqLwotCQkJaWYgKCFjb250aW51ZXNjYW4pCisJCQlpZiAoIXBzdGF0ZS5jb250 aW51ZXNjYW4pCiAJCQkJYnJlYWs7CiAKIAkJCW9mZm51bSA9IE9mZnNldE51bWJlck5leHQob2Zm bnVtKTsKQEAgLTE3MjAsMTcgKzE3MTQsMjMgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCSAqIG9ubHkg YXBwZWFyIG9uIG5vbi1waXZvdCB0dXBsZXMgb24gdGhlIHJpZ2h0IHNpYmxpbmcgcGFnZSBhcmUK IAkJICogY29tbW9uLgogCQkgKi8KLQkJaWYgKGNvbnRpbnVlc2NhbiAmJiAhUF9SSUdIVE1PU1Qo b3BhcXVlKSkKKwkJaWYgKHBzdGF0ZS5jb250aW51ZXNjYW4gJiYgIVBfUklHSFRNT1NUKG9wYXF1 ZSkpCiAJCXsKLQkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJS0VZKTsK LQkJCUluZGV4VHVwbGUJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpaWQp OwotCQkJaW50CQkJdHJ1bmNhdHQ7CisJCQlJbmRleFR1cGxlCWl0dXA7CiAKLQkJCXRydW5jYXR0 ID0gQlRyZWVUdXBsZUdldE5BdHRzKGl0dXAsIHNjYW4tPmluZGV4UmVsYXRpb24pOwotCQkJX2J0 X2NoZWNra2V5cyhzY2FuLCBpdHVwLCB0cnVuY2F0dCwgZGlyLCAmY29udGludWVzY2FuLCBmYWxz ZSk7CisJCQlpZiAocHN0YXRlLmhpZ2hrZXkpCisJCQkJaXR1cCA9IHBzdGF0ZS5oaWdoa2V5Owor CQkJZWxzZQorCQkJeworCQkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJ S0VZKTsKKworCQkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsK KwkJCX0KKworCQkJX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLCB0cnVlLCBmYWxz ZSk7CiAJCX0KIAotCQlpZiAoIWNvbnRpbnVlc2NhbikKKwkJaWYgKCFwc3RhdGUuY29udGludWVz Y2FuKQogCQkJc28tPmN1cnJQb3MubW9yZVJpZ2h0ID0gZmFsc2U7CiAKIAkJQXNzZXJ0KGl0ZW1J bmRleCA8PSBNYXhUSURzUGVyQlRyZWVQYWdlKTsKQEAgLTE3NTEsNiArMTc1MSw3IEBAIF9idF9y ZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1i ZXIgb2ZmbnVtKQogCQkJSW5kZXhUdXBsZQlpdHVwOwogCQkJYm9vbAkJdHVwbGVfYWxpdmU7CiAJ CQlib29sCQlwYXNzZXNfcXVhbHM7CisJCQlib29sCQlmaW5hbHR1cCA9IChvZmZudW0gPT0gbWlu b2ZmKTsKIAogCQkJLyoKIAkJCSAqIElmIHRoZSBzY2FuIHNwZWNpZmllcyBub3QgdG8gcmV0dXJu IGtpbGxlZCB0dXBsZXMsIHRoZW4gd2UKQEAgLTE3NjEsMTIgKzE3NjIsMTggQEAgX2J0X3JlYWRw YWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBv ZmZudW0pCiAJCQkgKiB0dXBsZSBvbiB0aGUgcGFnZSwgd2UgZG8gY2hlY2sgdGhlIGluZGV4IGtl eXMsIHRvIHByZXZlbnQKIAkJCSAqIHVzZWxlc3NseSBhZHZhbmNpbmcgdG8gdGhlIHBhZ2UgdG8g dGhlIGxlZnQuICBUaGlzIGlzIHNpbWlsYXIKIAkJCSAqIHRvIHRoZSBoaWdoIGtleSBvcHRpbWl6 YXRpb24gdXNlZCBieSBmb3J3YXJkIHNjYW5zLgorCQkJICoKKwkJCSAqIFNlcGFyYXRlbHksIF9i dF9jaGVja2tleXMgYWN0dWFsbHkgcmVxdWlyZXMgdGhhdCB3ZSBjYWxsIGl0CisJCQkgKiB3aXRo IHRoZSBmaW5hbCBub24tcGl2b3QgdHVwbGUgZnJvbSB0aGUgcGFnZSwgaWYgdGhlcmUncyBvbmUK KwkJCSAqIChmaW5hbCBwcm9jZXNzZWQgdHVwbGUsIG9yIGZpcnN0IHR1cGxlIGluIG9mZnNldCBu dW1iZXIgdGVybXMpLgorCQkJICogV2UgbXVzdCBpbmRpY2F0ZSB3aGljaCBwYXJ0aWN1bGFyIHR1 cGxlIGNvbWVzIGxhc3QsIHRvby4KIAkJCSAqLwogCQkJaWYgKHNjYW4tPmlnbm9yZV9raWxsZWRf dHVwbGVzICYmIEl0ZW1JZElzRGVhZChpaWQpKQogCQkJewogCQkJCUFzc2VydChvZmZudW0gPj0g UF9GSVJTVERBVEFLRVkob3BhcXVlKSk7Ci0JCQkJaWYgKG9mZm51bSA+IFBfRklSU1REQVRBS0VZ KG9wYXF1ZSkpCisJCQkJaWYgKCFmaW5hbHR1cCkKIAkJCQl7CisJCQkJCUFzc2VydChvZmZudW0g PiBtaW5vZmYpOwogCQkJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJQcmV2KG9mZm51bSk7CiAJCQkJ CWNvbnRpbnVlOwogCQkJCX0KQEAgLTE3NzgsMTcgKzE3ODUsNyBAQCBfYnRfcmVhZHBhZ2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkK IAogCQkJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpaWQpOwogCi0JCQlw YXNzZXNfcXVhbHMgPSBfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAsIGluZG5hdHRzLCBkaXIsCi0J CQkJCQkJCQkJICZjb250aW51ZXNjYW4sIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwotCi0J CQkvKgotCQkJICogSWYgdGhlIHJlc3VsdCBvZiBwcmVjaGVja2luZyByZXF1aXJlZCBrZXlzIHdh cyB0cnVlLCB0aGVuIGluCi0JCQkgKiBhc3NlcnQtZW5hYmxlZCBidWlsZHMgd2UgYWxzbyByZWNo ZWNrIHRoYXQgdGhlIF9idF9jaGVja2tleXMoKQotCQkJICogcmVzdWx0IGlzIHRoZSBzYW1lLgot CQkJICovCi0JCQlBc3NlcnQoIXJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2sgfHwKLQkJCQkgICBw YXNzZXNfcXVhbHMgPT0gX2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGlyLAot CQkJCQkJCQkJCQkJICZjb250aW51ZXNjYW4sIGZhbHNlKSk7CisJCQlwYXNzZXNfcXVhbHMgPSBf YnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIGZpbmFsdHVwLCBmYWxzZSk7CiAJCQlp ZiAocGFzc2VzX3F1YWxzICYmIHR1cGxlX2FsaXZlKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3Nl cyBhbGwgc2NhbiBrZXkgY29uZGl0aW9ucyAqLwpAQCAtMTgyNyw3ICsxODI0LDcgQEAgX2J0X3Jl YWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJl ciBvZmZudW0pCiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoIWNvbnRpbnVlc2NhbikKKwkJ CWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXsKIAkJCQkvKiB0aGVyZSBjYW4ndCBiZSBh bnkgbW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCiAJCQkJc28tPmN1cnJQb3MubW9yZUxlZnQgPSBm YWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYyBi L3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwppbmRleCAxNTEwYjk3ZmIuLjM4 ZDRlYzQ2MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnR1dGlscy5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwpAQCAtMzMsNyArMzMs NyBAQAogCiB0eXBlZGVmIHN0cnVjdCBCVFNvcnRBcnJheUNvbnRleHQKIHsKLQlGbWdySW5mbwlm bGluZm87CisJRm1nckluZm8gICAqb3JkZXJwcm9jOwogCU9pZAkJCWNvbGxhdGlvbjsKIAlib29s CQlyZXZlcnNlOwogfSBCVFNvcnRBcnJheUNvbnRleHQ7CkBAIC00MSwxNSArNDEsMzQgQEAgdHlw ZWRlZiBzdHJ1Y3QgQlRTb3J0QXJyYXlDb250ZXh0CiBzdGF0aWMgRGF0dW0gX2J0X2ZpbmRfZXh0 cmVtZV9lbGVtZW50KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5LAogCQkJCQkJCQkJ ICBTdHJhdGVneU51bWJlciBzdHJhdCwKIAkJCQkJCQkJCSAgRGF0dW0gKmVsZW1zLCBpbnQgbmVs ZW1zKTsKK3N0YXRpYyB2b2lkIF9idF9zb3J0X2NtcF9mdW5jX3NldHVwKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbktleSBza2V5KTsKIHN0YXRpYyBpbnQJX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJCQkJCQkJCQlib29sIHJldmVyc2Us CiAJCQkJCQkJCQlEYXR1bSAqZWxlbXMsIGludCBuZWxlbXMpOwogc3RhdGljIGludAlfYnRfY29t cGFyZV9hcnJheV9lbGVtZW50cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCB2b2lkICph cmcpOworc3RhdGljIGlubGluZSBpbnQzMiBfYnRfY29tcGFyZV9hcnJheV9za2V5KFNjYW5LZXkg Y3VyLCBGbWdySW5mbyAqb3JkZXJwcm9jLAorCQkJCQkJCQkJCSAgIERhdHVtIGRhdHVtLCBib29s IG51bGwsCisJCQkJCQkJCQkJICAgRGF0dW0gYXJyZGF0dW0pOworc3RhdGljIGludAlfYnRfYmlu c3JjaF9hcnJheV9za2V5KFNjYW5EaXJlY3Rpb24gZGlyLCBib29sIGN1cl9lbGVtX3N0YXJ0LAor CQkJCQkJCQkgICBCVEFycmF5S2V5SW5mbyAqYXJyYXksIFNjYW5LZXkgY3VyLAorCQkJCQkJCQkg ICBGbWdySW5mbyAqb3JkZXJwcm9jLCBEYXR1bSBkYXR1bSwgYm9vbCBudWxsLAorCQkJCQkJCQkg ICBpbnQzMiAqZmluYWxfcmVzdWx0KTsKK3N0YXRpYyBib29sIF9idF90dXBsZV9iZWZvcmVfYXJy YXlfc2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLAorCQkJCQkJCQkJCSBCVFJlYWRQYWdlU3RhdGUg KnBzdGF0ZSwKKwkJCQkJCQkJCQkgSW5kZXhUdXBsZSB0dXBsZSk7CitzdGF0aWMgYm9vbCBfYnRf YWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpw c3RhdGUsCisJCQkJCQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgc2tyZXF1aXJlZHRyaWdn ZXIpOworc3RhdGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitzdGF0aWMgdm9pZCBfYnRfYWR2YW5j ZV9hcnJheV9rZXlzX3RvX2VuZChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGly KTsKIHN0YXRpYyBib29sIF9idF9jb21wYXJlX3NjYW5rZXlfYXJncyhJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5LZXkgb3AsCiAJCQkJCQkJCQkgU2NhbktleSBsZWZ0YXJnLCBTY2FuS2V5IHJpZ2h0 YXJnLAogCQkJCQkJCQkJIGJvb2wgKnJlc3VsdCk7CiBzdGF0aWMgYm9vbCBfYnRfZml4X3NjYW5r ZXlfc3RyYXRlZ3koU2NhbktleSBza2V5LCBpbnQxNiAqaW5kb3B0aW9uKTsKIHN0YXRpYyB2b2lk IF9idF9tYXJrX3NjYW5rZXlfcmVxdWlyZWQoU2NhbktleSBza2V5KTsKK3N0YXRpYyBib29sIF9i dF9jaGVja19jb21wYXJlKFNjYW5EaXJlY3Rpb24gZGlyLCBTY2FuS2V5IGtleURhdGEsIGludCBr ZXlzeiwKKwkJCQkJCQkgIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywgVHVwbGVEZXNj IHR1cGRlc2MsCisJCQkJCQkJICBib29sICpjb250aW51ZXNjYW4sIGJvb2wgKnNrcmVxdWlyZWR0 cmlnZ2VyLAorCQkJCQkJCSAgYm9vbCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKIHN0YXRp YyBib29sIF9idF9jaGVja19yb3djb21wYXJlKFNjYW5LZXkgc2tleSwKIAkJCQkJCQkJIEluZGV4 VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywgVHVwbGVEZXNjIHR1cGRlc2MsCiAJCQkJCQkJCSBT Y2FuRGlyZWN0aW9uIGRpciwgYm9vbCAqY29udGludWVzY2FuKTsKQEAgLTIwMiw2ICsyMjEsMjEg QEAgX2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKQogICogYXJyYXkga2V5cywgaXQncyBzdWZm aWNpZW50IHRvIGZpbmQgdGhlIGV4dHJlbWUgZWxlbWVudCB2YWx1ZSBhbmQgcmVwbGFjZQogICog dGhlIHdob2xlIGFycmF5IHdpdGggdGhhdCBzY2FsYXIgdmFsdWUuCiAgKgorICogSW4gdGhlIHdv cnN0IGNhc2UsIHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlIGluZGV4IHNjYW5zIHdpbGwgZXF1YWwg dGhlCisgKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKG9yIHRoZSBwcm9kdWN0IG9mIHRoZSBu dW1iZXIgb2YgYXJyYXkga2V5cyB3aGVuCisgKiB0aGVyZSBhcmUgbXVsdGlwbGUgYXJyYXlzL2Nv bHVtbnMgaW52b2x2ZWQpLiAgSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlCisgKiB0b3RhbCBu dW1iZXIgb2YgcHJpbWl0aXZlIGluZGV4IHNjYW5zIHdpbGwgYmUgZmFyIGxlc3MgdGhhbiB0aGF0 LgorICoKKyAqIFdlIGFsd2F5cyBzb3J0IGFuZCBkZWR1cGxpY2F0ZSBhcnJheXMgdXAtZnJvbnQg Zm9yIGVxdWFsaXR5IGFycmF5IGtleXMuCisgKiBTY2FsYXJBcnJheU9wRXhwciBleGVjdXRpb24g bmVlZCBvbmx5IHZpc2l0IGxlYWYgcGFnZXMgdGhhdCBtaWdodCBjb250YWluCisgKiBtYXRjaGVz IGV4YWN0bHkgb25jZSwgd2hpbGUgcHJlc2VydmluZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgaW5k ZXguICBUaGlzCisgKiBpc24ndCBqdXN0IGFib3V0IHBlcmZvcm1hbmNlOyBpdCBhbHNvIGF2b2lk cyBuZWVkaW5nIGR1cGxpY2F0ZSBlbGltaW5hdGlvbgorICogb2YgbWF0Y2hpbmcgVElEcyAod2Ug cHJlZmVyIGRlZHVwbGljYXRpbmcgc2VhcmNoIGtleXMgb25jZSwgdXAtZnJvbnQpLgorICogRXF1 YWxpdHkgU0tfU0VBUkNIQVJSQVkga2V5cyBhcmUgZGlzanVuY3RzIHRoYXQgd2UgYWx3YXlzIHBy b2Nlc3MgaW4KKyAqIGluZGV4L2tleSBzcGFjZSBvcmRlciwgd2hpY2ggbWFrZXMgdGhpcyBnZW5l cmFsIGFwcHJvYWNoIGZlYXNpYmxlLiAgRXZlcnkKKyAqIGluZGV4IHR1cGxlIHdpbGwgbWF0Y2gg bm8gbW9yZSB0aGFuIG9uZSBzaW5nbGUgZGlzdGluY3QgY29tYmluYXRpb24gb2YKKyAqIGVxdWFs aXR5LWNvbnN0cmFpbmVkIGtleXMgKGFycmF5IGtleXMgYW5kIG90aGVyIGVxdWFsaXR5IGtleXMp LgorICoKICAqIE5vdGU6IHRoZSByZWFzb24gd2UgbmVlZCBzby0+YXJyYXlLZXlEYXRhLCByYXRo ZXIgdGhhbiBqdXN0IHNjcmliYmxpbmcKICAqIG9uIHNjYW4tPmtleURhdGEsIGlzIHRoYXQgY2Fs bGVycyBhcmUgcGVybWl0dGVkIHRvIGNhbGwgYnRyZXNjYW4gd2l0aG91dAogICogc3VwcGx5aW5n IGEgbmV3IHNldCBvZiBzY2Fua2V5IGRhdGEuCkBAIC0yMTIsNiArMjQ2LDcgQEAgX2J0X3ByZXBy b2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJQlRTY2FuT3BhcXVlIHNvID0g KEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwogCWludAkJCW51bWJlck9mS2V5cyA9IHNjYW4t Pm51bWJlck9mS2V5czsKIAlpbnQxNgkgICAqaW5kb3B0aW9uID0gc2Nhbi0+aW5kZXhSZWxhdGlv bi0+cmRfaW5kb3B0aW9uOworCWludDE2CQlua2V5YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1i ZXJPZktleUF0dHJpYnV0ZXMoc2Nhbi0+aW5kZXhSZWxhdGlvbik7CiAJaW50CQkJbnVtQXJyYXlL ZXlzOwogCVNjYW5LZXkJCWN1cjsKIAlpbnQJCQlpOwpAQCAtMjY1LDYgKzMwMCw3IEBAIF9idF9w cmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCiAJLyogQWxsb2NhdGUg c3BhY2UgZm9yIHBlci1hcnJheSBkYXRhIGluIHRoZSB3b3Jrc3BhY2UgY29udGV4dCAqLwogCXNv LT5hcnJheUtleXMgPSAoQlRBcnJheUtleUluZm8gKikgcGFsbG9jMChudW1BcnJheUtleXMgKiBz aXplb2YoQlRBcnJheUtleUluZm8pKTsKKwlzby0+b3JkZXJQcm9jcyA9IChGbWdySW5mbyAqKSBw YWxsb2MobmtleWF0dHMgKiBzaXplb2YoRm1nckluZm8pKTsKIAogCS8qIE5vdyBwcm9jZXNzIGVh Y2ggYXJyYXkga2V5ICovCiAJbnVtQXJyYXlLZXlzID0gMDsKQEAgLTI4MSw2ICszMTcsMTcgQEAg X2J0X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJCWludAkJCWo7 CiAKIAkJY3VyID0gJnNvLT5hcnJheUtleURhdGFbaV07CisKKwkJLyoKKwkJICogQXR0cmlidXRl cyB3aXRoIGVxdWFsaXR5LXR5cGUgc2NhbiBrZXlzIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVk CisJCSAqIHRvIGFycmF5IHNjYW4ga2V5cykgd2lsbCBuZWVkIGEgMy13YXkgY29tcGFyaXNvbiBm dW5jdGlvbi4KKwkJICoKKwkJICogWFhYIENsZWFuIHRoaXMgdXAgc29tZSBtb3JlLiAgVGhpcyBy ZXBlYXRzIHNvbWUgb2YgdGhlIHNhbWUgd29yaworCQkgKiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBs ZSBzY2FuIGtleXMgZm9yIHRoZSBzYW1lIGtleSBjb2x1bW4uCisJCSAqLworCQlpZiAoY3VyLT5z a19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpCisJCQlfYnRfc29ydF9jbXBfZnVu Y19zZXR1cChzY2FuLCBjdXIpOworCiAJCWlmICghKGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hB UlJBWSkpCiAJCQljb250aW51ZTsKIApAQCAtNDM2LDYgKzQ4Myw0MiBAQCBfYnRfZmluZF9leHRy ZW1lX2VsZW1lbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJcmV0dXJuIHJl c3VsdDsKIH0KIAorLyoKKyAqIExvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZnVu Y3Rpb24gaW4gdGhlIG9wZmFtaWx5LgorICoKKyAqIE5vdGU6IGl0J3MgcG9zc2libGUgdGhhdCB0 aGlzIHdvdWxkIGZhaWwsIGlmIHRoZSBvcGZhbWlseSBpcyBpbmNvbXBsZXRlLAorICogYnV0IGl0 IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRoYXQgYW4gb3BmYW1pbHkgd291bGQgb21pdCBub24tY3Jv c3MtdHlwZQorICogc3VwcG9ydCBmdW5jdGlvbnMgZm9yIGFueSBkYXRhdHlwZSB0aGF0IGl0IHN1 cHBvcnRzIGF0IGFsbC4KKyAqLworc3RhdGljIHZvaWQKK19idF9zb3J0X2NtcF9mdW5jX3NldHVw KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5KQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9 IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRl eFJlbGF0aW9uOworCU9pZAkJCWVsZW10eXBlOworCVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsKKwlG bWdySW5mbyAgICpvcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8gLSAx XTsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBub21pbmFsIGRhdGF0eXBlIG9mIHRoZSBhcnJh eSBlbGVtZW50cy4gIFdlIGhhdmUgdG8KKwkgKiBzdXBwb3J0IHRoZSBjb252ZW50aW9uIHRoYXQg c2tfc3VidHlwZSA9PSBJbnZhbGlkT2lkIG1lYW5zIHRoZSBvcGNsYXNzCisJICogaW5wdXQgdHlw ZTsgdGhpcyBpcyBhIGhhY2sgdG8gc2ltcGxpZnkgbGlmZSBmb3IgU2NhbktleUluaXQoKS4KKwkg Ki8KKwllbGVtdHlwZSA9IHNrZXktPnNrX3N1YnR5cGU7CisJaWYgKGVsZW10eXBlID09IEludmFs aWRPaWQpCisJCWVsZW10eXBlID0gcmVsLT5yZF9vcGNpbnR5cGVbc2tleS0+c2tfYXR0bm8gLSAx XTsKKworCWNtcF9wcm9jID0gZ2V0X29wZmFtaWx5X3Byb2MocmVsLT5yZF9vcGZhbWlseVtza2V5 LT5za19hdHRubyAtIDFdLAorCQkJCQkJCQkgcmVsLT5yZF9vcGNpbnR5cGVbc2tleS0+c2tfYXR0 bm8gLSAxXSwKKwkJCQkJCQkJIGVsZW10eXBlLAorCQkJCQkJCQkgQlRPUkRFUl9QUk9DKTsKKwlp ZiAoIVJlZ1Byb2NlZHVyZUlzVmFsaWQoY21wX3Byb2MpKQorCQllbG9nKEVSUk9SLCAibWlzc2lu ZyBzdXBwb3J0IGZ1bmN0aW9uICVkKCV1LCV1KSBpbiBvcGZhbWlseSAldSIsCisJCQkgQlRPUkRF Ul9QUk9DLCBlbGVtdHlwZSwgZWxlbXR5cGUsCisJCQkgcmVsLT5yZF9vcGZhbWlseVtza2V5LT5z a19hdHRubyAtIDFdKTsKKwlmbWdyX2luZm9fY3h0KGNtcF9wcm9jLCBvcmRlcnByb2MsIHNvLT5h cnJheUNvbnRleHQpOworfQorCiAvKgogICogX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoKSAtLSBz b3J0IGFuZCBkZS1kdXAgYXJyYXkgZWxlbWVudHMKICAqCkBAIC00NTAsNDIgKzUzMywxNCBAQCBf YnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwK IAkJCQkJCWJvb2wgcmV2ZXJzZSwKIAkJCQkJCURhdHVtICplbGVtcywgaW50IG5lbGVtcykKIHsK LQlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOwotCU9pZAkJCWVsZW10eXBlOwot CVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVl KSBzY2FuLT5vcGFxdWU7CiAJQlRTb3J0QXJyYXlDb250ZXh0IGN4dDsKIAogCWlmIChuZWxlbXMg PD0gMSkKIAkJcmV0dXJuIG5lbGVtczsJCQkvKiBubyB3b3JrIHRvIGRvICovCiAKLQkvKgotCSAq IERldGVybWluZSB0aGUgbm9taW5hbCBkYXRhdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuICBX ZSBoYXZlIHRvCi0JICogc3VwcG9ydCB0aGUgY29udmVudGlvbiB0aGF0IHNrX3N1YnR5cGUgPT0g SW52YWxpZE9pZCBtZWFucyB0aGUgb3BjbGFzcwotCSAqIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBo YWNrIHRvIHNpbXBsaWZ5IGxpZmUgZm9yIFNjYW5LZXlJbml0KCkuCi0JICovCi0JZWxlbXR5cGUg PSBza2V5LT5za19zdWJ0eXBlOwotCWlmIChlbGVtdHlwZSA9PSBJbnZhbGlkT2lkKQotCQllbGVt dHlwZSA9IHJlbC0+cmRfb3BjaW50eXBlW3NrZXktPnNrX2F0dG5vIC0gMV07Ci0KLQkvKgotCSAq IExvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFt aWx5LgotCSAqCi0JICogTm90ZTogaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgd291bGQgZmFpbCwg aWYgdGhlIG9wZmFtaWx5IGlzCi0JICogaW5jb21wbGV0ZSwgYnV0IGl0IHNlZW1zIHF1aXRlIHVu bGlrZWx5IHRoYXQgYW4gb3BmYW1pbHkgd291bGQgb21pdAotCSAqIG5vbi1jcm9zcy10eXBlIHN1 cHBvcnQgZnVuY3Rpb25zIGZvciBhbnkgZGF0YXR5cGUgdGhhdCBpdCBzdXBwb3J0cyBhdAotCSAq IGFsbC4KLQkgKi8KLQljbXBfcHJvYyA9IGdldF9vcGZhbWlseV9wcm9jKHJlbC0+cmRfb3BmYW1p bHlbc2tleS0+c2tfYXR0bm8gLSAxXSwKLQkJCQkJCQkJIGVsZW10eXBlLAotCQkJCQkJCQkgZWxl bXR5cGUsCi0JCQkJCQkJCSBCVE9SREVSX1BST0MpOwotCWlmICghUmVnUHJvY2VkdXJlSXNWYWxp ZChjbXBfcHJvYykpCi0JCWVsb2coRVJST1IsICJtaXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQo JXUsJXUpIGluIG9wZmFtaWx5ICV1IiwKLQkJCSBCVE9SREVSX1BST0MsIGVsZW10eXBlLCBlbGVt dHlwZSwKLQkJCSByZWwtPnJkX29wZmFtaWx5W3NrZXktPnNrX2F0dG5vIC0gMV0pOwotCiAJLyog U29ydCB0aGUgYXJyYXkgZWxlbWVudHMgKi8KLQlmbWdyX2luZm8oY21wX3Byb2MsICZjeHQuZmxp bmZvKTsKKwljeHQub3JkZXJwcm9jID0gJnNvLT5vcmRlclByb2NzW3NrZXktPnNrX2F0dG5vIC0g MV07CiAJY3h0LmNvbGxhdGlvbiA9IHNrZXktPnNrX2NvbGxhdGlvbjsKIAljeHQucmV2ZXJzZSA9 IHJldmVyc2U7CiAJcXNvcnRfYXJnKGVsZW1zLCBuZWxlbXMsIHNpemVvZihEYXR1bSksCkBAIC01 MDcsNyArNTYyLDcgQEAgX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVudHMoY29uc3Qgdm9pZCAqYSwg Y29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogCUJUU29ydEFycmF5Q29udGV4dCAqY3h0ID0gKEJU U29ydEFycmF5Q29udGV4dCAqKSBhcmc7CiAJaW50MzIJCWNvbXBhcmU7CiAKLQljb21wYXJlID0g RGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29sbCgmY3h0LT5mbGluZm8sCisJY29tcGFyZSA9 IERhdHVtR2V0SW50MzIoRnVuY3Rpb25DYWxsMkNvbGwoY3h0LT5vcmRlcnByb2MsCiAJCQkJCQkJ CQkJCSAgY3h0LT5jb2xsYXRpb24sCiAJCQkJCQkJCQkJCSAgZGEsIGRiKSk7CiAJaWYgKGN4dC0+ cmV2ZXJzZSkKQEAgLTUxNSw2ICs1NzAsMTcxIEBAIF9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRz KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIHZvaWQgKmFyZykKIAlyZXR1cm4gY29tcGFy ZTsKIH0KIAorLyoKKyAqIENvbXBhcmF0b3IgdXNlcyB0byBzZWFyY2ggZm9yIHRoZSBuZXh0IGFy cmF5IGVsZW1lbnQgd2hlbiBhcnJheSBrZXlzIG5lZWQKKyAqIHRvIGJlIGFkdmFuY2VkIHZpYSBv bmUgb3IgbW9yZSBiaW5hcnkgc2VhcmNoZXMKKyAqCisgKiBUaGlzIGNvZGUgaXMgbG9vc2VseSBi YXNlZCBvbiBfYnRfY29tcGFyZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lCisgKiBpbXBvcnRh bnQgZGlmZmVyZW5jZXMuCisgKgorICogSXQgaXMgY29udmVuaWVudCB0byB0aGluayBvZiBjYWxs aW5nIF9idF9jb21wYXJlIGFzIGNvbXBhcmluZyBjYWxsZXIncworICogaW5zZXJ0aW9uIHNjYW5r ZXkgdG8gYW4gaW5kZXggdHVwbGUuICBCdXQgb3VyIGNhbGxlcnMgYXJlIG5vdCBzZWFyY2hpbmcK KyAqIHRocm91Z2ggdGhlIGluZGV4IGF0IGFsbCAtLSB0aGV5J3JlIHNlYXJjaGluZyB0aHJvdWdo IGEgbG9jYWwgYXJyYXkgb2YKKyAqIGRhdHVtcyBhc3NvY2lhdGVkIHdpdGggYSBzY2FuIGtleSAo dXNpbmcgdmFsdWVzIHRoZXkndmUgdGFrZW4gZnJvbSBhbiBpbmRleAorICogdHVwbGUpLiAgVGhp cyBpcyBhIGNvbXBsZXRlIHJldmVyc2FsIG9mIGhvdyB0aGluZ3MgdXN1YWxseSB3b3JrLCB3aGlj aCBjYW4KKyAqIGJlIGNvbmZ1c2luZy4KKyAqCisgKiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24g c2hvdWxkIHRoaW5rIG9mIGl0IGFzIGNvbXBhcmluZyAiZGF0dW0iIChhcyB3ZWxsCisgKiBhcyAi bnVsbCIpIHRvICJhcnJkYXR1bSIuICBUaGlzIGlzIHRoZSBzYW1lIGFwcHJvYWNoIHRoYXQgX2J0 X2NvbXBhcmUgdGFrZXMKKyAqIGluIHRoYXQgYm90aCBmdW5jdGlvbnMgY29tcGFyZSB0aGUgdmFs dWUgdGhhdCB0aGV5J3JlIHNlYXJjaGluZyBmb3IgdG8gb25lCisgKiBwYXJ0aWN1bGFyIGl0ZW0g dXNlZCBhcyBhIGJpbmFyeSBzZWFyY2ggcGl2b3QuICAoQnV0IGl0J3MgdGhlIHdyb25nIHdheQor ICogYXJvdW5kIGlmIHlvdSB0aGluayBvZiBpdCBhcyAidHVwbGUgdmFsdWVzIHZzIHNjYW4ga2V5 IHZhbHVlcyIuICBTbyBkb24ndC4pCisqLworc3RhdGljIGlubGluZSBpbnQzMgorX2J0X2NvbXBh cmVfYXJyYXlfc2tleShTY2FuS2V5IGN1ciwKKwkJCQkJICAgRm1nckluZm8gKm9yZGVycHJvYywK KwkJCQkJICAgRGF0dW0gZGF0dW0sCisJCQkJCSAgIGJvb2wgbnVsbCwKKwkJCQkJICAgRGF0dW0g YXJyZGF0dW0pCit7CisJaW50MzIJCXJlc3VsdCA9IDA7CisKKwlBc3NlcnQoY3VyLT5za19zdHJh dGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpOworCisJaWYgKGN1ci0+c2tfZmxhZ3MgJiBT S19JU05VTEwpCS8qIGFycmF5L3NjYW4ga2V5IGlzIE5VTEwgKi8KKwl7CisJCWlmIChudWxsKQor CQkJcmVzdWx0ID0gMDsJCQkvKiBOVUxMICI9IiBOVUxMICovCisJCWVsc2UgaWYgKGN1ci0+c2tf ZmxhZ3MgJiBTS19CVF9OVUxMU19GSVJTVCkKKwkJCXJlc3VsdCA9IDE7CQkJLyogTlVMTCAiPCIg Tk9UX05VTEwgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gLTE7CQkvKiBOVUxMICI+IiBOT1RfTlVM TCAqLworCX0KKwllbHNlIGlmIChudWxsKQkJCQkvKiBhcnJheS9zY2FuIGtleSBpcyBOT1RfTlVM TCBhbmQgdHVwbGUgaXRlbQorCQkJCQkJCQkgKiBpcyBOVUxMICovCisJeworCQlpZiAoY3VyLT5z a19mbGFncyAmIFNLX0JUX05VTExTX0ZJUlNUKQorCQkJcmVzdWx0ID0gLTE7CQkvKiBOT1RfTlVM TCAiPiIgTlVMTCAqLworCQllbHNlCisJCQlyZXN1bHQgPSAxOwkJCS8qIE5PVF9OVUxMICI8IiBO VUxMICovCisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIExpa2UgX2J0X2NvbXBhcmUsIHdlIG5l ZWQgdG8gYmUgY2FyZWZ1bCBvZiBjcm9zcy10eXBlIGNvbXBhcmlzb25zLAorCQkgKiBzbyB0aGUg bGVmdCB2YWx1ZSBoYXMgdG8gYmUgdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIGFuIGluZGV4CisJ CSAqIHR1cGxlLiAgKEFycmF5IHNjYW4ga2V5cyBjYW5ub3QgYmUgY3Jvc3MtdHlwZSwgYnV0IG90 aGVyIHJlcXVpcmVkCisJCSAqIHNjYW4ga2V5cyB0aGF0IHVzZSBhbiBlcXVhbCBvcGVyYXRvciBj YW4gYmUuKQorCQkgKi8KKwkJcmVzdWx0ID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29s bChvcmRlcnByb2MsIGN1ci0+c2tfY29sbGF0aW9uLAorCQkJCQkJCQkJCQkJIGRhdHVtLCBhcnJk YXR1bSkpOworCisJCS8qCisJCSAqIFVubGlrZSBfYnRfY29tcGFyZSwgd2UgZmxpcCB0aGUgc2ln biB3aGVuIGNvbHVtbiBpcyBhIERFU0MgY29sdW1uCisJCSAqIChhbmQgKm5vdCogd2hlbiBjb2x1 bW4gaXMgQVNDKS4gIFRoaXMgbWF0Y2hlcyB0aGUgYXBwcm9hY2ggdGFrZW4gYnkKKwkJICogX2J0 X2NoZWNrX3Jvd2NvbXBhcmUsIHdoaWNoIHBlcmZvcm1zIHNpbWlsYXIgdGhyZWUtd2F5IGNvbXBh cmlzb25zLgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9ERVNDKQorCQkJSU5W RVJUX0NPTVBBUkVfUkVTVUxUKHJlc3VsdCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwor LyoKKyAqIF9idF9iaW5zcmNoX2FycmF5X3NrZXkoKSAtLSBCaW5hcnkgc2VhcmNoIGZvciBuZXh0 IG1hdGNoaW5nIGFycmF5IGtleQorICoKKyAqIGN1cl9lbGVtX3N0YXJ0IGluZGljYXRlcyBpZiB0 aGUgYmluYXJ5IHNlYXJjaCBzaG91bGQgYmVnaW4gYXQgdGhlIGFycmF5J3MKKyAqIGN1cnJlbnQg ZWxlbWVudCAob3IgaGF2ZSB0aGUgY3VycmVudCBlbGVtZW50IGFzIGFuIHVwcGVyIGJvdW5kIGlm IGl0J3MgYQorICogYmFja3dhcmQgc2NhbikuICBUaGlzIGFsbG93cyBzZWFyY2hlcyBhZ2FpbnN0 IHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5cyB0bworICogcmV1c2UgdGhlIHdvcmsgb2YgZWFybGll ciBzZWFyY2hlcywgYXQgbGVhc3QgaW4gbWFueSBpbXBvcnRhbnQgY2FzZXMuCisgKiBBcnJheSBr ZXlzIGNvdmVyaW5nIGtleSBzcGFjZSB0aGF0IHRoZSBpbmRleCBzY2FuIGFscmVhZHkgcHJvY2Vz c2VkIGNhbm5vdAorICogcG9zc2libHkgY29udGFpbiBhbnkgbWF0Y2hlcy4KKyAqCisgKiBYWFgg VGhlcmUgYXJlIHNldmVyYWwgZmFpcmx5IG9idmlvdXMgb3B0aW1pemF0aW9ucyB0aGF0IHdlIGNv dWxkIGFwcGx5IGhlcmUKKyAqIChlLmcuLCBwcmVjaGVjayBzZWFyY2hlcyBmb3IgZWFybGllciBz dWJzZXRzIG9mIGEgbGFyZ2VyIGFycmF5IHdvdWxkIGhlbHApLgorICogUmV2aXNpdCB0aGlzIGR1 cmluZyB0aGUgbmV4dCByb3VuZCBvZiBwZXJmb3JtYW5jZSB2YWxpZGF0aW9uLgorICoKKyAqIFJl dHVybnMgYW4gaW5kZXggdG8gdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgPj0gY2FsbGVyJ3MgZGF0 dW0gYXJndW1lbnQuCisgKiBBbHNvIHNldHMgKmZpbmFsX3Jlc3VsdCB0byB3aGF0ZXZlciBfYnRf Y29tcGFyZV9hcnJheV9za2V5IHJldHVybmVkIHdoZW4gd2UKKyAqIGRpcmVjdGx5IGNvbXBhcmVk IHRoZSByZXR1cm5lZCBhcnJheSBlbGVtZW50IHRvIHNlYXJjaGVkLWZvciBkYXR1bS4KKyAqLwor c3RhdGljIGludAorX2J0X2JpbnNyY2hfYXJyYXlfc2tleShTY2FuRGlyZWN0aW9uIGRpciwgYm9v bCBjdXJfZWxlbV9zdGFydCwKKwkJCQkJICAgQlRBcnJheUtleUluZm8gKmFycmF5LCBTY2FuS2V5 IGN1ciwKKwkJCQkJICAgRm1nckluZm8gKm9yZGVycHJvYywgRGF0dW0gZGF0dW0sIGJvb2wgbnVs bCwKKwkJCQkJICAgaW50MzIgKmZpbmFsX3Jlc3VsdCkKK3sKKwlpbnQJCQlsb3dfZWxlbSwKKwkJ CQloaWdoX2VsZW0sCisJCQkJZmlyc3RfZWxlbV9kaXIsCisJCQkJcmVzdWx0ID0gMDsKKwlib29s CQlrbm93bmVxdWFsID0gZmFsc2U7CisKKwlBc3NlcnQoY3VyLT5za19mbGFncyAmIFNLX1NFQVJD SEFSUkFZKTsKKwlBc3NlcnQoY3VyLT5za19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIpOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwl7CisJCWZpcnN0X2Vs ZW1fZGlyID0gMDsKKwkJbG93X2VsZW0gPSBhcnJheS0+Y3VyX2VsZW07CisJCWhpZ2hfZWxlbSA9 IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQlpZiAoY3VyX2VsZW1fc3RhcnQpCisJCQlsb3dfZWxl bSA9IDA7CisJfQorCWVsc2UKKwl7CisJCWZpcnN0X2VsZW1fZGlyID0gYXJyYXktPm51bV9lbGVt cyAtIDE7CisJCWxvd19lbGVtID0gMDsKKwkJaGlnaF9lbGVtID0gYXJyYXktPmN1cl9lbGVtOwor CQlpZiAoY3VyX2VsZW1fc3RhcnQpCisJCXsKKwkJCWxvd19lbGVtID0gMDsKKwkJCWhpZ2hfZWxl bSA9IGZpcnN0X2VsZW1fZGlyOworCQl9CisJfQorCisJd2hpbGUgKGhpZ2hfZWxlbSA+IGxvd19l bGVtKQorCXsKKwkJaW50CQkJbWlkX2VsZW0gPSBsb3dfZWxlbSArICgoaGlnaF9lbGVtIC0gbG93 X2VsZW0pIC8gMik7CisJCURhdHVtCQlhcnJkYXR1bSA9IGFycmF5LT5lbGVtX3ZhbHVlc1ttaWRf ZWxlbV07CisKKwkJcmVzdWx0ID0gX2J0X2NvbXBhcmVfYXJyYXlfc2tleShjdXIsIG9yZGVycHJv YywgZGF0dW0sIG51bGwsIGFycmRhdHVtKTsKKworCQlpZiAocmVzdWx0ID09IDApCisJCXsKKwkJ CS8qCisJCQkgKiBFYWNoIGFycmF5IHdhcyBkZWR1cGxpY2F0ZWQgZHVyaW5nIGluaXRpYWwgcHJl cHJvY2Vzc2luZywgc28KKwkJCSAqIHRoZXJlIGVhY2ggZWxlbWVudCBpcyBndWFyYW50ZWVkIHRv IGJlIHVuaXF1ZS4gIFdlIGNhbiBxdWl0IGFzCisJCQkgKiBzb29uIGFzIHdlIHNlZSBhbiBlcXVh bCBhcnJheSwgc2F2aW5nIG91cnNlbHZlcyBhbiBleHRyYQorCQkJICogY29tcGFyaXNvbiBvciB0 d28uLi4KKwkJCSAqLworCQkJbG93X2VsZW0gPSBtaWRfZWxlbTsKKwkJCWtub3duZXF1YWwgPSB0 cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVzdWx0ID4gMCkKKwkJCWxvd19lbGVtID0g bWlkX2VsZW0gKyAxOworCQllbHNlCisJCQloaWdoX2VsZW0gPSBtaWRfZWxlbTsKKwl9CisKKwkv KgorCSAqIC4uLiBidXQgb3VyIGNhbGxlciBhbHNvIGNhcmVzIGFib3V0IHRoZSBwb3NpdGlvbiBv ZiB0aGUgc2VhcmNoZWQtZm9yCisJICogZGF0dW0gcmVsYXRpdmUgdG8gdGhlIGxvd19lbGVtIG1h dGNoIHdlJ2xsIHJldHVybi4gIE1ha2Ugc3VyZSB0aGF0IHdlCisJICogc2V0ICpmaW5hbF9yZXN1 bHQgdG8gdGhlIHJlc3VsdCB0aGF0IGNvbWVzIGZyb20gY29tcGFyaW5nIGxvd19lbGVtJ3MKKwkg KiBrZXkgdmFsdWUgdG8gdGhlIGRhdHVtIHRoYXQgY2FsbGVyIGhhZCB1cyBzZWFyY2ggZm9yLgor CSAqLworCWlmICgha25vd25lcXVhbCkKKwkJcmVzdWx0ID0gX2J0X2NvbXBhcmVfYXJyYXlfc2tl eShjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGwsCisJCQkJCQkJCQkJYXJyYXktPmVsZW1fdmFs dWVzW2xvd19lbGVtXSk7CisKKwkqZmluYWxfcmVzdWx0ID0gcmVzdWx0OworCisJcmV0dXJuIGxv d19lbGVtOworfQorCiAvKgogICogX2J0X3N0YXJ0X2FycmF5X2tleXMoKSAtLSBJbml0aWFsaXpl IGFycmF5IGtleXMgYXQgc3RhcnQgb2YgYSBzY2FuCiAgKgpAQCAtNTM5LDgyICs3NTksMjIgQEAg X2J0X3N0YXJ0X2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRp cikKIAkJCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IDA7CiAJCXNrZXktPnNrX2FyZ3VtZW50ID0g Y3VyQXJyYXlLZXktPmVsZW1fdmFsdWVzW2N1ckFycmF5S2V5LT5jdXJfZWxlbV07CiAJfQotCi0J c28tPmFycmF5c1N0YXJ0ZWQgPSB0cnVlOwotfQotCi0vKgotICogX2J0X2FkdmFuY2VfYXJyYXlf a2V5cygpIC0tIEFkdmFuY2UgdG8gbmV4dCBzZXQgb2YgYXJyYXkgZWxlbWVudHMKLSAqCi0gKiBS ZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYW5vdGhlciBzZXQgb2YgdmFsdWVzIHRvIGNvbnNpZGVy LCBmYWxzZSBpZiBub3QuCi0gKiBPbiB0cnVlIHJlc3VsdCwgdGhlIHNjYW5rZXlzIGFyZSBpbml0 aWFsaXplZCB3aXRoIHRoZSBuZXh0IHNldCBvZiB2YWx1ZXMuCi0gKi8KLWJvb2wKLV9idF9hZHZh bmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKLXsK LQlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7Ci0JYm9vbAkJ Zm91bmQgPSBmYWxzZTsKLQlpbnQJCQlpOwotCi0JLyoKLQkgKiBXZSBtdXN0IGFkdmFuY2UgdGhl IGxhc3QgYXJyYXkga2V5IG1vc3QgcXVpY2tseSwgc2luY2UgaXQgd2lsbAotCSAqIGNvcnJlc3Bv bmQgdG8gdGhlIGxvd2VzdC1vcmRlciBpbmRleCBjb2x1bW4gYW1vbmcgdGhlIGF2YWlsYWJsZQot CSAqIHF1YWxpZmljYXRpb25zLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgY29ycmVjdCBv cmRlcmluZyBvZiBvdXRwdXQKLQkgKiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBhcnJheSBrZXlz LgotCSAqLwotCWZvciAoaSA9IHNvLT5udW1BcnJheUtleXMgLSAxOyBpID49IDA7IGktLSkKLQl7 Ci0JCUJUQXJyYXlLZXlJbmZvICpjdXJBcnJheUtleSA9ICZzby0+YXJyYXlLZXlzW2ldOwotCQlT Y2FuS2V5CQlza2V5ID0gJnNvLT5hcnJheUtleURhdGFbY3VyQXJyYXlLZXktPnNjYW5fa2V5XTsK LQkJaW50CQkJY3VyX2VsZW0gPSBjdXJBcnJheUtleS0+Y3VyX2VsZW07Ci0JCWludAkJCW51bV9l bGVtcyA9IGN1ckFycmF5S2V5LT5udW1fZWxlbXM7Ci0KLQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0Jh Y2t3YXJkKGRpcikpCi0JCXsKLQkJCWlmICgtLWN1cl9lbGVtIDwgMCkKLQkJCXsKLQkJCQljdXJf ZWxlbSA9IG51bV9lbGVtcyAtIDE7Ci0JCQkJZm91bmQgPSBmYWxzZTsJLyogbmVlZCB0byBhZHZh bmNlIG5leHQgYXJyYXkga2V5ICovCi0JCQl9Ci0JCQllbHNlCi0JCQkJZm91bmQgPSB0cnVlOwot CQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCsrY3VyX2VsZW0gPj0gbnVtX2VsZW1zKQotCQkJewot CQkJCWN1cl9lbGVtID0gMDsKLQkJCQlmb3VuZCA9IGZhbHNlOwkvKiBuZWVkIHRvIGFkdmFuY2Ug bmV4dCBhcnJheSBrZXkgKi8KLQkJCX0KLQkJCWVsc2UKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCX0K LQotCQljdXJBcnJheUtleS0+Y3VyX2VsZW0gPSBjdXJfZWxlbTsKLQkJc2tleS0+c2tfYXJndW1l bnQgPSBjdXJBcnJheUtleS0+ZWxlbV92YWx1ZXNbY3VyX2VsZW1dOwotCQlpZiAoZm91bmQpCi0J CQlicmVhazsKLQl9Ci0KLQkvKiBhZHZhbmNlIHBhcmFsbGVsIHNjYW4gKi8KLQlpZiAoc2Nhbi0+ cGFyYWxsZWxfc2NhbiAhPSBOVUxMKQotCQlfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlz KHNjYW4pOwotCi0JLyoKLQkgKiBXaGVuIG5vIG5ldyBhcnJheSBrZXlzIHdlcmUgZm91bmQsIHRo ZSBzY2FuIGlzICJwYXN0IHRoZSBlbmQiIG9mIHRoZQotCSAqIGFycmF5IGtleXMuICBfYnRfc3Rh cnRfYXJyYXlfa2V5cyBjYW4gc3RpbGwgInJlc3RhcnQiIHRoZSBhcnJheSBrZXlzIGlmCi0JICog YSByZXNjYW4gaXMgcmVxdWlyZWQuCi0JICovCi0JaWYgKCFmb3VuZCkKLQkJc28tPmFycmF5c1N0 YXJ0ZWQgPSBmYWxzZTsKLQotCXJldHVybiBmb3VuZDsKIH0KIAogLyoKICAqIF9idF9tYXJrX2Fy cmF5X2tleXMoKSAtLSBIYW5kbGUgYXJyYXkga2V5cyBkdXJpbmcgYnRtYXJrcG9zCiAgKgogICog U2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXJyYXkga2V5cyBhcyB0aGUgIm1hcmsiIHBv c2l0aW9uLgorICoKKyAqIFhYWCBUaGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cyBhcmUgbm90 IGluZGVwZW5kZW50IG9mIHRoZSBjdXJyZW50IHNjYW4KKyAqIHBvc2l0aW9uLCBzbyB3aHkgdHJl YXQgdGhlbSB0aGF0IHdheT8KKyAqCisgKiBXZSBzaG91bGRuJ3QgZXZlbiBib3RoZXIgcmVtZW1i ZXJpbmcgdGhlIGN1cnJlbnQgYXJyYXkga2V5cyB3aGVuIGJ0bWFya3BvcworICogaXMgY2FsbGVk LiAgVGhlIGFycmF5IGtleXMgc2hvdWxkIGJlIGhhbmRsZWQgbGF6aWx5IGluc3RlYWQuICBJZiBh bmQgd2hlbgorICogYnRyZXN0cnBvcyBpcyBjYWxsZWQsIGl0IGNhbiBqdXN0IHNldCBldmVyeSBh cnJheSdzIGN1cl9lbGVtIHRvIHRoZSBmaXJzdAorICogZWxlbWVudCBmb3IgdGhlIGN1cnJlbnQg c2NhbiBkaXJlY3Rpb24uICBXaGVuIF9idF9hZHZhbmNlX2FycmF5X2tleXMgaXMKKyAqIHJlYWNo ZWQgKGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBfYnRfY2hlY2trZXlzIHRoYXQgZm9sbG93cyks IGl0IHdpbGwKKyAqIGF1dG9tYXRpY2FsbHkgc2VhcmNoIGZvciB0aGUgcmVsZXZhbnQgYXJyYXkg a2V5cyB1c2luZyBjYWxsZXIncyB0dXBsZS4KICAqLwogdm9pZAogX2J0X21hcmtfYXJyYXlfa2V5 cyhJbmRleFNjYW5EZXNjIHNjYW4pCkBAIC02NjEsMTMgKzgyMSw4IEBAIF9idF9yZXN0b3JlX2Fy cmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCSAqIElmIHdlIGNoYW5nZWQgYW55IGtleXMs IHdlIG11c3QgcmVkbyBfYnRfcHJlcHJvY2Vzc19rZXlzLiAgVGhhdCBtaWdodAogCSAqIHNvdW5k IGxpa2Ugb3ZlcmtpbGwsIGJ1dCBpbiBjYXNlcyB3aXRoIG11bHRpcGxlIGtleXMgcGVyIGluZGV4 IGNvbHVtbgogCSAqIGl0IHNlZW1zIG5lY2Vzc2FyeSB0byBkbyB0aGUgZnVsbCBzZXQgb2YgcHVz aHVwcy4KLQkgKgotCSAqIEFsc28gZG8gdGhpcyB3aGVuZXZlciB0aGUgc2NhbidzIHNldCBvZiBh cnJheSBrZXlzICJ3cmFwcGVkIGFyb3VuZCIgYXQKLQkgKiB0aGUgZW5kIG9mIHRoZSBsYXN0IHBy aW1pdGl2ZSBpbmRleCBzY2FuLiAgVGhlcmUgd29uJ3QgaGF2ZSBiZWVuIGEgY2FsbAotCSAqIHRv IF9idF9wcmVwcm9jZXNzX2tleXMgZnJvbSBzb21lIG90aGVyIHBsYWNlIGZvbGxvd2luZyB3cmFw IGFyb3VuZCwgc28KLQkgKiB3ZSBkbyBpdCBmb3Igb3Vyc2VsdmVzLgogCSAqLwotCWlmIChjaGFu Z2VkIHx8ICFzby0+YXJyYXlzU3RhcnRlZCkKKwlpZiAoY2hhbmdlZCkKIAl7CiAJCV9idF9wcmVw cm9jZXNzX2tleXMoc2Nhbik7CiAJCS8qIFRoZSBtYXJrIHNob3VsZCBoYXZlIGJlZW4gc2V0IG9u IGEgY29uc2lzdGVudCBzZXQgb2Yga2V5cy4uLiAqLwpAQCAtNjc1LDYgKzgzMCw3ODUgQEAgX2J0 X3Jlc3RvcmVfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJfQogfQogCisvKgorICog Um91dGluZSB0byBkZXRlcm1pbmUgaWYgYSBjb250aW51ZXNjYW49ZmFsc2UgdHVwbGUgKHNldCB0 aGF0IHdheSBieSBhbgorICogaW5pdGlhbCBjYWxsIHRvIF9idF9jaGVja19jb21wYXJlKSBtaWdo dCBuZWVkIHRvIGFkdmFuY2UgdGhlIHNjYW4ncyBhcnJheQorICoga2V5cy4KKyAqCisgKiBSZXR1 cm5zIHRydWUgd2hlbiBjYWxsZXIgcGFzc2VzIGEgdHVwbGUgdGhhdCBpcyA8IHRoZSBjdXJyZW50 IHNldCBvZiBhcnJheQorICoga2V5cyBmb3IgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLWVxdWFs IGNvbHVtbi9zY2FuIGtleSAob3IgPiBmb3IgYmFja3dhcmRzCisgKiBzY2FucykuICBUaGlzIG1l YW5zIHRoYXQgaXQgY2Fubm90IHBvc3NpYmx5IGJlIHRpbWUgdG8gYWR2YW5jZSB0aGUgYXJyYXkK KyAqIGtleXMganVzdCB5ZXQuICBfYnRfY2hlY2trZXlzIGNhbGxlciBzaG91bGQgc3VwcHJlc3Mg aXRzIF9idF9jaGVja19jb21wYXJlCisgKiBjYWxsLCBhbmQgcmV0dXJuIC0tIHRoZSB0dXBsZSBp cyB0cmVhdGVkIGFzIG5vdCBzYXRpc2Z5IG91ciBpbmRleHF1YWxzLgorICoKKyAqIFJldHVybnMg ZmFsc2Ugd2hlbiBjYWxsZXIncyB0dXBsZSBpcyA+PSB0aGUgY3VycmVudCBhcnJheSBrZXlzIChv ciA8PSwgaW4KKyAqIHRoZSBjYXNlIG9mIGJhY2t3YXJkcyBzY2FucykuICBUaGlzIG1lYW5zIHRo YXQgaXQgbWlnaHQgYmUgdGltZSBmb3Igb3VyCisgKiBjYWxsZXIgdG8gYWR2YW5jZSB0aGUgYXJy YXkga2V5cyB0byB0aGUgbmV4dCBzZXQuCisgKgorICogTm90ZTogYWR2YW5jaW5nIHRoZSBhcnJh eSBrZXlzIG1heSBiZSByZXF1aXJlZCB3aGVuIGV2ZXJ5IGF0dHJpYnV0ZSB2YWx1ZQorICogZnJv bSBjYWxsZXIncyB0dXBsZSBpcyBlcXVhbCB0byBjb3JyZXNwb25kaW5nIHNjYW4ga2V5L2FycmF5 IGRhdHVtcy4gIFNlZQorICogY29tbWVudHMgYXQgdGhlIHN0YXJ0IG9mIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMgZm9yIG1vcmUuCisgKi8KK3N0YXRpYyBib29sCitfYnRfdHVwbGVfYmVmb3JlX2Fy cmF5X3NrZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJ CQkJCQkJIEluZGV4VHVwbGUgdHVwbGUpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9w YXF1ZSkgc2Nhbi0+b3BhcXVlOworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247 CisJU2NhbkRpcmVjdGlvbiBkaXIgPSBwc3RhdGUtPmRpcjsKKwlUdXBsZURlc2MJaXR1cGRlc2Mg PSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJdHVwbGVfYmVmb3JlX2FycmF5X2tleXMg PSBmYWxzZTsKKwlTY2FuS2V5CQljdXI7CisJaW50CQkJbnR1cGF0dHMgPSBCVHJlZVR1cGxlR2V0 TkF0dHModHVwbGUsIHJlbCksCisJCQkJaWtleTsKKworCUFzc2VydChzby0+cXVhbF9vayk7CisJ QXNzZXJ0KHNvLT5udW1BcnJheUtleXMgPiAwKTsKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+ IDApOworCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlE YXRhLCBpa2V5ID0gMDsgaWtleSA8IHNvLT5udW1iZXJPZktleXM7IGN1cisrLCBpa2V5KyspCisJ eworCQlpbnQJCQlhdHRudW0gPSBjdXItPnNrX2F0dG5vOworCQlGbWdySW5mbyAgICpvcmRlcnBy b2M7CisJCURhdHVtCQlkYXR1bTsKKwkJYm9vbAkJbnVsbCwKKwkJCQkJc2tyZXF1aXJlZDsKKwkJ aW50MzIJCXJlc3VsdDsKKworCQkvKgorCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBlcXVhbGl0eSBz dHJhdGVneSBzY2FuIGtleXMuICBXZSBsZWF2ZSBoYW5kbGluZworCQkgKiBvZiBpbmVxdWFsaXRp ZXMgdXAgdG8gX2J0X2NoZWNrX2NvbXBhcmUuCisJCSAqLworCQlpZiAoY3VyLT5za19zdHJhdGVn eSAhPSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBE ZXRlcm1pbmUgaWYgdGhpcyBzY2FuIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBzY2Fu CisJCSAqIGRpcmVjdGlvbgorCQkgKi8KKwkJc2tyZXF1aXJlZCA9ICgoU2NhbkRpcmVjdGlvbklz Rm9yd2FyZChkaXIpICYmCisJCQkJCSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRRldEKSkg fHwKKwkJCQkJICAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJgorCQkJCQkgICAoY3Vy LT5za19mbGFncyAmIFNLX0JUX1JFUUJLV0QpKSk7CisKKwkJLyoKKwkJICogVW5saWtlIF9idF9h ZHZhbmNlX2FycmF5X2tleXMsIHdlIG5ldmVyIGRlYWwgd2l0aCBhbnkgbm9uLXJlcXVpcmVkCisJ CSAqIGFycmF5IGtleXMuICBDYXNlcyB3aGVyZSBza3JlcXVpcmVkdHJpZ2dlciBpcyBzZXQgdG8g ZmFsc2UgYnkKKwkJICogX2J0X2NoZWNrX2NvbXBhcmUgc2hvdWxkIG5ldmVyIGNhbGwgaGVyZS4g IFdlIGFyZSBvbmx5IGNhbGxlZCBhZnRlcgorCQkgKiBfYnRfY2hlY2tfY29tcGFyZSBwcm92aXNp b25hbGx5IGluZGljYXRlZCB0aGF0IHRoZSBzY2FuIHNob3VsZCBiZQorCQkgKiB0ZXJtaW5hdGVk IGR1ZSB0byBhIF9yZXF1aXJlZF8gc2NhbiBrZXkgbm90IGJlaW5nIHNhdGlzZmllZC4KKwkJICoK KwkJICogV2UgZXhwZWN0IF9idF9jaGVja19jb21wYXJlIHRvIG5vdGljZSBhbmQgcmVwb3J0IHJl cXVpcmVkIHNjYW4ga2V5cworCQkgKiBiZWZvcmUgbm9uLXJlcXVpcmVkIG9uZXMuICBfYnRfYWR2 YW5jZV9hcnJheV9rZXlzIG1pZ2h0IHN0aWxsIGhhdmUKKwkJICogdG8gYWR2YW5jZSBub24tcmVx dWlyZWQgYXJyYXkga2V5cyBpbiBwYXNzaW5nIGZvciBhIHR1cGxlIHRoYXQgd2UKKwkJICogd2Vy ZSBjYWxsZWQgZm9yLCBidXQgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBkb2Vzbid0IHJlbHkgb24g dXMgdG8KKwkJICogZ2l2ZSBpdCBhZHZhbmNlZCBub3RpY2Ugb2YgdGhhdC4KKwkJICovCisJCWlm ICghc2tyZXF1aXJlZCkKKwkJCWJyZWFrOworCisJCWlmIChhdHRudW0gPiBudHVwYXR0cykKKwkJ eworCQkJLyoKKwkJCSAqIFdoZW4gd2UgcmVhY2ggYSBoaWdoIGtleSdzIHRydW5jYXRlZCBhdHRy aWJ1dGUsIGFzc3VtZSB0aGF0IHRoZQorCQkJICogdHVwbGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMg Pj0gdGhlIHNjYW4ncyBzZWFyY2gtdHlwZSBzY2FuIGtleXMKKwkJCSAqLworCQkJYnJlYWs7CisJ CX0KKworCQlkYXR1bSA9IGluZGV4X2dldGF0dHIodHVwbGUsIGF0dG51bSwgaXR1cGRlc2MsICZu dWxsKTsKKworCQlvcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3NbYXR0bnVtIC0gMV07CisJCXJl c3VsdCA9IF9idF9jb21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2MsCisJCQkJCQkJCQkJ ZGF0dW0sIG51bGwsCisJCQkJCQkJCQkJY3VyLT5za19hcmd1bWVudCk7CisKKwkJaWYgKHJlc3Vs dCAhPSAwKQorCQl7CisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJCXR1 cGxlX2JlZm9yZV9hcnJheV9rZXlzID0gcmVzdWx0IDwgMDsKKwkJCWVsc2UKKwkJCQl0dXBsZV9i ZWZvcmVfYXJyYXlfa2V5cyA9IHJlc3VsdCA+IDA7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJ cmV0dXJuIHR1cGxlX2JlZm9yZV9hcnJheV9rZXlzOworfQorCisvKgorICogX2J0X2FycmF5X2tl eXNfcmVtYWluKCkgLS0gU3RhcnQgYW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2Nhbj8KKyAqCisg KiBSZXR1cm5zIHRydWUgaWYgX2J0X2NoZWNra2V5cyBkZXRlcm1pbmVkIHRoYXQgYW5vdGhlciBw cmltaXRpdmUgaW5kZXggc2NhbgorICogbXVzdCB0YWtlIHBsYWNlIGJ5IGNhbGxpbmcgX2J0X2Zp cnN0LiAgT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UsIGluZGljYXRpbmcKKyAqIHRoYXQgY2FsbGVy J3MgdG9wLWxldmVsIHNjYW4gaXMgbm93IHBhc3QgdGhlIHBvaW50IHdoZXJlIGZ1cnRoZXIgbWF0 Y2hpbmcKKyAqIGluZGV4IHR1cGxlcyBjYW4gYmUgZm91bmQgKGZvciB0aGUgY3VycmVudCBzY2Fu IGRpcmVjdGlvbikuCisgKgorICogT25seSBjYWxsIGhlcmUgZHVyaW5nIHNjYW5zIHdpdGggb25l IG9yIG1vcmUgZXF1YWxpdHkgdHlwZSBhcnJheSBzY2FuIGtleXMuCisgKiBBbGwgb3RoZXIgc2Nh bnMgc2hvdWxkIGp1c3QgY2FsbCBfYnRfZmlyc3Qgb25jZSwgbm8gbWF0dGVyIHdoYXQuCisgKgor ICogVG9wLWxldmVsIGluZGV4IHNjYW5zIGV4ZWN1dGVkIHZpYSBtdWx0aXBsZSBwcmltaXRpdmUg aW5kZXggc2NhbnMgbXVzdCBub3QKKyAqIGZhaWwgdG8gb3V0cHV0IGluZGV4IHR1cGxlcyBpbiB0 aGUgdXN1YWwgb3JkZXIgZm9yIHRoZSBpbmRleCAtLSBqdXN0IGxpa2UKKyAqIGFueSBvdGhlciBp bmRleCBzY2FuIHdvdWxkLiAgVGhlIHN0YXRlIG1hY2hpbmUgdGhhdCBtYW5hZ2VzIHRoZSBzY2Fu J3MKKyAqIGFycmF5IGtleXMgbXVzdCBvbmx5IHN0YXJ0IHByaW1pdGl2ZSBpbmRleCBzY2FucyB3 aGVuIHRoZXkgY292ZXIga2V5IHNwYWNlCisgKiBzdHJpY3RseSBncmVhdGVyIHRoYW4gdGhlIGtl eSBzcGFjZSBmb3IgdHVwbGVzIHRoYXQgdGhlIHNjYW4gaGFzIGFscmVhZHkKKyAqIHJldHVybmVk IChvciBzdHJpY3RseSBsZXNzIGluIHRoZSBiYWNrd2FyZHMgc2NhbiBjYXNlKS4gIE90aGVyd2lz ZSB0aGUgc2NhbgorICogY291bGQgb3V0cHV0IHRoZSBzYW1lIGluZGV4IHR1cGxlcyBtb3JlIHRo YW4gb25jZSwgb3IgaW4gdGhlIHdyb25nIG9yZGVyLgorICoKKyAqIFRoaXMgaXMgbWFuYWdlZCBi eSBsaW1pdGluZyB0aGUgY2FzZXMgdGhhdCBjYW4gdHJpZ2dlciBuZXcgcHJpbWl0aXZlIGluZGV4 CisgKiBzY2FucyB0byB0aG9zZSBpbnZvbHZpbmcgcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzIGFu ZC9vciBvdGhlciByZXF1aXJlZAorICogc2NhbiBrZXlzIHRoYXQgdXNlIHRoZSBlcXVhbGl0eSBz dHJhdGVneS4gIEluIHBhcnRpY3VsYXIsIHRoZSBzdGF0ZSBtYWNoaW5lCisgKiBtdXN0IG5vdCBh bGxvdyBoaWdoIG9yZGVyIHJlcXVpcmVkIHNjYW4ga2V5cyB1c2luZyBhbiBpbmVxdWFsaXR5IHN0 cmF0ZWd5CisgKiAod2hpY2ggYXJlIG9ubHkgcmVxdWlyZWQgaW4gb25lIHNjYW4gZGlyZWN0aW9u KSB0byBkaXJlY3RseSB0cmlnZ2VyIGEgbmV3CisgKiBwcmltaXRpdmUgaW5kZXggc2NhbiB0aGF0 IGFkdmFuY2VzIGxvdyBvcmRlciBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzLgorICogRm9y IGV4YW1wbGUsIGEgcXVlcnkgc3VjaCBhcyAiU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9N IHRlbmsxIFdIRVJFCisgKiB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDAp IE9SREVSIEJZIHRob3VzYW5kIiB3aG9zZSBleGVjdXRpb24KKyAqIGludm9sdmVzIGEgc2NhbiBv ZiBhbiBpbmRleCBvbiAiKHRob3VzYW5kLCB0ZW50aG91cykiIG11c3QgcGVyZm9ybSBubyBtb3Jl CisgKiB0aGFuIGEgc2luZ2xlIHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgT3RoZXJ3aXNlIHdlIHJp c2sgb3V0cHV0dGluZyB0dXBsZXMgaW4KKyAqIHRoZSB3cm9uZyBvcmRlci4gIEFycmF5IGtleSB2 YWx1ZXMgZm9yIHRoZSBub24tcmVxdWlyZWQgc2NhbiBrZXkgb24gdGhlCisgKiAidGVudGhvdXMi IGNvbHVtbiBtdXN0IG5vdCBkaWN0YXRlIHRvcC1sZXZlbCBzY2FuIG9yZGVyLiAgUHJpbWl0aXZl IGluZGV4CisgKiBzY2FucyBtdXN0bid0IHNjYW4gdHVwbGVzIGFscmVhZHkgc2Nhbm5lZCBieSBz b21lIGVhcmxpZXIgcHJpbWl0aXZlIHNjYW4uCisgKgorICogSW4gZmFjdCwgbmJ0cmVlIG1ha2Vz IGEgc3Ryb25nZXIgZ3VhcmFudGVlIHRoYW4gaXMgc3RyaWN0bHkgbmVjZXNzYXJ5IGhlcmU6Cisg KiBpdCBndWFyYW50ZWVzIHRoYXQgdGhlIHRvcC1sZXZlbCBzY2FuIHdvbid0IHJlcGVhdCBhbnkg bGVhZiBwYWdlIHJlYWRzLgorICogKEFjdHVhbGx5LCB0aGF0IGNhbiBzdGlsbCBoYXBwZW4gd2hl biB0aGUgc2NhbiBpcyByZXBvc2l0aW9uZWQsIG9yIHRoZSBzY2FuCisgKiBkaXJlY3Rpb24gY2hh bmdlcyAtLSBidXQgdGhhdCdzIGp1c3QgYXMgdHJ1ZSB3aXRoIG90aGVyIHR5cGVzIG9mIHNjYW5z LikKKyAqLworYm9vbAorX2J0X2FycmF5X2tleXNfcmVtYWluKEluZGV4U2NhbkRlc2Mgc2Nhbiwg U2NhbkRpcmVjdGlvbiBkaXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkg c2Nhbi0+b3BhcXVlOworCisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJLyoKKwkgKiBB cnJheSBrZXlzIGFyZSBhZHZhbmNlZCB3aXRoaW4gX2J0X2NoZWNra2V5cyB3aGVuIHRoZSBzY2Fu IHJlYWNoZXMgdGhlCisJICogbGVhZiBsZXZlbCAobW9yZSBwcmVjaXNlbHksIHRoZXkncmUgYWR2 YW5jZWQgd2hlbiB0aGUgc2NhbiByZWFjaGVzIHRoZQorCSAqIGVuZCBvZiBlYWNoIGRpc3RpbmN0 IHNldCBvZiBhcnJheSBlbGVtZW50cykuICBUaGlzIHByb2Nlc3MgYXZvaWRzCisJICogcmVwZWF0 IGFjY2VzcyB0byBsZWFmIHBhZ2VzIChhY3Jvc3MgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNj YW5zKSBieQorCSAqIG9wcG9ydHVuaXN0aWNhbGx5IGFkdmFuY2luZyB0aGUgc2NhbidzIGFycmF5 IGtleXMgd2hlbiBpdCBhbGxvd3MgdGhlCisJICogcHJpbWl0aXZlIGluZGV4IHNjYW4gdG8gZmlu ZCBuZWFyYnkgbWF0Y2hpbmcgdHVwbGVzIChvciB0byBlbGltaW5hdGUKKwkgKiBhcnJheSBrZXlz IHdpdGggbm8gbWF0Y2hpbmcgdHVwbGVzIGZyb20gZnVydGhlciBjb25zaWRlcmF0aW9uKS4KKwkg KgorCSAqIF9idF9jaGVja2tleXMgc2V0cyBhIHNpbXBsZSBmbGFnIHZhcmlhYmxlIHRoYXQgd2Ug Y2hlY2sgaGVyZS4gIFRoaXMKKwkgKiB0ZWxscyB1cyBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYW5v dGhlciBwcmltaXRpdmUgaW5kZXggc2NhbiBmb3IgdGhlCisJICogbm93LWN1cnJlbnQgYXJyYXkg a2V5cyBvciBub3QuICBXZSdsbCB1bnNldCB0aGUgZmxhZyBvbmNlIGFnYWluIHRvCisJICogYWNr bm93bGVkZ2UgaGF2aW5nIHN0YXJ0ZWQgYSBuZXcgcHJpbWl0aXZlIHNjYW4gKG9yIHdlJ2xsIHNl ZSB0aGF0IGl0CisJICogaXNuJ3Qgc2V0IGFuZCBlbmQgdGhlIHRvcC1sZXZlbCBzY2FuIHJpZ2h0 IGF3YXkpLgorCSAqCisJICogV2UgY2Fubm90IHJlbHkgb24gX2J0X2ZpcnN0IGFsd2F5cyByZWFj aGluZyBfYnRfY2hlY2trZXlzIGhlcmUuICBUaGVyZQorCSAqIGFyZSB2YXJpb3VzIHNjZW5hcmlv cyB3aGVyZSB0aGF0IHdvbid0IGhhcHBlbi4gIEZvciBleGFtcGxlLCBpZiB0aGUKKwkgKiBpbmRl eCBpcyBjb21wbGV0ZWx5IGVtcHR5LCB0aGVuIF9idF9maXJzdCB3b24ndCBnZXQgYXMgZmFyIGFz IGNhbGxpbmcKKwkgKiBfYnRfcmVhZHBhZ2UvX2J0X2NoZWNra2V5cy4KKwkgKgorCSAqIFdlIGFs c28gZG9uJ3QgZXhwZWN0IF9idF9jaGVja2tleXMgdG8gYmUgcmVhY2hlZCB3aGVuIHNlYXJjaGlu ZyBmb3IgYQorCSAqIG5vbi1leGlzdGVudCB2YWx1ZSB0aGF0IGhhcHBlbnMgdG8gYmUgaGlnaGVy IHRoYW4gYW55IGV4aXN0aW5nIHZhbHVlIGluCisJICogdGhlIGluZGV4LiAgTm8gX2J0X2NoZWNr a2V5cyBhcmUgZXhwZWN0ZWQgd2hlbiBfYnRfcmVhZHBhZ2UgcmVhZHMgdGhlCisJICogcmlnaHRt b3N0IHBhZ2UgZHVyaW5nIHN1Y2ggYSBzY2FuIC0tIGV2ZW4gYSBfYnRfY2hlY2trZXlzIGNhbGwg YWdhaW5zdAorCSAqIHRoZSBoaWdoIGtleSB3b24ndCBoYXBwZW4uICBUaGVyZSBpcyBhbiBhbmFs b2dvdXMgaXNzdWUgZm9yIGJhY2t3YXJkcworCSAqIHNjYW5zIHRoYXQgc2VhcmNoIGZvciBhIHZh bHVlIGxvd2VyIHRoYW4gYWxsIGV4aXN0aW5nIGluZGV4IHR1cGxlcy4KKwkgKgorCSAqIFdlIGRv bid0IGFjdHVhbGx5IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlc2UgY2FzZXMgLS0g d2UgZG9uJ3QKKwkgKiBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgaW5zdHJ1Y3RlZCB0byBfbm90XyBw ZXJmb3JtIGFub3RoZXIgcHJpbWl0aXZlCisJICogaW5kZXggc2Nhbi4gIFRoaXMgaXMgY29ycmVj dCBmb3IgYWxsIG9mIHRoZSBjYXNlcyB3ZSd2ZSBsaXN0ZWQgc28gZmFyLAorCSAqIHdoaWNoIGFs bCBpbnZvbHZlIHByaW1pdGl2ZSBpbmRleCBzY2FucyB0aGF0IGFjY2VzcyBwYWdlcyAibmVhciB0 aGUKKwkgKiBib3VuZGFyaWVzIG9mIHRoZSBrZXkgc3BhY2UiICh0aGUgbGVmdG1vc3QgcGFnZSwg dGhlIHJpZ2h0bW9zdCBwYWdlLCBvcgorCSAqIGFuIGltYWdpbmFyeSBlbXB0eSBsZWFmIHJvb3Qg cGFnZSkuICBJZiBfYnRfY2hlY2trZXlzIGNhbm5vdCBiZSByZWFjaGVkCisJICogYnkgYSBwcmlt aXRpdmUgaW5kZXggc2NhbiBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBpdCBmb2xsb3dzIHRo YXQgaXQKKwkgKiBhbHNvIHdvbid0IGJlIHJlYWNoZWQgZm9yIGFueSBsYXRlciBzZXQgb2YgYXJy YXkga2V5cy4KKwkgKgorCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IHRoZSBjYXNlIHdoZXJl IF9idF9maXJzdCdzIF9idF9wcmVwcm9jZXNzX2tleXMKKwkgKiBjYWxsIGRldGVybWluZWQgdGhh dCB0aGUgc2NhbidzIGlucHV0IHNjYW4ga2V5cyBjYW4gbmV2ZXIgYmUgc2F0aXNmaWVkLgorCSAq IFRoYXQgbWlnaHQgYmUgdHJ1ZSBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBidXQgbm90IHRo ZSBuZXh0IHNldC4KKwkgKi8KKwlpZiAoIXNvLT5xdWFsX29rKQorCXsKKwkJLyoKKwkJICogUXVh bCBjYW4gbmV2ZXIgYmUgc2F0aXNmaWVkLiAgQWR2YW5jZSBvdXIgYXJyYXkga2V5cyBpbmNyZW1l bnRhbGx5LgorCQkgKi8KKwkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCQlpZiAoX2J0X2Fk dmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkKKwkJCXJldHVybiB0cnVlOwor CX0KKworCS8qIFRpbWUgZm9yIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4/ICovCisJaWYg KHNvLT5uZWVkUHJpbVNjYW4pCisJeworCQkvKiBCZWdpbiBwcmltaXRpdmUgaW5kZXggc2NhbiAq LworCQlzby0+bmVlZFByaW1TY2FuID0gZmFsc2U7CisKKwkJaWYgKHNjYW4tPnBhcmFsbGVsX3Nj YW4gIT0gTlVMTCkKKwkJCV9idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKHNjYW4pOwor CisJCXJldHVybiB0cnVlOworCX0KKworCS8qCisJICogTm8gbW9yZSBwcmltaXRpdmUgaW5kZXgg c2NhbnMuICBKdXN0IHRlcm1pbmF0ZSB0aGUgdG9wLWxldmVsIHNjYW4uCisJICovCisJX2J0X2Fk dmFuY2VfYXJyYXlfa2V5c190b19lbmQoc2NhbiwgZGlyKTsKKworCWlmIChzY2FuLT5wYXJhbGxl bF9zY2FuICE9IE5VTEwpCisJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOworCisJcmV0dXJuIGZh bHNlOworfQorCisvKgorICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cygpIC0tIEFkdmFuY2UgYXJy YXkgZWxlbWVudHMgdXNpbmcgYSB0dXBsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcmVx dWlyZWQgZXF1YWxpdHktdHlwZSBzY2FuIGtleXMgKGluIHBhcnRpY3VsYXIsIHRob3NlCisgKiB0 aGF0IGFyZSBhcnJheSBrZXlzKSBub3cgaGF2ZSBleGFjdCBtYXRjaGluZyB2YWx1ZXMgdG8gdGhv c2UgZnJvbSB0dXBsZS4KKyAqIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgdHVwbGUgaXNuJ3QgYW4g ZXhhY3QgbWF0Y2ggaW4gdGhpcyBzZW5zZS4KKyAqCisgKiBTZXRzIHBzdGF0ZS5jb250aW51ZXNj YW4gZm9yIGNhbGxlciB3aGVuIHdlIHJldHVybiBmYWxzZS4gIFdoZW4gd2UgcmV0dXJuCisgKiB0 cnVlIGl0J3MgdXAgdG8gY2FsbGVyIHRvIGNhbGwgX2J0X2NoZWNrX2NvbXBhcmUgdG8gcmVjaGVj ayB0aGUgdHVwbGUuICBJdAorICogaXMgb2theSB0byBsZXQgdGhlIHNlY29uZCBjYWxsIHNldCBw c3RhdGUuY29udGludWVzY2FuPWZhbHNlIHdpdGhvdXQKKyAqIGZ1cnRoZXIgaW50ZXJ2ZW50aW9u LCBzaW5jZSB3ZSBrbm93IHRoYXQgaXQgY2FuIG9ubHkgYmUgZm9yIGEgc2NhbiBrZXkgdGhhdAor ICogaXMgcmVxdWlyZWQgaW4gb25lIGRpcmVjdGlvbi4KKyAqCisgKiBXaGVuIGNhbGxlZCB3aXRo IHNrcmVxdWlyZWR0cmlnZ2VyLCB3ZSBkb24ndCBleHBlY3QgdG8gaGF2ZSB0byBhZHZhbmNlIGFu eQorICogbm9uLXJlcXVpcmVkIHNjYW4ga2V5cy4gIFdlJ2xsIGFsd2F5cyBzZXQgcHN0YXRlLmNv bnRpbnVlc2NhbiBiZWNhdXNlIGEKKyAqIG5vbi1yZXF1aXJlZCBzY2FuIGtleSBjYW4gbmV2ZXIg dGVybWluYXRlIHRoZSBzY2FuLgorICoKKyAqIFJlcXVpcmVkIGFycmF5IGtleXMgYXJlIGFsd2F5 cyBhZHZhbmNlZCB0byB0aGUgaGlnaGVzdCBlbGVtZW50ID49IHRoZQorICogY29ycmVzcG9uZGlu ZyB0dXBsZSBhdHRyaWJ1dGUgdmFsdWVzIGZvciBpdHMgbW9zdCBzaWduaWZpY2FudCBub24tZXF1 YWwKKyAqIGNvbHVtbiAob3IgdGhlIG5leHQgbG93ZXN0IHNldCA8PSB0aGUgdHVwbGUgdmFsdWUg ZHVyaW5nIGJhY2t3YXJkcyBzY2FucykuCisgKiBJZiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBh cnJheSBrZXlzIGZvciB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbiwgd2UKKyAqIGVuZCB0aGUg dG9wLWxldmVsIGluZGV4IHNjYW4uCisgKgorICogX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5 cyBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnJlbnQKKyAqIHBsYWNl IGluIHRoZSBzY2FuIGlzID49IHRoZSBjdXJyZW50IGFycmF5IGtleXMgKG9yIDw9IGR1cmluZyBi YWNrd2FyZAorICogc2NhbnMpLiAgVGhpcyBtdXN0IGJlIGVzdGFibGlzaGVkIGZpcnN0LCBiZWZv cmUgY2FsbGluZyBoZXJlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBtYXkgc29tZXRpbWVzIG5lZWQg dG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyBpbiBzcGl0ZSBvZiB0aGUKKyAqIGV4aXN0aW5nIGFy cmF5IGtleXMgYWxyZWFkeSBiZWluZyBhbiBleGFjdCBtYXRjaCBmb3IgZXZlcnkgY29ycmVzcG9u ZGluZworICogdmFsdWUgZnJvbSBjYWxsZXIncyB0dXBsZS4gIFdlIGZhbGwgYmFjayBvbiAiaW5j cmVtZW50YWxseSIgYWR2YW5jaW5nIHRoZQorICogYXJyYXkga2V5cyBpbiB0aGVzZSBjYXNlcywg d2hpY2ggaW52b2x2ZSBpbmVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5cy4KKyAqIEZvciBleGFt cGxlLCB3aXRoIGEgY29tcG9zaXRlIGluZGV4IG9uIChhLCBiKSBhbmQgYSBxdWFsICJXSEVSRSBh IElOICgzLDUpCisgKiBBTkQgYiA8IDQyIiwgd2UnbGwgYmUgY2FsbGVkIGZvciBib3RoICJhIiBh cnJ5IGtleXMgKGtleXMgMyBhbmQgNSkgd2hlbiB0aGUKKyAqIHNjYW4gcmVhY2hlcyB0dXBsZXMg d2hlcmUgImIgPj0gNDIiLiAgRXZlbiB0aG91Z2ggImEiIGFycmF5IGtleXMgY29udGludWUKKyAq IHRvIGhhdmUgZXhhY3QgbWF0Y2hlcyBmb3IgdHVwbGVzICJiID49IDQyIiAoZm9yIGJvdGggYXJy YXkga2V5IGdyb3VwaW5ncyksCisgKiB3ZSB3aWxsIHN0aWxsIGFkdmFuY2UgdGhlIGFycmF5IGZv ciAiYSIgdmlhIG91ciBmYWxsYmFjayBvbiBpbmNyZW1lbnRhbAorICogYWR2YW5jZW1lbnQgZWFj aCB0aW1lIHdlJ3JlIGNhbGxlZC4gIFRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNhbGxlZCAod2hlbiB0 aGUKKyAqIHNjYW4gcmVhY2hlcyBhIHR1cGxlID49ICIoMywgNDIpIiksIHdlIGFkdmFuY2UgdGhl IGFycmF5IGtleSAoZnJvbSAzIHRvIDUpLgorICogVGhpcyBnaXZlcyBvdXIgY2FsbGVyIHRoZSBv cHRpb24gb2Ygc3RhcnRpbmcgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4KKyAqIHRoYXQgcXVp Y2tseSBsb2NhdGVzIHRoZSBzdGFydCBvZiB0dXBsZXMgPiAiKDUsIC1pbmYpIi4gIFRoZSBzZWNv bmQgdGltZQorICogd2UncmUgY2FsbGVkICh3aGVuIHRoZSBzY2FuIHJlYWNoZXMgYSB0dXBsZSA+ PSAiKDUsIDQyKSIpLCB3ZSBpbmNyZW1lbnRhbGx5CisgKiBhZHZhbmNlIHRoZSBrZXlzIGEgc2Vj b25kIHRpbWUuICBUaGlzIHNlY29uZCBjYWxsIGVuZHMgdGhlIHRvcC1sZXZlbCBzY2FuLgorICoK KyAqIE5vdGUgYWxzbyB0aGF0IHdlIGRlYWwgd2l0aCBhbGwgcmVxdWlyZWQgZXF1YWxpdHktdHlw ZSBzY2FuIGtleXMgaGVyZTsgaXQncworICogbm90IGxpbWl0ZWQgdG8gYXJyYXkgc2NhbiBrZXlz LiAgV2UgbmVlZCB0byBoYW5kbGUgbm9uLWFycmF5IGVxdWFsaXR5IGNhc2VzCisgKiBoZXJlIGJl Y2F1c2UgdGhleSdyZSBlcXVhbGl0eSBjb25zdHJhaW50cyBmb3IgdGhlIHNjYW4sIGluIHRoZSBz YW1lIHdheQorICogdGhhdCBhcnJheSBzY2FuIGtleXMgYXJlLiAgV2UgbXVzdCBub3Qgc3VwcHJl c3MgY2FzZXMgd2hlcmUgYSBjYWxsIHRvCisgKiBfYnRfY2hlY2tfY29tcGFyZSBzZXRzIGNvbnRp bnVlc2Nhbj1mYWxzZSBmb3IgYSByZXF1aXJlZCBzY2FuIGtleSB0aGF0IHVzZXMKKyAqIHRoZSBl cXVhbGl0eSBzdHJhdGVneSAob25seSBpbmVxdWFsaXR5LXR5cGUgc2NhbiBrZXlzIGdldCB0aGF0 IHRyZWF0bWVudCkuCisgKiBXZSBkb24ndCB3YW50IHRvIHN1cHByZXNzIHRoZSBzY2FuJ3MgdGVy bWluYXRpb24gd2hlbiBpdCdzIGluYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBib29sCitfYnRf YWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpw c3RhdGUsCisJCQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgc2tyZXF1aXJlZHRyaWdnZXIp Cit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCVJl bGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247CisJU2NhbkRpcmVjdGlvbiBkaXIgPSBw c3RhdGUtPmRpcjsKKwlUdXBsZURlc2MJaXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7 CisJU2NhbktleQkJY3VyOworCWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwLAorCQkJCW50 dXBhdHRzID0gQlRyZWVUdXBsZUdldE5BdHRzKHR1cGxlLCByZWwpOworCWJvb2wJCWFycmF5c19h ZHZhbmNlZCA9IGZhbHNlLAorCQkJCWFycmF5c19kb25lID0gZmFsc2UsCisJCQkJYWxsX3NrcmVx dWlyZWRfYXR0c193cmFwcGVkID0gc2tyZXF1aXJlZHRyaWdnZXIsCisJCQkJYWxsX2F0dHNfZXF1 YWwgPSB0cnVlOworCisJQXNzZXJ0KHNvLT5udW1iZXJPZktleXMgPiAwKTsKKwlBc3NlcnQoc28t Pm51bUFycmF5S2V5cyA+IDApOworCUFzc2VydChzby0+cXVhbF9vayk7CisKKwkvKgorCSAqIFRy eSB0byBhZHZhbmNlIGFycmF5IGtleXMgdmlhIGEgc2VyaWVzIG9mIGJpbmFyeSBzZWFyY2hlcy4K KwkgKgorCSAqIExvb3AgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY3VycmVudCBzY2Fua2V5cyAoc28t PmtleURhdGEsIHdoaWNoIHdlcmUKKwkgKiBvdXRwdXQgYnkgX2J0X3ByZXByb2Nlc3Nfa2V5cyBl YXJsaWVyKSBhbmQgdGhlbiBzZXRzIGlucHV0IHNjYW4ga2V5cworCSAqIChzby0+YXJyYXlLZXlE YXRhIHNjYW4ga2V5cykgdG8gbmV3IGFycmF5IHZhbHVlcy4gIFRoaXMgc2V0cyB0aGluZ3MgdXAK KwkgKiBmb3Igb3VyIGNhbGwgdG8gX2J0X3ByZXByb2Nlc3Nfa2V5cywgd2hpY2ggaXMgd2hlcmUg dGhlIGN1cnJlbnQgc2NhbgorCSAqIGtleXMgYWN0dWFsbHkgY2hhbmdlLgorCSAqCisJICogV2Ug bmVlZCB0byBkbyB0aGluZ3MgdGhpcyB3YXkgYmVjYXVzZSBvbmx5IGN1cnJlbnQvcHJlcHJvY2Vz c2VkIHNjYW4KKwkgKiBrZXlzIHdpbGwgYmUgbWFya2VkIGFzIHJlcXVpcmVkLiAgSXQncyBhbHNv IHBvc3NpYmxlIHRoYXQgdGhlIHByZXZpb3VzCisJICogY2FsbCB0byBfYnRfcHJlcHJvY2Vzc19r ZXlzIGVsaW1pbmF0ZWQgb25lIG9yIG1vcmUgaW5wdXQgc2NhbiBrZXlzCisJICogKHBvc3NpYmx5 IGFycmF5IHR5cGUgc2NhbiBrZXlzKSB0aGF0IHdlcmUgZGVlbWVkIHRvIGJlIHJlZHVuZGFudC4K KwkgKi8KKwlmb3IgKGN1ciA9IHNvLT5rZXlEYXRhLCBpa2V5ID0gMDsgaWtleSA8IHNvLT5udW1i ZXJPZktleXM7IGN1cisrLCBpa2V5KyspCisJeworCQlCVEFycmF5S2V5SW5mbyAqYXJyYXkgPSBO VUxMOworCQlTY2FuS2V5CQlza2V5YXJyYXkgPSBOVUxMOworCQlGbWdySW5mbyAgICpvcmRlcnBy b2M7CisJCWludAkJCWF0dG51bSA9IGN1ci0+c2tfYXR0bm8sCisJCQkJCWZpcnN0X2VsZW1fZGly LAorCQkJCQlmaW5hbF9lbGVtX2RpciwKKwkJCQkJc2V0X2VsZW07CisJCURhdHVtCQlkYXR1bTsK KwkJYm9vbAkJc2tyZXF1aXJlZCwKKwkJCQkJbnVsbDsKKwkJaW50MzIJCXJlc3VsdDsKKworCQkv KgorCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBlcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMuICBX ZSBsZWF2ZSBoYW5kbGluZworCQkgKiBvZiBpbmVxdWFsaXRpZXMgdXAgdG8gX2J0X2NoZWNrX2Nv bXBhcmUuCisJCSAqLworCQlpZiAoY3VyLT5za19zdHJhdGVneSAhPSBCVEVxdWFsU3RyYXRlZ3lO dW1iZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBzY2Fu IGtleSBpcyByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBzY2FuCisJCSAqIGRpcmVjdGlvbgorCQkg Ki8KKwkJc2tyZXF1aXJlZCA9ICgoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpICYmCisJCQkJ CSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRRldEKSkgfHwKKwkJCQkJICAoU2NhbkRpcmVj dGlvbklzQmFja3dhcmQoZGlyKSAmJgorCQkJCQkgICAoY3VyLT5za19mbGFncyAmIFNLX0JUX1JF UUJLV0QpKSk7CisKKwkJLyoKKwkJICogT3B0aW1pemF0aW9uOiB3ZSBkb24ndCBoYXZlIHRvIGFk dmFuY2UgcmVtYWluaW5nIG5vbi1yZXF1aXJlZCBhcnJheQorCQkgKiBrZXlzIHdoZW4gd2UgYWxy ZWFkeSBrbm93IHRoYXQgdHVwbGUgd29uJ3QgYmUgcmV0dXJuZWQgYnkgdGhlIHNjYW4uCisJCSAq CisJCSAqIERlbGliZXJhdGVseSBjaGVjayB0aGlzIGJvdGggaGVyZSBhbmQgYWZ0ZXIgdGhlIGJp bmFyeSBzZWFyY2guCisJCSAqLworCQlpZiAoIXNrcmVxdWlyZWQgJiYgIWFsbF9hdHRzX2VxdWFs KQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBjaGVjayByZXF1aXJlZCBub24t YXJyYXkgc2NhbiBrZXlzICh0aGF0IHVzZSB0aGUgZXF1YWwKKwkJICogc3RyYXRlZ3kpLCBhcyB3 ZWxsIGFzIHJlcXVpcmVkIGFuZCBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzCisJCSAqIChh bHNvIGxpbWl0ZWQgdG8gdGhvc2UgdGhhdCB1c2UgdGhlIGVxdWFsIHN0cmF0ZWd5LCBzaW5jZSBh cnJheQorCQkgKiBpbmVxdWFsaXRpZXMgZGVnZW5lcmF0ZSBpbnRvIGEgc2ltcGxlIGNvbXBhcmlz b24pLgorCQkgKgorCQkgKiBQZXJmb3JtIGluaXRpYWwgc2V0IHVwIGZvciB0aGlzIHNjYW4ga2V5 LiAgSWYgaXQgaXMgYmFja2VkIGJ5IGFuCisJCSAqIGFycmF5IHRoZW4gd2UgbmVlZCB0byBzZXQg dmFyaWFibGVzIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24KKwkJICogaW4gdGhlIGFy cmF5LgorCQkgKi8KKwkJb3JkZXJwcm9jID0gJnNvLT5vcmRlclByb2NzW2F0dG51bSAtIDFdOwor CQlmaXJzdF9lbGVtX2RpciA9IGZpbmFsX2VsZW1fZGlyID0gMDsJLyoga2VlcCBjb21waWxlciBx dWlldCAqLworCQlpZiAoY3VyLT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKQorCQl7CisJCQkv KiBTZXQgdXAgYXJyYXkgY29tcGFyaXNvbiBmdW5jdGlvbiAqLworCQkJQXNzZXJ0KGFycmF5aWR4 IDwgc28tPm51bUFycmF5S2V5cyk7CisJCQlhcnJheSA9ICZzby0+YXJyYXlLZXlzW2FycmF5aWR4 KytdOworCQkJc2tleWFycmF5ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsK KworCQkJLyoKKwkJCSAqIEl0J3MgcG9zc2libGUgdGhhdCBfYnRfcHJlcHJvY2Vzc19rZXlzIGRl dGVybWluZWQgdGhhdCBhbgorCQkJICogaW5kaXZpZHVhbCBhcnJheSBzY2FuIGtleSB3YXNuJ3Qg cmVxdWlyZWQgaW4gc28tPmtleURhdGEgZm9yCisJCQkgKiB0aGUgb25nb2luZyBwcmltaXRpdmUg aW5kZXggc2NhbiBkdWUgdG8gaXQgYmVpbmcgcmVkdW5kYW50IG9yCisJCQkgKiBjb250cmFkaWN0 b3J5ICh0aGUgY3VycmVudCBhcnJheSB2YWx1ZSBtaWdodCBiZSByZWR1bmRhbnQgbmV4dAorCQkJ ICogdG8gc29tZSBvdGhlciBzY2FuIGtleSBvbiB0aGUgc2FtZSBhdHRyaWJ1dGUpLiAgRGVhbCB3 aXRoIHRoYXQuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseShza2V5YXJyYXktPnNrX2F0dG5vICE9 IGF0dG51bSkpCisJCQl7CisJCQkJYm9vbAkJZm91bmQgUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZ ID0gZmFsc2U7CisKKwkJCQlmb3IgKDsgYXJyYXlpZHggPCBzby0+bnVtQXJyYXlLZXlzOyBhcnJh eWlkeCsrKQorCQkJCXsKKwkJCQkJYXJyYXkgPSAmc28tPmFycmF5S2V5c1thcnJheWlkeF07CisJ CQkJCXNrZXlhcnJheSA9ICZzby0+YXJyYXlLZXlEYXRhW2FycmF5LT5zY2FuX2tleV07CisJCQkJ CWlmIChza2V5YXJyYXktPnNrX2F0dG5vID09IGF0dG51bSkKKwkJCQkJeworCQkJCQkJZm91bmQg PSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlBc3NlcnQoZm91bmQp OworCQkJfQorCisJCQkvKiBQcm9hY3RpdmVseSBzZXQgdXAgc3RhdGUgdXNlZCB0byBoYW5kbGUg YXJyYXkgd3JhcGFyb3VuZCAqLworCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkK KwkJCXsKKwkJCQlmaXJzdF9lbGVtX2RpciA9IDA7CisJCQkJZmluYWxfZWxlbV9kaXIgPSBhcnJh eS0+bnVtX2VsZW1zIC0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmaXJzdF9lbGVtX2Rp ciA9IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQkJCWZpbmFsX2VsZW1fZGlyID0gMDsKKwkJCX0K KwkJfQorCQllbHNlIGlmIChhdHRudW0gPiBudHVwYXR0cykKKwkJeworCQkJLyoKKwkJCSAqIE5v dGhpbmcgbmVlZHMgdG8gYmUgZG9uZSB3aGVuIHdlIGhhdmUgYSB0cnVuY2F0ZWQgYXR0cmlidXRl CisJCQkgKiAocG9zc2libGUgd2hlbiBjYWxsZXIncyB0dXBsZSBpcyBhIHBhZ2UgaGlnaCBrZXkp IGFuZCBhCisJCQkgKiBub24tYXJyYXkgc2NhbiBrZXkKKwkJCSAqLworCQkJQXNzZXJ0KFNjYW5E aXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAq IEhlcmUgd2UgcGVyZm9ybSBzdGVwcyBmb3IgYW55IHJlcXVpcmVkIHNjYW4ga2V5cyBhZnRlciB0 aGUgZmlyc3QKKwkJICogbm9uLWVxdWFsIHJlcXVpcmVkIHNjYW4ga2V5LiAgVGhlIGZpcnN0IHNj YW4ga2V5IG11c3QgaGF2ZSBiZWVuIHNldAorCQkgKiB0byBhIHZhbHVlID4gdGhlIHZhbHVlIGZy b20gdGhlIHR1cGxlIGJhY2sgd2hlbiB3ZSBkZWFsdCB3aXRoIGl0CisJCSAqIChvciwgZm9yIGEg YmFja3dhcmRzIHNjYW4sIHRvIGEgdmFsdWUgPCB0aGUgdmFsdWUgZnJvbSB0aGUgdHVwbGUpLgor CQkgKiBUaGF0IG5lZWRzIHRvICJjYXNjYWRlIiB0byBsb3dlci1vcmRlciBhcnJheSBzY2FuIGtl eXMuICBUaGV5IG11c3QKKwkJICogYmUgc2V0IHRvIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IGZv ciB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbi4KKwkJICoKKwkJICogV2UncmUgc3RpbGwgc2V0 dGluZyB0aGUga2V5cyB0byB2YWx1ZXMgPj0gdGhlIHR1cGxlIGhlcmUgLS0gaXQganVzdAorCQkg KiBuZWVkcyB0byB3b3JrIGZvciB0aGUgdHVwbGUgYXMgYSB3aG9sZS4gIEZvciBleGFtcGxlLCB3 aGVuIGEgdHVwbGUKKwkJICogIihhLCBiKSA9ICg0MiwgNSkiIGFkdmFuY2VzIHRoZSBhcnJheSBr ZXlzIG9uICJhIiBmcm9tIDQwIHRvIDQ1LCB3ZQorCQkgKiBtdXN0IGFsc28gc2V0ICJiIiB0byB3 aGF0ZXZlciB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCBmb3IgImIiIGlzLgorCQkgKiBJdCB3b3Vs ZCBiZSB3cm9uZyB0byBhbGxvdyAiYiIgdG8gYmUgc2V0IHRvIGEgdmFsdWUgZnJvbSB0aGUgdHVw bGUsCisJCSAqIHNpbmNlIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBmcm9tIGEgZGlmZmVyZW50IHBh cnQgb2YgdGhlIGtleSBzcGFjZS4KKwkJICoKKwkJICogQWxzbyBkZWZlbnNpdmVseSBkbyB0aGlz IHdpdGggdHJ1bmNhdGVkIGF0dHJpYnV0ZXMgd2hlbiBjYWxsZXIncworCQkgKiB0dXBsZSBpcyBh IHBhZ2UgaGlnaCBrZXkuCisJCSAqLworCQlpZiAoYXJyYXkgJiYgKChhcnJheXNfYWR2YW5jZWQg JiYgIWFsbF9hdHRzX2VxdWFsKSB8fAorCQkJCQkgIGF0dG51bSA+IG50dXBhdHRzKSkKKwkJewor CQkJLyogU2hvdWxkbid0IHJlYWNoIHRoaXMgZmFyIGZvciBhIG5vbi1yZXF1aXJlZCBzY2FuIGtl eSAqLworCQkJQXNzZXJ0KHNrcmVxdWlyZWQgJiYgc2tyZXF1aXJlZHRyaWdnZXIgJiYgYXR0bnVt ID4gMSk7CisKKwkJCS8qCisJCQkgKiBXZSBzZXQgdGhlIGFycmF5IHRvIHRoZSBmaXJzdCBlbGVt ZW50IChpZiBuZWVkZWQpIGhlcmUsIGFuZCB3ZQorCQkJICogZG9uJ3QgdW5zZXQgYWxsX3JlcXVp cmVkX2F0dHNfd3JhcHBlZC4gIFRoaXMgYXJyYXkgdGhlcmVmb3JlCisJCQkgKiBjb3VudHMgYXMg YSB3cmFwcGVkIGFycmF5IHdoZW4gd2UgZ28gb24gdG8gZGV0ZXJtaW5lIGlmIGFsbCBvZgorCQkJ ICogdGhlIHJlcXVpcmVkIGFycmF5cyBoYXZlIHdyYXBwZWQgKGFmdGVyIHRoaXMgbG9vcCkuCisJ CQkgKi8KKwkJCWlmIChhcnJheS0+Y3VyX2VsZW0gIT0gZmlyc3RfZWxlbV9kaXIpCisJCQl7CisJ CQkJYXJyYXktPmN1cl9lbGVtID0gZmlyc3RfZWxlbV9kaXI7CisJCQkJc2tleWFycmF5LT5za19h cmd1bWVudCA9IGFycmF5LT5lbGVtX3ZhbHVlc1tmaXJzdF9lbGVtX2Rpcl07CisJCQkJYXJyYXlz X2FkdmFuY2VkID0gdHJ1ZTsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkg KiBHb2luZyB0byBjb21wYXJlIHNjYW4ga2V5IHRvIGNvcnJlc3BvbmRpbmcgdHVwbGUgYXR0cmli dXRlIHZhbHVlCisJCSAqLworCQlkYXR1bSA9IGluZGV4X2dldGF0dHIodHVwbGUsIGF0dG51bSwg aXR1cGRlc2MsICZudWxsKTsKKworCQlpZiAoIWFycmF5KQorCQl7CisJCQlpZiAoIXNrcmVxdWly ZWQgfHwgIWFsbF9hdHRzX2VxdWFsKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogVGhp cyBpcyBhIHJlcXVpcmVkIG5vbi1hcnJheSBzY2FuIGtleSB0aGF0IHVzZXMgdGhlIGVxdWFsCisJ CQkgKiBzdHJhdGVneS4gIFNlZSBoZWFkZXIgY29tbWVudHMgZm9yIGFuIGV4cGxhbmF0aW9uIG9m IHdoeSB3ZQorCQkJICogbmVlZCB0byBkbyB0aGlzLgorCQkJICovCisJCQlyZXN1bHQgPSBfYnRf Y29tcGFyZV9hcnJheV9za2V5KGN1ciwgb3JkZXJwcm9jLCBkYXR1bSwgbnVsbCwKKwkJCQkJCQkJ CQkJY3VyLT5za19hcmd1bWVudCk7CisKKwkJCWlmIChyZXN1bHQgIT0gMCkKKwkJCXsKKwkJCQkv KgorCQkJCSAqIHR1cGxlIGF0dHJpYnV0ZSB2YWx1ZSBpcyA+IHNjYW4ga2V5IHZhbHVlIChvciA8 IHNjYW4ga2V5CisJCQkJICogdmFsdWUgaW4gdGhlIGJhY2t3YXJkIHNjYW4gY2FzZSkuCisJCQkJ ICovCisJCQkJYWxsX2F0dHNfZXF1YWwgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBCaW5hcnkgc2VhcmNoIGZvciBhbiBhcnJheSBr ZXkgPj0gdGhlIHR1cGxlIHZhbHVlLCB3aGljaCB3ZSdsbCB0aGVuCisJCSAqIHNldCBhcyBvdXIg Y3VycmVudCBhcnJheSBrZXkgKG9yIDw9IHRoZSB0dXBsZSB2YWx1ZSBpZiB0aGlzIGlzIGEKKwkJ ICogYmFja3dhcmQgc2NhbikuCisJCSAqCisJCSAqIFRoZSBiaW5hcnkgc2VhcmNoIGV4Y2x1ZGVz IGFycmF5IGtleXMgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZAorCQkgKiBmcm9tIGNvbnNp ZGVyYXRpb24sIGV4Y2VwdCB3aXRoIGEgbm9uLXJlcXVpcmVkIHNjYW4ga2V5J3MgYXJyYXkuCisJ CSAqIFRoaXMgaXMgbm90IGp1c3QgYW4gb3B0aW1pemF0aW9uIC0tIGl0J3MgaW1wb3J0YW50IGZv ciBjb3JyZWN0bmVzcy4KKwkJICogSXQgaXMgY3J1Y2lhbCB0aGF0IHJlcXVpcmVkIGFycmF5IHNj YW4ga2V5cyBvbmx5IGhhdmUgdGhlaXIgYXJyYXkKKwkJICoga2V5cyBhZHZhbmNlZCBpbiB0aGUg Y3VycmVudCBzY2FuIGRpcmVjdGlvbi4gIFdlIG5lZWQgdG8gYWR2YW5jZQorCQkgKiByZXF1aXJl ZCBhcnJheSBrZXlzIGluIGxvY2sgc3RlcCB3aXRoIHRoZSBpbmRleCBzY2FuLgorCQkgKgorCQkg KiBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBhcnJheXNfYWR2YW5jZWQgbXVzdCBvbmx5IGJlIHNl dCB3aGVuIHRoZQorCQkgKiBhcnJheSBpcyBhZHZhbmNlZCB0byBhIGtleSA+PSB0aGUgZXhpc3Rp bmcga2V5LCBvciA8PSBmb3IgYQorCQkgKiBiYWNrd2FyZHMgc2Nhbi4gIChUaG91Z2ggc2VlIG5v dGVzIGFib3V0IHdyYXBhcm91bmQgYmVsb3cuKQorCQkgKi8KKwkJc2V0X2VsZW0gPSBfYnRfYmlu c3JjaF9hcnJheV9za2V5KGRpciwgKCFza3JlcXVpcmVkIHx8IGFycmF5c19hZHZhbmNlZCksCisJ CQkJCQkJCQkJICBhcnJheSwgY3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLAorCQkJCQkJCQkJ CSAgJnJlc3VsdCk7CisKKwkJLyoKKwkJICogTWFpbnRhaW4gdGhlIHN0YXRlIHRoYXQgdHJhY2tz IHdoZXRoZXIgYWxsIGF0dHJpYnV0ZSBmcm9tIHRoZSB0dXBsZQorCQkgKiBhcmUgZXF1YWwgdG8g dGhlIGFycmF5IGtleXMgdGhhdCB3ZSd2ZSBzZXQgYXMgY3VycmVudCAob3IgZXhpc3RpbmcKKwkJ ICogYXJyYXkga2V5cyBzZXQgZHVyaW5nIGVhcmxpZXIgY2FsbHMgaGVyZSkuCisJCSAqLworCQlp ZiAocmVzdWx0ICE9IDApCisJCQlhbGxfYXR0c19lcXVhbCA9IGZhbHNlOworCisJCS8qCisJCSAq IE9wdGltaXphdGlvbjogd2UgZG9uJ3QgaGF2ZSB0byBhZHZhbmNlIHJlbWFpbmluZyBub24tcmVx dWlyZWQgYXJyYXkKKwkJICoga2V5cyB3aGVuIHdlIGFscmVhZHkga25vdyB0aGF0IHR1cGxlIHdv bid0IGJlIHJldHVybmVkIGJ5IHRoZSBzY2FuLgorCQkgKiBRdWl0IGJlZm9yZSBzZXR0aW5nIHRo ZSBhcnJheSBrZXlzIHRvIGF2b2lkIF9idF9wcmVwcm9jZXNzX2tleXMuCisJCSAqCisJCSAqIERl bGliZXJhdGVseSBjaGVjayB0aGlzIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgYmluYXJ5IHNl YXJjaC4KKwkJICovCisJCWlmICghc2tyZXF1aXJlZCAmJiAhYWxsX2F0dHNfZXF1YWwpCisJCQli cmVhazsKKworCQkvKgorCQkgKiBJZiB0aGUgYmluYXJ5IHNlYXJjaCBpbmRpY2F0ZXMgdGhhdCB0 aGUga2V5IHNwYWNlIGZvciB0aGlzIHR1cGxlCisJCSAqIGF0dHJpYnV0ZSB2YWx1ZSBpcyA+IHRo ZSBrZXkgdmFsdWUgZnJvbSB0aGUgZmluYWwgZWxlbWVudCBpbiB0aGUKKwkJICogYXJyYXkgKGZp bmFsIGZvciB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbiksIHdlIGhhbmRsZSBpdCBieQorCQkg KiB3cmFwcGluZyBhcm91bmQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LgorCQkg KgorCQkgKiBXcmFwcGluZyBhcm91bmQgc2ltcGxpZmllcyBhZHZhbmNlbWVudCB3aXRoIGEgbXVs dGktY29sdW1uIGluZGV4IGJ5CisJCSAqIGFsbG93aW5nIHVzIHRvIHRyZWF0IHdyYXBwaW5nIGEg Y29sdW1uIGFzIGFkdmFuY2luZyB0aGUgY29sdW1uLiAgV2UKKwkJICogcHJlc2VydmUgdGhlIGlu dmFyaWFudCB0aGF0IGEgcmVxdWlyZWQgc2NhbiBrZXkncyBhcnJheSBtYXkgb25seSBiZQorCQkg KiByYXRjaGV0ZWQgZm9yd2FyZCAoYmFja3dhcmRzIHdoZW4gdGhlIHNjYW4gZGlyZWN0aW9uIGlz IGJhY2t3YXJkcyksCisJCSAqIHdoaWxlIHN0aWxsIGFsd2F5cyBiZWluZyBhYmxlIHRvICJhZHZh bmNlIiB0aGUgYXJyYXkgYXQgdGhpcyBwb2ludC4KKwkJICovCisJCWlmIChzZXRfZWxlbSA9PSBm aW5hbF9lbGVtX2RpciAmJgorCQkJKChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgJiYgcmVz dWx0ID4gMCkgfHwKKwkJCSAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJiByZXN1bHQg PCAwKSkpCisJCXsKKwkJCS8qIFBlcmZvcm0gd3JhcGFyb3VuZCAqLworCQkJc2V0X2VsZW0gPSBm aXJzdF9lbGVtX2RpcjsKKwkJfQorCQllbHNlIGlmIChza3JlcXVpcmVkKQorCQl7CisJCQkvKiBX b24ndCBjYWxsIF9idF9hZHZhbmNlX2FycmF5X2tleXNfdG9fZW5kIGxhdGVyICovCisJCQlhbGxf c2tyZXF1aXJlZF9hdHRzX3dyYXBwZWQgPSBmYWxzZTsKKwkJfQorCisJCUFzc2VydChzZXRfZWxl bSA+PSAwICYmIHNldF9lbGVtIDwgYXJyYXktPm51bV9lbGVtcyk7CisJCWlmIChhcnJheS0+Y3Vy X2VsZW0gIT0gc2V0X2VsZW0pCisJCXsKKwkJCWFycmF5LT5jdXJfZWxlbSA9IHNldF9lbGVtOwor CQkJc2tleWFycmF5LT5za19hcmd1bWVudCA9IGFycmF5LT5lbGVtX3ZhbHVlc1tzZXRfZWxlbV07 CisJCQlhcnJheXNfYWR2YW5jZWQgPSB0cnVlOworCisJCQkvKgorCQkJICogV2Ugc2hvdWxkbid0 IGhhdmUgdG8gYWR2YW5jZSBhIHJlcXVpcmVkIGFycmF5IHdoZW4gY2FsbGVkIGR1ZQorCQkJICog dG8gX2J0X2NoZWNrX2NvbXBhcmUgZGV0ZXJtaW5pbmcgdGhhdCBhIG5vbi1yZXF1aXJlZCBhcnJh eQorCQkJICogbmVlZHMgdG8gYmUgYWR2YW5jZWQuICBXZSBleHBlY3QgX2J0X2NoZWNrX2NvbXBh cmUgdG8gbm90aWNlCisJCQkgKiBhbmQgcmVwb3J0IHJlcXVpcmVkIHNjYW4ga2V5cyBiZWZvcmUg bm9uLXJlcXVpcmVkIG9uZXMuCisJCQkgKi8KKwkJCUFzc2VydChza3JlcXVpcmVkdHJpZ2dlciB8 fCAhc2tyZXF1aXJlZCk7CisJCX0KKwl9CisKKwlpZiAoIXNrcmVxdWlyZWR0cmlnZ2VyKQorCXsK KwkJLyoKKwkJICogRmFpbGluZyB0byBzYXRpc2Z5IGEgbm9uLXJlcXVpcmVkIGFycmF5IHNjYW4g a2V5IHNob3VsZG4ndCBldmVyCisJCSAqIHJlc3VsdCBpbiB0ZXJtaW5hdGluZyB0aGUgKHByaW1p dGl2ZSkgaW5kZXggc2NhbgorCQkgKi8KKwl9CisJZWxzZSBpZiAoYWxsX3NrcmVxdWlyZWRfYXR0 c193cmFwcGVkKQorCXsKKwkJLyoKKwkJICogVGhlIGJpbmFyeSBzZWFyY2hlcyBmb3IgZWFjaCB0 dXBsZSdzIGF0dHJpYnV0ZSB2YWx1ZSBpbiB0aGUgc2NhbgorCQkgKiBrZXkncyBjb3JyZXNwb25k aW5nIFNLX1NFQVJDSEFSUkFZIGFycmF5IGFsbCBmb3VuZCB0aGF0IHRoZSB0dXBsZSdzCisJCSAq IHZhbHVlIGFyZSAicGFzdCB0aGUgZW5kIiBvZiB0aGUga2V5IHNwYWNlIGNvdmVyZWQgYnkgZWFj aCBhcnJheQorCQkgKi8KKwkJX2J0X2FkdmFuY2VfYXJyYXlfa2V5c190b19lbmQoc2NhbiwgZGly KTsKKwkJYXJyYXlzX2RvbmUgPSB0cnVlOworCQlhbGxfYXR0c19lcXVhbCA9IGZhbHNlOyAvKiBh dCBsZWFzdCBub3Qgbm93ICovCisJfQorCWVsc2UgaWYgKCFhcnJheXNfYWR2YW5jZWQpCisJewor CQkvKgorCQkgKiBXZSBtdXN0IGFsd2F5cyBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGJ5IGF0IGxl YXN0IG9uZSBpbmNyZW1lbnQKKwkJICogKGV4Y2VwdCB3aGVuIGNhbGxlZCB0byBhZHZhbmNlIGEg bm9uLXJlcXVpcmVkIHNjYW4ga2V5J3MgYXJyYXkpLgorCQkgKgorCQkgKiBXZSBuZWVkIHRoaXMg ZmFsbGJhY2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBleGlzdGluZyBhcnJheSBrZXlzIGFuZAorCQkg KiBleGlzdGluZyByZXF1aXJlZCBlcXVhbC1zdHJhdGVneSBzY2FuIGtleXMgd2VyZSBmdWxseSBl cXVhbCB0byB0aGUKKwkJICogdHVwbGUuICBfYnRfY2hlY2tfY29tcGFyZSBtYXkgaGF2ZSBzZXQg Y29udGludWVzY2FuPWZhbHNlIGR1ZSB0byBhbgorCQkgKiBpbmVxdWFsaXR5IHRlcm1pbmF0aW5n IHRoZSBzY2FuLCB3aGljaCB3ZSBkb24ndCBkZWFsIHdpdGggZGlyZWN0bHkuCisJCSAqIChTZWUg ZnVuY3Rpb24ncyBoZWFkZXIgY29tbWVudHMgZm9yIGFuIGV4YW1wbGUuKQorCQkgKi8KKwkJaWYg KF9idF9hZHZhbmNlX2FycmF5X2tleXNfaW5jcmVtZW50KHNjYW4sIGRpcikpCisJCQlhcnJheXNf YWR2YW5jZWQgPSB0cnVlOworCQllbHNlCisJCQlhcnJheXNfZG9uZSA9IHRydWU7CisJCWFsbF9h dHRzX2VxdWFsID0gZmFsc2U7IC8qIGF0IGxlYXN0IG5vdCBub3cgKi8KKwl9CisKKwkvKgorCSAq IE1pZ2h0IG1ha2Ugc2Vuc2UgdG8gcmVjaGVjayB0aGUgaGlnaCBrZXkgbGF0ZXIgb24gaW4gY2Fz ZXMgd2hlcmUgd2UKKwkgKiBqdXN0IGFkdmFuY2VkIHRoZSBrZXlzICh1bmxlc3Mgd2Ugd2VyZSBq dXN0IGNhbGxlZCB0byBhZHZhbmNlIHRoZQorCSAqIHNjYW4ncyBub24tcmVxdWlyZWQgYXJyYXkg a2V5cykKKwkgKi8KKwlpZiAoYXJyYXlzX2FkdmFuY2VkICYmIHNrcmVxdWlyZWR0cmlnZ2VyKQor CQlwc3RhdGUtPmhpZ2hrZXljaGVja2VkID0gZmFsc2U7CisKKwkvKgorCSAqIElmIHdlIGNoYW5n ZWQgdGhlIGFycmF5IGtleXMgd2l0aG91dCBleGhhdXN0aW5nIGFsbCBhcnJheSBrZXlzIHRoZW4g d2UKKwkgKiBuZWVkIHRvIHByZXByb2Nlc3Mgb3VyIHNlYXJjaC10eXBlIHNjYW4ga2V5cyBvbmNl IG1vcmUKKwkgKi8KKwlBc3NlcnQoc2tyZXF1aXJlZHRyaWdnZXIgfHwgIWFycmF5c19kb25lKTsK KwlpZiAoYXJyYXlzX2FkdmFuY2VkICYmICFhcnJheXNfZG9uZSkKKwl7CisJCS8qCisJCSAqIFhY WCBUaGluayBhYm91dCBidWZmZXItbG9jay1oZWxkIGhhemFyZHMgaGVyZSBzb21lIG1vcmUuCisJ CSAqCisJCSAqIEluIGFsbW9zdCBhbGwgaW50ZXJlc3RpbmcgY2FzZXMgd2Ugb25seSByZWFsbHkg bmVlZCB0byBjb3B5IG92ZXIKKwkJICogdGhlIGFycmF5IHZhbHVlcyAoZnJvbSAic28tPmFycmF5 S2V5RGF0YSIgdG8gInNvLT5rZXlEYXRhIikuICBCdXQKKwkJICogdGhlcmUgYXJlIGF0IGxlYXN0 IHNvbWUgY2FzZXMgd2hlcmUgcGVyZm9ybWluZyB0aGUgZnVsbCBzZXQgb2YgcHVzaAorCQkgKiB1 cHMgaGVyZSAob3IgY2xvc2UgdG8gaXQpIG1pZ2h0IGFkZCB2YWx1ZSBvdmVyIGp1c3QgZG9pbmcg aXQgZm9yCisJCSAqIHRoZSBtYWluIF9idF9maXJzdCBjYWxsLgorCQkgKi8KKwkJX2J0X3ByZXBy b2Nlc3Nfa2V5cyhzY2FuKTsKKwl9CisKKwkvKiBBcmUgd2Ugbm93IGRvbmUgd2l0aCB0aGUgdG9w LWxldmVsIHNjYW4gKGJhcnJpbmcgYSBidHJlc2Nhbik/ICovCisJQXNzZXJ0KCFzby0+bmVlZFBy aW1TY2FuKTsKKwlpZiAoIXNvLT5xdWFsX29rKQorCXsKKwkJLyoKKwkJICogSW5jcmVtZW50IGFy cmF5IGtleXMgYW5kIHN0YXJ0IGEgbmV3IHByaW1pdGl2ZSBpbmRleCBzY2FuIGlmCisJCSAqIF9i dF9wcmVwcm9jZXNzX2tleXMoKSBkaXNjb3ZlcmVkIHRoYXQgdGhlIHNjYW4ga2V5cyBjYW4gbmV2 ZXIgYmUKKwkJICogc2F0aXNmaWVkIChlZywgeCA9PSAyIEFORCB4IGluICgxLCAyLCAzKSBmb3Ig YXJyYXkga2V5cyAxIGFuZCAyKS4KKwkJICoKKwkJICogTm90ZTogVGhlcmUgaXMgc2ltaWxhciBo YW5kbGluZyBpbiBfYnRfYXJyYXlfa2V5c19yZW1haW4sIHdoaWNoCisJCSAqIG11c3QgYWR2YW5j ZSB0aGUgYXJyYXkga2V5cyB3aXRob3V0IGNvbnN1bHRpbmcgdXMgaW4gdGhpcyBvbmUgY2FzZS4K KwkJICovCisJCUFzc2VydChza3JlcXVpcmVkdHJpZ2dlcik7CisKKwkJcHN0YXRlLT5jb250aW51 ZXNjYW4gPSBmYWxzZTsKKwkJcHN0YXRlLT5oaWdoa2V5Y2hlY2tlZCA9IHRydWU7CisJCWFsbF9h dHRzX2VxdWFsID0gZmFsc2U7IC8qIGF0IGxlYXN0IG5vdCBub3cgKi8KKworCQlpZiAoX2J0X2Fk dmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkKKwkJCXNvLT5uZWVkUHJpbVNj YW4gPSB0cnVlOworCX0KKwllbHNlIGlmICghc2tyZXF1aXJlZHRyaWdnZXIpCisJeworCQkvKiBO b3Qgd2hlbiB3ZSBmYWlsZWQgdG8gc2F0aXNmeSBhIG5vbi1yZXF1aXJlZCBzY2FuIGtleSwgZXZl ciAqLworCQlBc3NlcnQoIWFycmF5c19kb25lKTsKKwkJcHN0YXRlLT5jb250aW51ZXNjYW4gPSB0 cnVlOworCX0KKwllbHNlIGlmIChhcnJheXNfZG9uZSkKKwl7CisJCS8qCisJCSAqIFllcCAtLSB0 aGlzIHByaW1pdGl2ZSBzY2FuIHdhcyBvdXIgbGFzdAorCQkgKi8KKwkJQXNzZXJ0KCFhbGxfYXR0 c19lcXVhbCk7CisJCXBzdGF0ZS0+Y29udGludWVzY2FuID0gZmFsc2U7CisJfQorCWVsc2UgaWYg KCFhbGxfYXR0c19lcXVhbCkKKwl7CisJCS8qCisJCSAqIE5vdCBkb25lLiAgVGhlIHRvcC1sZXZl bCBpbmRleCBzY2FuIChhbmQgcHJpbWl0aXZlIGluZGV4IHNjYW4pIHdpbGwKKwkJICogY29udGlu dWUsIHNpbmNlIHRoZSBhcnJheSBrZXlzIGFkdmFuY2VkLgorCQkgKi8KKwkJQXNzZXJ0KGFycmF5 c19hZHZhbmNlZCk7CisJCXBzdGF0ZS0+Y29udGludWVzY2FuID0gdHJ1ZTsKKworCQkvKgorCQkg KiBTb21lIHJlcXVpcmVkIGFycmF5IGtleXMgbWlnaHQgaGF2ZSB3cmFwcGVkIGFyb3VuZCBkdXJp bmcgdGhpcworCQkgKiBjYWxsLCBidXQgaXQgY2FuJ3QgaGF2ZSBiZWVuIHRoZSBtb3N0IHNpZ25p ZmljYW50IGFycmF5IHNjYW4ga2V5LgorCQkgKi8KKwkJQXNzZXJ0KCFhbGxfc2tyZXF1aXJlZF9h dHRzX3dyYXBwZWQpOworCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBOb3QgZG9uZS4gIEEgc2Vj b25kIGNhbGwgdG8gX2J0X2NoZWNrX2NvbXBhcmUgbXVzdCBub3cgdGFrZSBwbGFjZS4KKwkJICog SXQgd2lsbCBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbiBvbiBzZXR0aW5nIGNvbnRpbnVlc2Nhbi4K KwkJICovCisJfQorCisJcmV0dXJuIGFsbF9hdHRzX2VxdWFsOworfQorCisvKgorICogQWR2YW5j ZSB0aGUgYXJyYXkga2V5cyBieSBhIHNpbmdsZSBpbmNyZW1lbnQgaW4gdGhlIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24KKyAqLworc3RhdGljIGJvb2wKK19idF9hZHZhbmNlX2FycmF5X2tleXNfaW5j cmVtZW50KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCit7CisJQlRTY2Fu T3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCWJvb2wJCWZvdW5kID0g ZmFsc2U7CisJaW50CQkJaTsKKworCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwkvKgor CSAqIFdlIG11c3QgYWR2YW5jZSB0aGUgbGFzdCBhcnJheSBrZXkgbW9zdCBxdWlja2x5LCBzaW5j ZSBpdCB3aWxsCisJICogY29ycmVzcG9uZCB0byB0aGUgbG93ZXN0LW9yZGVyIGluZGV4IGNvbHVt biBhbW9uZyB0aGUgYXZhaWxhYmxlCisJICogcXVhbGlmaWNhdGlvbnMuIFRoaXMgaXMgbmVjZXNz YXJ5IHRvIGVuc3VyZSBjb3JyZWN0IG9yZGVyaW5nIG9mIG91dHB1dAorCSAqIHdoZW4gdGhlcmUg YXJlIG11bHRpcGxlIGFycmF5IGtleXMuCisJICovCisJZm9yIChpID0gc28tPm51bUFycmF5S2V5 cyAtIDE7IGkgPj0gMDsgaS0tKQorCXsKKwkJQlRBcnJheUtleUluZm8gKmN1ckFycmF5S2V5ID0g JnNvLT5hcnJheUtleXNbaV07CisJCVNjYW5LZXkJCXNrZXkgPSAmc28tPmFycmF5S2V5RGF0YVtj dXJBcnJheUtleS0+c2Nhbl9rZXldOworCQlpbnQJCQljdXJfZWxlbSA9IGN1ckFycmF5S2V5LT5j dXJfZWxlbTsKKwkJaW50CQkJbnVtX2VsZW1zID0gY3VyQXJyYXlLZXktPm51bV9lbGVtczsKKwor CQlpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkKKwkJeworCQkJaWYgKC0tY3VyX2Vs ZW0gPCAwKQorCQkJeworCQkJCWN1cl9lbGVtID0gbnVtX2VsZW1zIC0gMTsKKwkJCQlmb3VuZCA9 IGZhbHNlOwkvKiBuZWVkIHRvIGFkdmFuY2UgbmV4dCBhcnJheSBrZXkgKi8KKwkJCX0KKwkJCWVs c2UKKwkJCQlmb3VuZCA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKytjdXJfZWxl bSA+PSBudW1fZWxlbXMpCisJCQl7CisJCQkJY3VyX2VsZW0gPSAwOworCQkJCWZvdW5kID0gZmFs c2U7CS8qIG5lZWQgdG8gYWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLworCQkJfQorCQkJZWxzZQor CQkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCisJCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IGN1cl9l bGVtOworCQlza2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tjdXJf ZWxlbV07CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBmb3VuZDsKK30K KworLyoKKyAqIFBlcmZvcm0gZmluYWwgc3RlcHMgd2hlbiB0aGUgImVuZCBwb2ludCIgaXMgcmVh Y2hlZCBvbiB0aGUgbGVhZiBsZXZlbAorICogd2l0aG91dCBhbnkgY2FsbCB0byBfYnRfY2hlY2tr ZXlzIHNldHRpbmcgKmNvbnRpbnVlc2NhbiB0byBmYWxzZS4KKyAqLworc3RhdGljIHZvaWQKK19i dF9hZHZhbmNlX2FycmF5X2tleXNfdG9fZW5kKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3Bh cXVlOworCisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCUFzc2VydCghc28tPm5lZWRQcmlt U2Nhbik7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IHNvLT5udW1BcnJheUtleXM7IGkrKykKKwl7 CisJCUJUQXJyYXlLZXlJbmZvICpjdXJBcnJheUtleSA9ICZzby0+YXJyYXlLZXlzW2ldOworCQlT Y2FuS2V5CQlza2V5ID0gJnNvLT5hcnJheUtleURhdGFbY3VyQXJyYXlLZXktPnNjYW5fa2V5XTsK KwkJaW50CQkJcmVzZXRfZWxlbTsKKworCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIp KQorCQkJcmVzZXRfZWxlbSA9IGN1ckFycmF5S2V5LT5udW1fZWxlbXMgLSAxOworCQllbHNlCisJ CQlyZXNldF9lbGVtID0gMDsKKworCQlpZiAoY3VyQXJyYXlLZXktPmN1cl9lbGVtICE9IHJlc2V0 X2VsZW0pCisJCXsKKwkJCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IHJlc2V0X2VsZW07CisJCQlz a2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tyZXNldF9lbGVtXTsK KwkJfQorCX0KK30KIAogLyoKICAqCV9idF9wcmVwcm9jZXNzX2tleXMoKSAtLSBQcmVwcm9jZXNz IHNjYW4ga2V5cwpAQCAtMTM2MCw0MSArMjI5NCwyMTAgQEAgX2J0X21hcmtfc2NhbmtleV9yZXF1 aXJlZChTY2FuS2V5IHNrZXkpCiAgKgogICogUmV0dXJuIHRydWUgaWYgc28sIGZhbHNlIGlmIG5v dC4gIElmIHRoZSB0dXBsZSBmYWlscyB0byBwYXNzIHRoZSBxdWFsLAogICogd2UgYWxzbyBkZXRl cm1pbmUgd2hldGhlciB0aGVyZSdzIGFueSBuZWVkIHRvIGNvbnRpbnVlIHRoZSBzY2FuIGJleW9u ZAotICogdGhpcyB0dXBsZSwgYW5kIHNldCAqY29udGludWVzY2FuIGFjY29yZGluZ2x5LiAgU2Vl IGNvbW1lbnRzIGZvcgorICogdGhpcyB0dXBsZSwgYW5kIHNldCBwc3RhdGUuY29udGludWVzY2Fu IGFjY29yZGluZ2x5LiAgU2VlIGNvbW1lbnRzIGZvcgogICogX2J0X3ByZXByb2Nlc3Nfa2V5cygp LCBhYm92ZSwgYWJvdXQgaG93IHRoaXMgaXMgZG9uZS4KICAqCi0gKiBGb3J3YXJkIHNjYW4gY2Fs bGVycyBjYW4gcGFzcyBhIGhpZ2gga2V5IHR1cGxlIGluIHRoZSBob3BlcyBvZiBoYXZpbmcKLSAq IHVzIHNldCAqY29udGludWVzY2FuIHRvIGZhbHNlLCBhbmQgYXZvaWRpbmcgYW4gdW5uZWNlc3Nh cnkgdmlzaXQgdG8KLSAqIHRoZSBwYWdlIHRvIHRoZSByaWdodC4KKyAqIEZvcndhcmQgc2NhbiBj YWxsZXJzIGNhbiBwYXNzIGEgaGlnaCBrZXkgdHVwbGUgaW4gdGhlIGhvcGVzIG9mIGhhdmluZyB1 cworICogc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4gdG8gZmFsc2UsIGFuZCBhdm9pZGluZyBhbiB1 bm5lY2Vzc2FyeSB2aXNpdCB0byB0aGUKKyAqIHBhZ2UgdG8gdGhlIHJpZ2h0LgorICoKKyAqIEZv cndhcmRzIHNjYW4gY2FsbGVycyB3aXRoIGVxdWFsaXR5IHR5cGUgYXJyYXkgc2NhbiBrZXlzIGFy ZSBvYmxpZ2F0ZWQgdG8KKyAqIHNldCB1cCBwYWdlIHN0YXRlIGluIGEgd2F5IHRoYXQgbWFrZXMg aXQgcG9zc2libGUgZm9yIHVzIHRvIGNoZWNrIHRoZSBoaWdoCisgKiBrZXkgZWFybHksIGJlZm9y ZSB3ZSd2ZSBleHBlbmRlZCB0b28gbXVjaCBlZmZvcnQgb24gY29tcGFyaW5nIHR1cGxlcyB0aGF0 CisgKiBjYW5ub3QgcG9zc2libHkgYmUgbWF0Y2hlcyBmb3IgYW55IHNldCBvZiBhcnJheSBrZXlz LiAgVGhpcyBpcyBqdXN0IGFuCisgKiBvcHRpbWl6YXRpb24uCisgKgorICogQWR2YW5jZXMgdGhl IGN1cnJlbnQgc2V0IG9mIGFycmF5IGtleXMgZm9yIFNLX1NFQVJDSEFSUkFZIHNjYW5zIHdoZXJl CisgKiBhcHByb3ByaWF0ZS4gIFRoZXNlIGNhbGxlcnMgYXJlIHJlcXVpcmVkIHRvIGluaXRpYWxp emUgdGhlIHBhZ2UgbGV2ZWwgaGlnaAorICoga2V5IGluIHBzdGF0ZSBiZWZvcmUgdGhlIGZpcnN0 IGNhbGwgaGVyZSBmb3IgdGhlIHBhZ2UgKHdoZW4gdGhlIHNjYW4KKyAqIGRpcmVjdGlvbiBpcyBm b3J3YXJkcykuICBOb3RlIHRoYXQgd2UgcmVseSBvbiBfYnRfcmVhZHBhZ2UgY2FsbGluZyBoZXJl IGluCisgKiBwYWdlIG9mZnNldCBudW1iZXIgb3JkZXIgKGZvciBpdHMgc2NhbiBkaXJlY3Rpb24p LiAgQW55IG90aGVyIG9yZGVyIHdpbGwKKyAqIGxlYWQgdG8gaW5jb25zaXN0ZW50IGFycmF5IGtl eSBzdGF0ZS4KICAqCiAgKiBzY2FuOiBpbmRleCBzY2FuIGRlc2NyaXB0b3IgKGNvbnRhaW5pbmcg YSBzZWFyY2gtdHlwZSBzY2Fua2V5KQorICogcHN0YXRlOiBQYWdlIGxldmVsIGlucHV0IGFuZCBv dXRwdXQgcGFyYW1ldGVycwogICogdHVwbGU6IGluZGV4IHR1cGxlIHRvIHRlc3QKLSAqIHR1cG5h dHRzOiBudW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0dXBuYXR0cyAoaGlnaCBrZXkgbWF5IGJlIHRy dW5jYXRlZCkKLSAqIGRpcjogZGlyZWN0aW9uIHdlIGFyZSBzY2FubmluZyBpbgotICogY29udGlu dWVzY2FuOiBvdXRwdXQgcGFyYW1ldGVyICh3aWxsIGJlIHNldCBjb3JyZWN0bHkgaW4gYWxsIGNh c2VzKQorICogZmluYWx0dXA6IElzIHR1cGxlIHRoZSBmaW5hbCBvbmUgd2UnbGwgYmUgY2FsbGVk IHdpdGggZm9yIHRoaXMgcGFnZT8KICAqIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2s6IGluZGlj YXRlcyB0aGF0IHNjYW4ga2V5cyByZXF1aXJlZCBmb3IKICAqIAkJCQkJCQkgIGRpcmVjdGlvbiBz Y2FuIGFyZSBhbHJlYWR5IG1hdGNoZWQKICAqLwogYm9vbAotX2J0X2NoZWNra2V5cyhJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKLQkJCSAgU2NhbkRp cmVjdGlvbiBkaXIsIGJvb2wgKmNvbnRpbnVlc2NhbiwKK19idF9jaGVja2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuLCBCVFJlYWRQYWdlU3RhdGUgKnBzdGF0ZSwKKwkJCSAgSW5kZXhUdXBsZSB0dXBs ZSwgYm9vbCBmaW5hbHR1cCwKIAkJCSAgYm9vbCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKQog ewotCVR1cGxlRGVzYwl0dXBkZXNjOwotCUJUU2Nhbk9wYXF1ZSBzbzsKLQlpbnQJCQlrZXlzejsK KwlUdXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Ioc2Nhbi0+aW5kZXhSZWxhdGlv bik7CisJaW50CQkJbmF0dHMgPSBCVHJlZVR1cGxlR2V0TkF0dHModHVwbGUsIHNjYW4tPmluZGV4 UmVsYXRpb24pOworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKKwlib29sCQlyZXM7CisJYm9vbAkJc2tyZXF1aXJlZHRyaWdnZXI7CisKKwlBc3NlcnQoc28t PnF1YWxfb2spOworCUFzc2VydChwc3RhdGUtPmNvbnRpbnVlc2Nhbik7CisJQXNzZXJ0KCFzby0+ bmVlZFByaW1TY2FuKTsKKworCXJlcyA9IF9idF9jaGVja19jb21wYXJlKHBzdGF0ZS0+ZGlyLCBz by0+a2V5RGF0YSwgc28tPm51bWJlck9mS2V5cywKKwkJCQkJCQl0dXBsZSwgbmF0dHMsIHR1cGRl c2MsCisJCQkJCQkJJnBzdGF0ZS0+Y29udGludWVzY2FuLCAmc2tyZXF1aXJlZHRyaWdnZXIsCisJ CQkJCQkJcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CisKKwkvKgorCSAqIE9ubHkgb25lIF9i dF9jaGVja19jb21wYXJlIGNhbGwgaXMgcmVxdWlyZWQgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJl CisJICogdGhlcmUgYXJlIG5vIGVxdWFsaXR5LXR5cGUgYXJyYXkgc2NhbiBrZXlzLgorCSAqCisJ ICogV2hlbiB0aGVyZSBhcmUgYXJyYXkgc2NhbiBrZXlzIHRoZW4gd2UgY2FuIHN0aWxsIGFjY2Vw dCB0aGUgZmlyc3QKKwkgKiBhbnN3ZXIgd2UgZ2V0IGZyb20gX2J0X2NoZWNrX2NvbXBhcmUgd2hl biBjb250aW51ZXNjYW4gd2Fzbid0IHVuc2V0LgorCSAqLworCWlmICghc28tPm51bUFycmF5S2V5 cyB8fCBwc3RhdGUtPmNvbnRpbnVlc2NhbikKKwkJcmV0dXJuIHJlczsKKworCS8qCisJICogX2J0 X2NoZWNrX2NvbXBhcmUgc2V0IGNvbnRpbnVlc2Nhbj1mYWxzZSBpbiB0aGUgcHJlc2VuY2Ugb2Yg ZXF1YWxpdHkKKwkgKiB0eXBlIGFycmF5IGtleXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2 ZW4ndCByZWFjaGVkIHRoZSBzdGFydCBvZgorCSAqIHRoZSBhcnJheSBrZXlzIGp1c3QgeWV0LiAg SXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBhZHZhbmNlCisJICogdGhlIGFycmF5 IGtleXMgbm93LiAgKE9yIHBlcmhhcHMgd2UgcmVhbGx5IGRvIG5lZWQgdG8gdGVybWluYXRlIHRo ZQorCSAqIHRvcC1sZXZlbCBzY2FuLikKKwkgKi8KKwlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRy dWU7CS8qIG5ldyBpbml0aWFsIGFzc3VtcHRpb24gKi8KKworCWlmIChza3JlcXVpcmVkdHJpZ2dl ciAmJiBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKHNjYW4sIHBzdGF0ZSwgdHVwbGUpKQor CXsKKwkJLyoKKwkJICogVHVwbGUgaXMgc3RpbGwgPCB0aGUgY3VycmVudCBhcnJheSBzY2FuIGtl eSB2YWx1ZXMgKGFzIHdlbGwgYXMKKwkJICogb3RoZXIgZXF1YWxpdHkgdHlwZSBzY2FuIGtleXMp IGlmIHRoaXMgaXMgYSBmb3J3YXJkIHNjYW4uCisJCSAqIChCYWNrd2FyZHMgc2NhbnMgcmVhY2gg aGVyZSB3aXRoIGEgdHVwbGUgPiBlcXVhbGl0eSBjb25zdHJhaW50cy4pCisJCSAqIFdlIG11c3Qg bm93IGNvbnNpZGVyIGhvdyB0byBwcm9jZWVkIHdpdGggdGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJ CSAqIGluZGV4IHNjYW4uCisJCSAqCisJCSAqIFNob3VsZCBfYnRfcmVhZHBhZ2UgY29udGludWUg d2l0aCB0aGlzIHBhZ2UgZm9yIG5vdywgaW4gdGhlIGhvcGUgb2YKKwkJICogZmluZGluZyB0dXBs ZXMgd2hvc2Uga2V5IHNwYWNlIGlzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgYXJyYXkga2V5cwor CQkgKiBiZWZvcmUgdG9vIGxvbmc/ICBPciwgc2hvdWxkIGl0IGdpdmUgdXAgYW5kIHN0YXJ0IGEg bmV3IHByaW1pdGl2ZQorCQkgKiBpbmRleCBzY2FuIGluc3RlYWQ/CisJCSAqCisJCSAqIE91ciBw b2xpY3kgaXMgdG8gdGVybWluYXRlIHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBhdCB0aGUgZW5k IG9mCisJCSAqIHRoZSBjdXJyZW50IHBhZ2UgaWYgdGhlIGN1cnJlbnQgKG1vc3QgcmVjZW50bHkg YWR2YW5jZWQpIGFycmF5IGtleXMKKwkJICogZG9uJ3QgY292ZXIgdGhlIGZpbmFsIHR1cGxlIGZy b20gdGhlIHBhZ2UuICBUaGlzIHBvbGljeSBpcyBmYWlybHkKKwkJICogY29uc2VydmF0aXZlLgor CQkgKgorCQkgKiBOb3RlOiBJbiBzb21lIGNhc2VzIHdlJ3JlIGVmZmVjdGl2ZWx5IHNwZWN1bGF0 aW5nIHRoYXQgdGhlIG5leHQKKwkJICogc2libGluZyBsZWFmIHBhZ2Ugd2lsbCBoYXZlIHR1cGxl cyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IHRoZSBrZXkKKwkJICogc3BhY2Ugb2Ygb3VyIGFycmF5IGtl eXMgKHRoZSBjdXJyZW50IHNldCBvciBzb21lIG5lYXJieSBzZXQpLCBiYXNlZAorCQkgKiBvbiBh IGN1ZSBmcm9tIHRoZSBjdXJyZW50IHBhZ2UncyBmaW5hbCB0dXBsZS4gIFRoZXJlIGlzIGF0IGxl YXN0IGEKKwkJICogbm9uLXplcm8gcmlzayBvZiB3YXN0aW5nIGEgcGFnZSBhY2Nlc3MgLS0gd2Ug Y291bGQgZ2FtYmxlIGFuZCBsb3NlLgorCQkgKiBUaGUgZGV0YWlscyBvZiBhbGwgdGhpcyBhcmUg aGFuZGxlZCB3aXRoaW4gX2J0X2FkdmFuY2VfYXJyYXlfa2V5cy4KKwkJICovCisJCWlmIChmaW5h bHR1cCB8fCAoIXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQgJiYgcHN0YXRlLT5oaWdoa2V5ICYmCisJ CQkJCQkgX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyhzY2FuLCBwc3RhdGUsCisJCQkJCQkJ CQkJCQkJICBwc3RhdGUtPmhpZ2hrZXkpKSkKKwkJeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhl IGZpbmFsIHR1cGxlICh0aGUgaGlnaCBrZXkgZm9yIGZvcndhcmQgc2NhbnMsIG9yIHRoZQorCQkJ ICogdHVwbGUgYXQgdGhlIGZpcnN0IG9mZnNldCBudW1iZXIgZm9yIGJhY2t3YXJkIHNjYW5zKSwg YnV0IGl0IGlzCisJCQkgKiBzdGlsbCBiZWZvcmUgdGhlIGN1cnJlbnQgYXJyYXkga2V5cy4gIEFz IHN1Y2gsIHdlJ3JlIHVud2lsbGluZworCQkJICogdG8gYWxsb3cgdGhlIGN1cnJlbnQgcHJpbWl0 aXZlIGluZGV4IHNjYW4gdG8gY29udGludWUgdG8gdGhlCisJCQkgKiBuZXh0IGxlYWYgcGFnZS4K KwkJCSAqCisJCQkgKiBTdGFydCBhIG5ldyBwcmltaXRpdmUgaW5kZXggc2Nhbi4gIFRoZSBuZXh0 IHByaW1pdGl2ZSBpbmRleAorCQkJICogc2NhbiAoaW4gdGhlIG5leHQgX2J0X2ZpcnN0IGNhbGwp IGlzIGV4cGVjdGVkIHRvIHJlcG9zaXRpb24gdGhlCisJCQkgKiBzY2FuIHRvIHNvbWUgbXVjaCBs YXRlciBsZWFmIHBhZ2UuICAoSWYgd2UgaGFkIGEgZ29vZCByZWFzb24gdG8KKwkJCSAqIHRoaW5r IHRoYXQgdGhlIG5leHQgbGVhZiBwYWdlIHRoYXQgd2lsbCBiZSBzY2FubmVkIHdpbGwgdHVybgor CQkJICogb3V0IHRvIGJlIGNsb3NlIHRvIG91ciBjdXJyZW50IHBvc2l0aW9uLCB0aGVuIHdlIHdv dWxkbid0IGJlCisJCQkgKiBzdGFydGluZyBhbm90aGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuLikK KwkJCSAqCisJCQkgKiBOb3RlOiBfYnRfcmVhZHBhZ2Ugc3Rhc2hlcyB0aGUgcGFnZSBoaWdoIGtl eSwgd2hpY2ggYWxsb3dzIHVzCisJCQkgKiB0byBtYWtlIHRoaXMgY2hlY2sgZWFybHkgKGZvciBm b3J3YXJkIHNjYW5zKS4gIFdlIHRoZXJlYnkgYXZvaWQKKwkJCSAqIHNjYW5uaW5nIHZlcnkgbWFu eSBleHRyYSB0dXBsZXMgb24gdGhlIHBhZ2UuICBUaGlzIGlzIGp1c3QgYW4KKwkJCSAqIG9wdGlt aXphdGlvbjsgc2tpcHBpbmcgdGhlc2UgdXNlbGVzcyBjb21wYXJpc29ucyBzaG91bGQgbmV2ZXIK KwkJCSAqIGNoYW5nZSBvdXIgZmluYWwgY29uY2x1c2lvbiBhYm91dCB3aGF0IHRoZSBzY2FuIHNo b3VsZCBkbyBuZXh0LgorCQkJICovCisJCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IGZhbHNlOwor CQkJc28tPm5lZWRQcmltU2NhbiA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIWZpbmFsdHVwICYm IHBzdGF0ZS0+aGlnaGtleSkKKwkJeworCQkJLyoKKwkJCSAqIFJlbWVtYmVyIHRoYXQgdGhlIGhp Z2gga2V5IGhhcyBiZWVuIGNoZWNrZWQgd2l0aCB0aGlzCisJCQkgKiBwYXJ0aWN1bGFyIHNldCBv ZiBhcnJheSBrZXlzLgorCQkJICoKKwkJCSAqIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sg dGhlIHNhbWUgaGlnaCBrZXkgYWdhaW4gYXQgc29tZQorCQkJICogcG9pbnQgZHVyaW5nIHRoZSBv bmdvaW5nIF9idF9yZWFkcGFnZS13aXNlIHNjYW4gb2YgdGhpcyBwYWdlLgorCQkJICogQnV0IGl0 IGlzIGRlZmluaXRlbHkgd2FzdGVmdWwgdG8gcmVwZWF0IHRoZSBzYW1lIGhpZ2gga2V5IGNoZWNr CisJCQkgKiBiZWZvcmUgdGhlIGFycmF5IGtleXMgYXJlIGFkdmFuY2VkIGJ5IHNvbWUgbGF0ZXIg dHVwbGUuCisJCQkgKi8KKwkJCXBzdGF0ZS0+aGlnaGtleWNoZWNrZWQgPSB0cnVlOworCQl9CisK KwkJLyoKKwkJICogSW4gYW55IGNhc2UsIHRoaXMgaW5kZXh0dXBsZSBkb2Vzbid0IG1hdGNoIHRo ZSBxdWFsCisJCSAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBDYWxsZXIncyB0 dXBsZSBpcyA+PSB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cyBhbmQgb3RoZXIgZXF1YWxp dHkKKwkgKiBjb25zdHJhaW50IHNjYW4ga2V5cyAob3IgPD0gaWYgdGhpcyBpcyBhIGJhY2t3YXJk cyBzY2FucykuCisJICoKKwkgKiBJdCBtaWdodCBiZSB0aW1lIHRvIGFkdmFuY2UgdGhlIGFycmF5 IGtleXMgdG8gdGhlIG5leHQgc2V0LiAgVHJ5IGRvaW5nCisJICogdGhhdCBub3csIHdoaWxlIGRl dGVybWluaW5nIGluIHBhc3NpbmcgaWYgdGhlIHR1cGxlIG1hdGNoZXMgdGhlIG5ld2x5CisJICog YWR2YW5jZWQgc2V0IG9mIGFycmF5IGtleXMgKGlmIHdlJ3ZlIGFueSBsZWZ0KS4KKwkgKgorCSAq IFRoaXMgY2FsbCB3aWxsIGFsc28gc2V0IGNvbnRpbnVlc2NhbiBmb3IgdXMgKG9yIHRlbGxzIHVz IHRvIHBlcmZvcm0KKwkgKiBhbm90aGVyIF9idF9jaGVja19jb21wYXJlIGNhbGwsIHdoaWNoIHRo ZW4gc2V0cyBjb250aW51ZXNjYW4gZm9yIHVzKS4KKwkgKi8KKwlpZiAoIV9idF9hZHZhbmNlX2Fy cmF5X2tleXMoc2NhbiwgcHN0YXRlLCB0dXBsZSwgc2tyZXF1aXJlZHRyaWdnZXIpKQorCXsKKwkJ LyoKKwkJICogVHVwbGUgZG9lc24ndCBtYXRjaCBhbnkgbGF0ZXIgYXJyYXkga2V5cywgZWl0aGVy IChmb3Igb25lIG9yIG1vcmUKKwkJICogYXJyYXkgdHlwZSBzY2FuIGtleXMgbWFya2VkIGFzIHJl cXVpcmVkKS4gIEdpdmUgdXAgb24gdGhpcyB0dXBsZQorCQkgKiBiZWluZyBhIG1hdGNoLiAgKENh bGwgbWF5IGhhdmUgYWxzbyB0ZXJtaW5hdGVkIHRoZSBwcmltaXRpdmUgc2NhbiwKKwkJICogb3Ig dGhlIHRvcC1sZXZlbCBzY2FuLikKKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgor CSAqIEFkdmFuY2VkIGFycmF5IGtleXMgdG8gdmFsdWVzIHRoYXQgYXJlIGV4YWN0IG1hdGNoZXMg Zm9yIGNvcnJlc3BvbmRpbmcKKwkgKiBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIHR1cGxlLgor CSAqCisJICogSXQncyBmYWlybHkgbGlrZWx5IHRoYXQgdGhlIHR1cGxlIHNhdGlzZmllcyBhbGwg aW5kZXggc2NhbiBjb25kaXRpb25zCisJICogYXQgdGhpcyBwb2ludCwgYnV0IHdlIG5lZWQgY29u ZmlybWF0aW9uIG9mIHRoYXQuICBXZSBhbHNvIG5lZWQgdG8gZ2l2ZQorCSAqIF9idF9jaGVja19j b21wYXJlIGEgcmVhbCBvcHBvcnR1bml0eSB0byBlbmQgdGhlIHRvcC1sZXZlbCBpbmRleCBzY2Fu IGJ5CisJICogc2V0dGluZyBjb250aW51ZXNjYW49ZmFsc2UuICAoX2J0X2FkdmFuY2VfYXJyYXlf a2V5cyBjYW5ub3QgZGVhbCB3aXRoCisJICogaW5lcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXM7 IHdlIG5lZWQgX2J0X2NoZWNrX2NvbXBhcmUgZm9yIHRob3NlLikKKwkgKi8KKwlyZXR1cm4gX2J0 X2NoZWNrX2NvbXBhcmUocHN0YXRlLT5kaXIsIHNvLT5rZXlEYXRhLCBzby0+bnVtYmVyT2ZLZXlz LAorCQkJCQkJCSB0dXBsZSwgbmF0dHMsIHR1cGRlc2MsCisJCQkJCQkJICZwc3RhdGUtPmNvbnRp bnVlc2NhbiwgJnNrcmVxdWlyZWR0cmlnZ2VyLAorCQkJCQkJCSByZXF1aXJlZE1hdGNoZWRCeVBy ZWNoZWNrKTsKK30KKworLyoKKyAqIFRlc3Qgd2hldGhlciBhbiBpbmRleHR1cGxlIHNhdGlzZmll cyBjdXJyZW50IHNjYW4gY29uZGl0aW9uLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHNvLCBmYWxz ZSBpZiBub3QuICBJZiBub3QsIGFsc28gY2xlYXIgKmNvbnRpbnVlc2NhbiBpZgorICogaXQncyBu b3QgcG9zc2libGUgZm9yIGFueSBmdXR1cmUgdHVwbGVzIGluIHRoZSBjdXJyZW50IHNjYW4gZGly ZWN0aW9uIHRvCisgKiBwYXNzIHRoZSBxdWFsIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5 IGtleXMuCisgKgorICogVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja2tleXMuICBJ dCBpcyB3cml0dGVuIHdpdGggdGhlIGFzc3VtcHRpb24KKyAqIHRoYXQgcmVhY2hpbmcgdGhlIGVu ZCBvZiBlYWNoIGRpc3RpbmN0IHNldCBvZiBhcnJheSBrZXlzIHRlcm1pbmF0ZXMgdGhlCisgKiBv bmdvaW5nIHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgSXQgaXMgdXAgdG8gb3VyIGNhbGxlciAodGhh dCBoYXMgbW9yZQorICogY29udGV4dCB0aGFuIHdlIGhhdmUgYXZhaWxhYmxlIGhlcmUpIHRvIG92 ZXJyaWRlIHRoYXQgaW5pdGlhbCBkZXRlcm1pbmF0aW9uCisgKiB3aGVuIGl0IG1ha2VzIG1vcmUg c2Vuc2UgdG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyBhbmQgY29udGludWUgd2l0aAorICogZnVy dGhlciB0dXBsZXMgZnJvbSB0aGUgc2FtZSBsZWFmIHBhZ2UuCisgKi8KK3N0YXRpYyBib29sCitf YnRfY2hlY2tfY29tcGFyZShTY2FuRGlyZWN0aW9uIGRpciwgU2NhbktleSBrZXlEYXRhLCBpbnQg a2V5c3osCisJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsIFR1cGxlRGVzYyB0 dXBkZXNjLAorCQkJCSAgYm9vbCAqY29udGludWVzY2FuLCBib29sICpza3JlcXVpcmVkdHJpZ2dl ciwKKwkJCQkgIGJvb2wgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjaykKK3sKIAlpbnQJCQlpa2V5 OwogCVNjYW5LZXkJCWtleTsKIAotCUFzc2VydChCVHJlZVR1cGxlR2V0TkF0dHModHVwbGUsIHNj YW4tPmluZGV4UmVsYXRpb24pID09IHR1cG5hdHRzKTsKLQogCSpjb250aW51ZXNjYW4gPSB0cnVl OwkJLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCisJKnNrcmVxdWlyZWR0cmlnZ2VyID0gdHJ1ZTsJ LyogZGVmYXVsdCBhc3N1bXB0aW9uICovCiAKLQl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihz Y2FuLT5pbmRleFJlbGF0aW9uKTsKLQlzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsK LQlrZXlzeiA9IHNvLT5udW1iZXJPZktleXM7Ci0KLQlmb3IgKGtleSA9IHNvLT5rZXlEYXRhLCBp a2V5ID0gMDsgaWtleSA8IGtleXN6OyBrZXkrKywgaWtleSsrKQorCWZvciAoa2V5ID0ga2V5RGF0 YSwgaWtleSA9IDA7IGlrZXkgPCBrZXlzejsga2V5KyssIGlrZXkrKykKIAl7CiAJCURhdHVtCQlk YXR1bTsKIAkJYm9vbAkJaXNOdWxsOwpAQCAtMTUyNSwxOCArMjYyOCwxMSBAQCBfYnRfY2hlY2tr ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAog CQkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gc2NhbiwgaXQgbXVzdCBiZSBhbHJlYWR5IHNhdGlzZmll ZCBieQogCQkgKiBfYnRfZmlyc3QoKSBleGNlcHQgZm9yIHRoZSBOVUxMcyBjaGVja2luZywgd2hp Y2ggaGF2ZSBhbHJlYWR5IGRvbmUKIAkJICogYWJvdmUuCisJCSAqCisJCSAqIEZJWE1FCiAJCSAq LwotCQlpZiAoIXJlcXVpcmVkT3Bwb3NpdGVEaXIpCi0JCXsKLQkJCXRlc3QgPSBGdW5jdGlvbkNh bGwyQ29sbCgma2V5LT5za19mdW5jLCBrZXktPnNrX2NvbGxhdGlvbiwKLQkJCQkJCQkJCSBkYXR1 bSwga2V5LT5za19hcmd1bWVudCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0ZXN0ID0gdHJ1ZTsK LQkJCUFzc2VydCh0ZXN0ID09IEZ1bmN0aW9uQ2FsbDJDb2xsKCZrZXktPnNrX2Z1bmMsIGtleS0+ c2tfY29sbGF0aW9uLAotCQkJCQkJCQkJCQkgZGF0dW0sIGtleS0+c2tfYXJndW1lbnQpKTsKLQkJ fQorCQl0ZXN0ID0gRnVuY3Rpb25DYWxsMkNvbGwoJmtleS0+c2tfZnVuYywga2V5LT5za19jb2xs YXRpb24sCisJCQkJCQkJCSBkYXR1bSwga2V5LT5za19hcmd1bWVudCk7CiAKIAkJaWYgKCFEYXR1 bUdldEJvb2wodGVzdCkpCiAJCXsKQEAgLTE1NDksMTAgKzI2NDUsMjIgQEAgX2J0X2NoZWNra2V5 cyhJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKIAkJ CSAqIHF1YWwgZmFpbHMsIGl0IGlzIGNyaXRpY2FsIHRoYXQgZXF1YWxpdHkgcXVhbHMgYmUgdXNl ZCBmb3IgdGhlCiAJCQkgKiBpbml0aWFsIHBvc2l0aW9uaW5nIGluIF9idF9maXJzdCgpIHdoZW4g dGhleSBhcmUgYXZhaWxhYmxlLiBTZWUKIAkJCSAqIGNvbW1lbnRzIGluIF9idF9maXJzdCgpLgor CQkJICoKKwkJCSAqIFNjYW5zIHdpdGggZXF1YWxpdHktdHlwZSBhcnJheSBzY2FuIGtleXMgcnVu IGludG8gYSBzaW1pbGFyCisJCQkgKiBwcm9ibGVtIHdoZW5ldmVyIHRoZXkgYWR2YW5jZSB0aGUg YXJyYXkga2V5cy4gIE91ciBjYWxsZXIgdXNlcworCQkJICogX2J0X3R1cGxlX2JlZm9yZV9hcnJh eV9za2V5cyB0byBhdm9pZCB0aGUgcHJvYmxlbSB0aGVyZS4KIAkJCSAqLwogCQkJaWYgKHJlcXVp cmVkU2FtZURpcikKIAkJCQkqY29udGludWVzY2FuID0gZmFsc2U7CiAKKwkJCWlmICgoa2V5LT5z a19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKSAmJgorCQkJCWtleS0+c2tfc3RyYXRlZ3kgPT0gQlRF cXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJeworCQkJCWlmICgqY29udGludWVzY2FuKQorCQkJCQkq c2tyZXF1aXJlZHRyaWdnZXIgPSBmYWxzZTsKKwkJCQkqY29udGludWVzY2FuID0gZmFsc2U7CisJ CQl9CisKIAkJCS8qCiAJCQkgKiBJbiBhbnkgY2FzZSwgdGhpcyBpbmRleHR1cGxlIGRvZXNuJ3Qg bWF0Y2ggdGhlIHF1YWwuCiAJCQkgKi8KQEAgLTE1NzEsNyArMjY3OSw3IEBAIF9idF9jaGVja2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsCiAg KiBpdCdzIG5vdCBwb3NzaWJsZSBmb3IgYW55IGZ1dHVyZSB0dXBsZXMgaW4gdGhlIGN1cnJlbnQg c2NhbiBkaXJlY3Rpb24KICAqIHRvIHBhc3MgdGhlIHF1YWwuCiAgKgotICogVGhpcyBpcyBhIHN1 YnJvdXRpbmUgZm9yIF9idF9jaGVja2tleXMsIHdoaWNoIHNlZSBmb3IgbW9yZSBpbmZvLgorICog VGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIF9idF9jaGVja19jb21wYXJlL19idF9jaGVja2tleXNf Y29tcGFyZS4KICAqLwogc3RhdGljIGJvb2wKIF9idF9jaGVja19yb3djb21wYXJlKFNjYW5LZXkg c2tleSwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLApkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2luZHhwYXRoLmMKaW5kZXggNmE5M2Q3NjdhLi5mMDRjYTFlZTkgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMTA2LDggKzEwNiw3IEBAIHN0YXRpYyBMaXN0ICpi dWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJ CQkJCSAgIEluZGV4T3B0SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzLAogCQkJ CQkJCSAgIGJvb2wgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkJCQkgICBTY2FuVHlwZUNvbnRyb2wg c2NhbnR5cGUsCi0JCQkJCQkJICAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCwKLQkJCQkJCQkg ICBib29sICpza2lwX2xvd2VyX3Nhb3ApOworCQkJCQkJCSAgIGJvb2wgKnNraXBfbm9ubmF0aXZl X3Nhb3ApOwogc3RhdGljIExpc3QgKmJ1aWxkX3BhdGhzX2Zvcl9PUihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQlMaXN0ICpjbGF1c2VzLCBMaXN0ICpvdGhlcl9j bGF1c2VzKTsKIHN0YXRpYyBMaXN0ICpnZW5lcmF0ZV9iaXRtYXBfb3JfcGF0aHMoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKQEAgLTcwNiw4ICs3MDUsNiBAQCBlY2xhc3NfYWxy ZWFkeV91c2VkKEVxdWl2YWxlbmNlQ2xhc3MgKnBhcmVudF9lYywgUmVsaWRzIG9sZHJlbGlkcywK ICAqIGluZGV4IEFNIHN1cHBvcnRzIHRoZW0gbmF0aXZlbHksIHdlIHNob3VsZCBqdXN0IGluY2x1 ZGUgdGhlbSBpbiBzaW1wbGUKICAqIGluZGV4IHBhdGhzLiAgSWYgbm90LCB3ZSBzaG91bGQgZXhj bHVkZSB0aGVtIHdoaWxlIGJ1aWxkaW5nIHNpbXBsZSBpbmRleAogICogcGF0aHMsIGFuZCB0aGVu IG1ha2UgYSBzZXBhcmF0ZSBhdHRlbXB0IHRvIGluY2x1ZGUgdGhlbSBpbiBiaXRtYXAgcGF0aHMu Ci0gKiBGdXJ0aGVybW9yZSwgd2Ugc2hvdWxkIGNvbnNpZGVyIGV4Y2x1ZGluZyBsb3dlci1vcmRl ciBTY2FsYXJBcnJheU9wRXhwcgotICogcXVhbHMgc28gYXMgdG8gY3JlYXRlIG9yZGVyZWQgcGF0 aHMuCiAgKi8KIHN0YXRpYyB2b2lkCiBnZXRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKnJlbCwKQEAgLTcxNiwzNyArNzEzLDE3IEBAIGdldF9pbmRleF9wYXRocyhQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogewogCUxpc3QJICAgKmluZGV4cGF0 aHM7CiAJYm9vbAkJc2tpcF9ub25uYXRpdmVfc2FvcCA9IGZhbHNlOwotCWJvb2wJCXNraXBfbG93 ZXJfc2FvcCA9IGZhbHNlOwogCUxpc3RDZWxsICAgKmxjOwogCiAJLyoKIAkgKiBCdWlsZCBzaW1w bGUgaW5kZXggcGF0aHMgdXNpbmcgdGhlIGNsYXVzZXMuICBBbGxvdyBTY2FsYXJBcnJheU9wRXhw cgotCSAqIGNsYXVzZXMgb25seSBpZiB0aGUgaW5kZXggQU0gc3VwcG9ydHMgdGhlbSBuYXRpdmVs eSwgYW5kIHNraXAgYW55IHN1Y2gKLQkgKiBjbGF1c2VzIGZvciBpbmRleCBjb2x1bW5zIGFmdGVy IHRoZSBmaXJzdCAoc28gdGhhdCB3ZSBwcm9kdWNlIG9yZGVyZWQKLQkgKiBwYXRocyBpZiBwb3Nz aWJsZSkuCisJICogY2xhdXNlcyBvbmx5IGlmIHRoZSBpbmRleCBBTSBzdXBwb3J0cyB0aGVtIG5h dGl2ZWx5LgogCSAqLwogCWluZGV4cGF0aHMgPSBidWlsZF9pbmRleF9wYXRocyhyb290LCByZWws CiAJCQkJCQkJCSAgIGluZGV4LCBjbGF1c2VzLAogCQkJCQkJCQkgICBpbmRleC0+cHJlZE9LLAog CQkJCQkJCQkgICBTVF9BTllTQ0FOLAotCQkJCQkJCQkgICAmc2tpcF9ub25uYXRpdmVfc2FvcCwK LQkJCQkJCQkJICAgJnNraXBfbG93ZXJfc2FvcCk7Ci0KLQkvKgotCSAqIElmIHdlIHNraXBwZWQg YW55IGxvd2VyLW9yZGVyIFNjYWxhckFycmF5T3BFeHBycyBvbiBhbiBpbmRleCB3aXRoIGFuIEFN Ci0JICogdGhhdCBzdXBwb3J0cyB0aGVtLCB0aGVuIHRyeSBhZ2FpbiBpbmNsdWRpbmcgdGhvc2Ug Y2xhdXNlcy4gIFRoaXMgd2lsbAotCSAqIHByb2R1Y2UgcGF0aHMgd2l0aCBtb3JlIHNlbGVjdGl2 aXR5IGJ1dCBubyBvcmRlcmluZy4KLQkgKi8KLQlpZiAoc2tpcF9sb3dlcl9zYW9wKQotCXsKLQkJ aW5kZXhwYXRocyA9IGxpc3RfY29uY2F0KGluZGV4cGF0aHMsCi0JCQkJCQkJCSBidWlsZF9pbmRl eF9wYXRocyhyb290LCByZWwsCi0JCQkJCQkJCQkJCQkgICBpbmRleCwgY2xhdXNlcywKLQkJCQkJ CQkJCQkJCSAgIGluZGV4LT5wcmVkT0ssCi0JCQkJCQkJCQkJCQkgICBTVF9BTllTQ0FOLAotCQkJ CQkJCQkJCQkJICAgJnNraXBfbm9ubmF0aXZlX3Nhb3AsCi0JCQkJCQkJCQkJCQkgICBOVUxMKSk7 Ci0JfQorCQkJCQkJCQkgICAmc2tpcF9ub25uYXRpdmVfc2FvcCk7CiAKIAkvKgogCSAqIFN1Ym1p dCBhbGwgdGhlIG9uZXMgdGhhdCBjYW4gZm9ybSBwbGFpbiBJbmRleFNjYW4gcGxhbnMgdG8gYWRk X3BhdGguIChBCkBAIC03ODQsNyArNzYxLDYgQEAgZ2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZv ICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJCQkgICBpbmRleCwgY2xhdXNlcywKIAkJ CQkJCQkJCSAgIGZhbHNlLAogCQkJCQkJCQkJICAgU1RfQklUTUFQU0NBTiwKLQkJCQkJCQkJCSAg IE5VTEwsCiAJCQkJCQkJCQkgICBOVUxMKTsKIAkJKmJpdGluZGV4cGF0aHMgPSBsaXN0X2NvbmNh dCgqYml0aW5kZXhwYXRocywgaW5kZXhwYXRocyk7CiAJfQpAQCAtODE3LDI3ICs3OTMsMTkgQEAg Z2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAgKiB0 byB0cnVlIGlmIHdlIGZvdW5kIGFueSBzdWNoIGNsYXVzZXMgKGNhbGxlciBtdXN0IGluaXRpYWxp emUgdGhlIHZhcmlhYmxlCiAgKiB0byBmYWxzZSkuICBJZiBpdCdzIE5VTEwsIHdlIGRvIG5vdCBp Z25vcmUgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcy4KICAqCi0gKiBJZiBza2lwX2xvd2VyX3Nh b3AgaXMgbm9uLU5VTEwsIHdlIGlnbm9yZSBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzIGZvcgot ICogbm9uLWZpcnN0IGluZGV4IGNvbHVtbnMsIGFuZCB3ZSBzZXQgKnNraXBfbG93ZXJfc2FvcCB0 byB0cnVlIGlmIHdlIGZvdW5kCi0gKiBhbnkgc3VjaCBjbGF1c2VzIChjYWxsZXIgbXVzdCBpbml0 aWFsaXplIHRoZSB2YXJpYWJsZSB0byBmYWxzZSkuICBJZiBpdCdzCi0gKiBOVUxMLCB3ZSBkbyBu b3QgaWdub3JlIG5vbi1maXJzdCBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzLCBidXQgdGhleSB3 aWxsCi0gKiByZXN1bHQgaW4gY29uc2lkZXJpbmcgdGhlIHNjYW4ncyBvdXRwdXQgdG8gYmUgdW5v cmRlcmVkLgotICoKICAqICdyZWwnIGlzIHRoZSBpbmRleCdzIGhlYXAgcmVsYXRpb24KICAqICdp bmRleCcgaXMgdGhlIGluZGV4IGZvciB3aGljaCB3ZSB3YW50IHRvIGdlbmVyYXRlIHBhdGhzCiAg KiAnY2xhdXNlcycgaXMgdGhlIGNvbGxlY3Rpb24gb2YgaW5kZXhhYmxlIGNsYXVzZXMgKEluZGV4 Q2xhdXNlIG5vZGVzKQogICogJ3VzZWZ1bF9wcmVkaWNhdGUnIGluZGljYXRlcyB3aGV0aGVyIHRo ZSBpbmRleCBoYXMgYSB1c2VmdWwgcHJlZGljYXRlCiAgKiAnc2NhbnR5cGUnIGluZGljYXRlcyB3 aGV0aGVyIHdlIG5lZWQgcGxhaW4gb3IgYml0bWFwIHNjYW4gc3VwcG9ydAogICogJ3NraXBfbm9u bmF0aXZlX3Nhb3AnIGluZGljYXRlcyB3aGV0aGVyIHRvIGFjY2VwdCBTQU9QIGlmIGluZGV4IEFN IGRvZXNuJ3QKLSAqICdza2lwX2xvd2VyX3Nhb3AnIGluZGljYXRlcyB3aGV0aGVyIHRvIGFjY2Vw dCBub24tZmlyc3QtY29sdW1uIFNBT1AKICAqLwogc3RhdGljIExpc3QgKgogYnVpbGRfaW5kZXhf cGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkgIEluZGV4T3B0 SW5mbyAqaW5kZXgsIEluZGV4Q2xhdXNlU2V0ICpjbGF1c2VzLAogCQkJCSAgYm9vbCB1c2VmdWxf cHJlZGljYXRlLAogCQkJCSAgU2NhblR5cGVDb250cm9sIHNjYW50eXBlLAotCQkJCSAgYm9vbCAq c2tpcF9ub25uYXRpdmVfc2FvcCwKLQkJCQkgIGJvb2wgKnNraXBfbG93ZXJfc2FvcCkKKwkJCQkg IGJvb2wgKnNraXBfbm9ubmF0aXZlX3Nhb3ApCiB7CiAJTGlzdAkgICAqcmVzdWx0ID0gTklMOwog CUluZGV4UGF0aCAgKmlwYXRoOwpAQCAtODQ4LDcgKzgxNiw2IEBAIGJ1aWxkX2luZGV4X3BhdGhz KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJTGlzdAkgICAqb3JkZXJieWNs YXVzZWNvbHM7CiAJTGlzdAkgICAqaW5kZXhfcGF0aGtleXM7CiAJTGlzdAkgICAqdXNlZnVsX3Bh dGhrZXlzOwotCWJvb2wJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlOwogCWJvb2wJCXBhdGhrZXlz X3Bvc3NpYmx5X3VzZWZ1bDsKIAlib29sCQlpbmRleF9pc19vcmRlcmVkOwogCWJvb2wJCWluZGV4 X29ubHlfc2NhbjsKQEAgLTg4MCwxOSArODQ3LDExIEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJICogb24gYnkgYnRyZWUgYW5kIHBvc3Np Ymx5IG90aGVyIHBsYWNlcy4pICBUaGUgbGlzdCBjYW4gYmUgZW1wdHksIGlmIHRoZQogCSAqIGlu ZGV4IEFNIGFsbG93cyB0aGF0LgogCSAqCi0JICogZm91bmRfbG93ZXJfc2FvcF9jbGF1c2UgaXMg c2V0IHRydWUgaWYgd2UgYWNjZXB0IGEgU2NhbGFyQXJyYXlPcEV4cHIKLQkgKiBpbmRleCBjbGF1 c2UgZm9yIGEgbm9uLWZpcnN0IGluZGV4IGNvbHVtbi4gIFRoaXMgcHJldmVudHMgdXMgZnJvbQot CSAqIGFzc3VtaW5nIHRoYXQgdGhlIHNjYW4gcmVzdWx0IGlzIG9yZGVyZWQuICAoQWN0dWFsbHks IHRoZSByZXN1bHQgaXMKLQkgKiBzdGlsbCBvcmRlcmVkIGlmIHRoZXJlIGFyZSBlcXVhbGl0eSBj b25zdHJhaW50cyBmb3IgYWxsIGVhcmxpZXIKLQkgKiBjb2x1bW5zLCBidXQgaXQgc2VlbXMgdG9v IGV4cGVuc2l2ZSBhbmQgbm9uLW1vZHVsYXIgZm9yIHRoaXMgY29kZSB0byBiZQotCSAqIGF3YXJl IG9mIHRoYXQgcmVmaW5lbWVudC4pCi0JICoKIAkgKiBXZSBhbHNvIGJ1aWxkIGEgUmVsaWRzIHNl dCBzaG93aW5nIHdoaWNoIG91dGVyIHJlbHMgYXJlIHJlcXVpcmVkIGJ5IHRoZQogCSAqIHNlbGVj dGVkIGNsYXVzZXMuICBBbnkgbGF0ZXJhbF9yZWxpZHMgYXJlIGluY2x1ZGVkIGluIHRoYXQsIGJ1 dCBub3QKIAkgKiBvdGhlcndpc2UgYWNjb3VudGVkIGZvci4KIAkgKi8KIAlpbmRleF9jbGF1c2Vz ID0gTklMOwotCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlID0gZmFsc2U7CiAJb3V0ZXJfcmVsaWRz ID0gYm1zX2NvcHkocmVsLT5sYXRlcmFsX3JlbGlkcyk7CiAJZm9yIChpbmRleGNvbCA9IDA7IGlu ZGV4Y29sIDwgaW5kZXgtPm5rZXljb2x1bW5zOyBpbmRleGNvbCsrKQogCXsKQEAgLTkxNywxNiAr ODc2LDYgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAkJCQkJLyogQ2FsbGVyIGhhZCBiZXR0ZXIgaW50ZW5kIHRoaXMgb25seSBmb3IgYml0 bWFwIHNjYW4gKi8KIAkJCQkJQXNzZXJ0KHNjYW50eXBlID09IFNUX0JJVE1BUFNDQU4pOwogCQkJ CX0KLQkJCQlpZiAoaW5kZXhjb2wgPiAwKQotCQkJCXsKLQkJCQkJaWYgKHNraXBfbG93ZXJfc2Fv cCkKLQkJCQkJewotCQkJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCB0byBsb3NlIGluZGV4IG9y ZGVyaW5nICovCi0JCQkJCQkqc2tpcF9sb3dlcl9zYW9wID0gdHJ1ZTsKLQkJCQkJCWNvbnRpbnVl OwotCQkJCQl9Ci0JCQkJCWZvdW5kX2xvd2VyX3Nhb3BfY2xhdXNlID0gdHJ1ZTsKLQkJCQl9CiAJ CQl9CiAKIAkJCS8qIE9LIHRvIGluY2x1ZGUgdGhpcyBjbGF1c2UgKi8KQEAgLTk1NiwxMSArOTA1 LDkgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJl bCwKIAkvKgogCSAqIDIuIENvbXB1dGUgcGF0aGtleXMgZGVzY3JpYmluZyBpbmRleCdzIG9yZGVy aW5nLCBpZiBhbnksIHRoZW4gc2VlIGhvdwogCSAqIG1hbnkgb2YgdGhlbSBhcmUgYWN0dWFsbHkg dXNlZnVsIGZvciB0aGlzIHF1ZXJ5LiAgVGhpcyBpcyBub3QgcmVsZXZhbnQKLQkgKiBpZiB3ZSBh cmUgb25seSB0cnlpbmcgdG8gYnVpbGQgYml0bWFwIGluZGV4c2NhbnMsIG5vciBpZiB3ZSBoYXZl IHRvCi0JICogYXNzdW1lIHRoZSBzY2FuIGlzIHVub3JkZXJlZC4KKwkgKiBpZiB3ZSBhcmUgb25s eSB0cnlpbmcgdG8gYnVpbGQgYml0bWFwIGluZGV4c2NhbnMuCiAJICovCiAJcGF0aGtleXNfcG9z c2libHlfdXNlZnVsID0gKHNjYW50eXBlICE9IFNUX0JJVE1BUFNDQU4gJiYKLQkJCQkJCQkJIWZv dW5kX2xvd2VyX3Nhb3BfY2xhdXNlICYmCiAJCQkJCQkJCWhhc191c2VmdWxfcGF0aGtleXMocm9v dCwgcmVsKSk7CiAJaW5kZXhfaXNfb3JkZXJlZCA9IChpbmRleC0+c29ydG9wZmFtaWx5ICE9IE5V TEwpOwogCWlmIChpbmRleF9pc19vcmRlcmVkICYmIHBhdGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bCkK QEAgLTEyMTIsNyArMTE1OSw2IEBAIGJ1aWxkX3BhdGhzX2Zvcl9PUihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJICAgaW5kZXgsICZjbGF1c2VzZXQsCiAJCQkJ CQkJCQkgICB1c2VmdWxfcHJlZGljYXRlLAogCQkJCQkJCQkJICAgU1RfQklUTUFQU0NBTiwKLQkJ CQkJCQkJCSAgIE5VTEwsCiAJCQkJCQkJCQkgICBOVUxMKTsKIAkJcmVzdWx0ID0gbGlzdF9jb25j YXQocmVzdWx0LCBpbmRleHBhdGhzKTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4 IGM0ZmNkMDA3Ni4uYzc5NmI1M2E2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQv c2VsZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYwpAQCAtNjQ0 NCw4ICs2NDQ0LDYgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAlk b3VibGUJCW51bUluZGV4VHVwbGVzOwogCWRvdWJsZQkJc3BjX3JhbmRvbV9wYWdlX2Nvc3Q7CiAJ ZG91YmxlCQludW1fc2Ffc2NhbnM7Ci0JZG91YmxlCQludW1fb3V0ZXJfc2NhbnM7Ci0JZG91Ymxl CQludW1fc2NhbnM7CiAJZG91YmxlCQlxdWFsX29wX2Nvc3Q7CiAJZG91YmxlCQlxdWFsX2FyZ19j b3N0OwogCUxpc3QJICAgKnNlbGVjdGl2aXR5UXVhbHM7CkBAIC02NDYwLDcgKzY0NTgsNyBAQCBn ZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCiAJLyoKIAkgKiBDaGVjayBm b3IgU2NhbGFyQXJyYXlPcEV4cHIgaW5kZXggcXVhbHMsIGFuZCBlc3RpbWF0ZSB0aGUgbnVtYmVy IG9mCi0JICogaW5kZXggc2NhbnMgdGhhdCB3aWxsIGJlIHBlcmZvcm1lZC4KKwkgKiBwcmltaXRp dmUgaW5kZXggc2NhbnMgdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBmb3IgY2FsbGVyCiAJICovCiAJ bnVtX3NhX3NjYW5zID0gMTsKIAlmb3JlYWNoKGwsIGluZGV4UXVhbHMpCkBAIC02NDkwLDE5ICs2 NDg4LDggQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlu dW1JbmRleFR1cGxlcyA9IGNvc3RzLT5udW1JbmRleFR1cGxlczsKIAlpZiAobnVtSW5kZXhUdXBs ZXMgPD0gMC4wKQotCXsKIAkJbnVtSW5kZXhUdXBsZXMgPSBpbmRleFNlbGVjdGl2aXR5ICogaW5k ZXgtPnJlbC0+dHVwbGVzOwogCi0JCS8qCi0JCSAqIFRoZSBhYm92ZSBjYWxjdWxhdGlvbiBjb3Vu dHMgYWxsIHRoZSB0dXBsZXMgdmlzaXRlZCBhY3Jvc3MgYWxsCi0JCSAqIHNjYW5zIGluZHVjZWQg YnkgU2NhbGFyQXJyYXlPcEV4cHIgbm9kZXMuICBXZSB3YW50IHRvIGNvbnNpZGVyIHRoZQotCQkg KiBhdmVyYWdlIHBlci1pbmRleHNjYW4gbnVtYmVyLCBzbyBhZGp1c3QuICBUaGlzIGlzIGEgaGFu ZHkgcGxhY2UgdG8KLQkJICogcm91bmQgdG8gaW50ZWdlciwgdG9vLiAgKElmIGNhbGxlciBzdXBw bGllZCB0dXBsZSBlc3RpbWF0ZSwgaXQncwotCQkgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcg dGhlc2UgY29uc2lkZXJhdGlvbnMuKQotCQkgKi8KLQkJbnVtSW5kZXhUdXBsZXMgPSByaW50KG51 bUluZGV4VHVwbGVzIC8gbnVtX3NhX3NjYW5zKTsKLQl9Ci0KIAkvKgogCSAqIFdlIGNhbiBib3Vu ZCB0aGUgbnVtYmVyIG9mIHR1cGxlcyBieSB0aGUgaW5kZXggc2l6ZSBpbiBhbnkgY2FzZS4gQWxz bywKIAkgKiBhbHdheXMgZXN0aW1hdGUgYXQgbGVhc3Qgb25lIHR1cGxlIGlzIHRvdWNoZWQsIGV2 ZW4gd2hlbgpAQCAtNjU0MCwyNyArNjUyNywzMSBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5u ZXJJbmZvICpyb290LAogCSAqCiAJICogVGhlIGFib3ZlIGNhbGN1bGF0aW9ucyBhcmUgYWxsIHBl ci1pbmRleC1zY2FuLiAgSG93ZXZlciwgaWYgd2UgYXJlIGluIGEKIAkgKiBuZXN0bG9vcCBpbm5l ciBzY2FuLCB3ZSBjYW4gZXhwZWN0IHRoZSBzY2FuIHRvIGJlIHJlcGVhdGVkICh3aXRoCi0JICog ZGlmZmVyZW50IHNlYXJjaCBrZXlzKSBmb3IgZWFjaCByb3cgb2YgdGhlIG91dGVyIHJlbGF0aW9u LiAgTGlrZXdpc2UsCi0JICogU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgcmVzdWx0IGluIG11bHRp cGxlIGluZGV4IHNjYW5zLiAgVGhpcyBjcmVhdGVzCi0JICogdGhlIHBvdGVudGlhbCBmb3IgY2Fj aGUgZWZmZWN0cyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkaXNrIHBhZ2UKLQkgKiBmZXRjaGVz IG5lZWRlZC4gIFdlIHdhbnQgdG8gZXN0aW1hdGUgdGhlIGF2ZXJhZ2UgcGVyLXNjYW4gSS9PIGNv c3QgaW4KLQkgKiB0aGUgcHJlc2VuY2Ugb2YgY2FjaGluZy4KKwkgKiBkaWZmZXJlbnQgc2VhcmNo IGtleXMpIGZvciBlYWNoIHJvdyBvZiB0aGUgb3V0ZXIgcmVsYXRpb24uICBUaGlzCisJICogY3Jl YXRlcyB0aGUgcG90ZW50aWFsIGZvciBjYWNoZSBlZmZlY3RzIHRvIHJlZHVjZSB0aGUgbnVtYmVy IG9mIGRpc2sKKwkgKiBwYWdlIGZldGNoZXMgbmVlZGVkLiAgV2Ugd2FudCB0byBlc3RpbWF0ZSB0 aGUgYXZlcmFnZSBwZXItc2NhbiBJL08gY29zdAorCSAqIGluIHRoZSBwcmVzZW5jZSBvZiBjYWNo aW5nLgogCSAqCiAJICogV2UgdXNlIHRoZSBNYWNrZXJ0LUxvaG1hbiBmb3JtdWxhIChzZWUgY29z dHNpemUuYyBmb3IgZGV0YWlscykgdG8KIAkgKiBlc3RpbWF0ZSB0aGUgdG90YWwgbnVtYmVyIG9m IHBhZ2UgZmV0Y2hlcyB0aGF0IG9jY3VyLiAgV2hpbGUgdGhpcwogCSAqIHdhc24ndCB3aGF0IGl0 IHdhcyBkZXNpZ25lZCBmb3IsIGl0IHNlZW1zIGEgcmVhc29uYWJsZSBtb2RlbCBhbnl3YXkuCiAJ ICogTm90ZSB0aGF0IHdlIGFyZSBjb3VudGluZyBwYWdlcyBub3QgdHVwbGVzIGFueW1vcmUsIHNv IHdlIHRha2UgTiA9IFQgPQogCSAqIGluZGV4IHNpemUsIGFzIGlmIHRoZXJlIHdlcmUgb25lICJ0 dXBsZSIgcGVyIHBhZ2UuCisJICoKKwkgKiBOb3RlOiB3ZSBhc3N1bWUgdGhhdCB0aGVyZSB3aWxs IGJlIG5vIHJlcGVhdCBpbmRleCBwYWdlIGZldGNoZXMgYWNyb3NzCisJICogU2NhbGFyQXJyYXlP cEV4cHIgcHJpbWl0aXZlIHNjYW5zIGZyb20gdGhlIHNhbWUgbG9naWNhbCBpbmRleCBzY2FuLgor CSAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB0cnVlIGZvciBidHJlZSBpbmRleGVzLCBidXQg aXMgdmVyeSBvcHRpbWlzdGljCisJICogd2l0aCBpbmRleCBBTXMgdGhhdCBjYW5ub3QgbmF0aXZl bHkgZXhlY3V0ZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscy4KKwkgKiBIb3dldmVyLCB0aGVzZSBz YW1lIGluZGV4IEFNcyBhbHNvIGFjY2VwdCBvdXIgZGVmYXVsdCBwZXNzaW1pc3RpYworCSAqIGFw cHJvYWNoIHRvIGNvdW50aW5nIG51bV9zYV9zY2FucyAoYnRyZWUgY2FsbGVyIGNhcHMgdGhpcyks IHNvIHdlIGRvbid0CisJICogZXhwZWN0IHRoZSBmaW5hbCBpbmRleFRvdGFsQ29zdCB0byBiZSB3 aWxkbHkgb3Zlci1vcHRpbWlzdGljLgogCSAqLwotCW51bV9vdXRlcl9zY2FucyA9IGxvb3BfY291 bnQ7Ci0JbnVtX3NjYW5zID0gbnVtX3NhX3NjYW5zICogbnVtX291dGVyX3NjYW5zOwotCi0JaWYg KG51bV9zY2FucyA+IDEpCisJaWYgKGxvb3BfY291bnQgPiAxKQogCXsKIAkJZG91YmxlCQlwYWdl c19mZXRjaGVkOwogCiAJCS8qIHRvdGFsIHBhZ2UgZmV0Y2hlcyBpZ25vcmluZyBjYWNoZSBlZmZl Y3RzICovCi0JCXBhZ2VzX2ZldGNoZWQgPSBudW1JbmRleFBhZ2VzICogbnVtX3NjYW5zOworCQlw YWdlc19mZXRjaGVkID0gbnVtSW5kZXhQYWdlcyAqIGxvb3BfY291bnQ7CiAKIAkJLyogdXNlIE1h Y2tlcnQgYW5kIExvaG1hbiBmb3JtdWxhIHRvIGFkanVzdCBmb3IgY2FjaGUgZWZmZWN0cyAqLwog CQlwYWdlc19mZXRjaGVkID0gaW5kZXhfcGFnZXNfZmV0Y2hlZChwYWdlc19mZXRjaGVkLApAQCAt NjU3MCwxMSArNjU2MSw5IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3Qs CiAKIAkJLyoKIAkJICogTm93IGNvbXB1dGUgdGhlIHRvdGFsIGRpc2sgYWNjZXNzIGNvc3QsIGFu ZCB0aGVuIHJlcG9ydCBhIHByby1yYXRlZAotCQkgKiBzaGFyZSBmb3IgZWFjaCBvdXRlciBzY2Fu LiAgKERvbid0IHByby1yYXRlIGZvciBTY2FsYXJBcnJheU9wRXhwciwKLQkJICogc2luY2UgdGhh dCdzIGludGVybmFsIHRvIHRoZSBpbmRleHNjYW4uKQorCQkgKiBzaGFyZSBmb3IgZWFjaCBvdXRl ciBzY2FuCiAJCSAqLwotCQlpbmRleFRvdGFsQ29zdCA9IChwYWdlc19mZXRjaGVkICogc3BjX3Jh bmRvbV9wYWdlX2Nvc3QpCi0JCQkvIG51bV9vdXRlcl9zY2FuczsKKwkJaW5kZXhUb3RhbENvc3Qg PSAocGFnZXNfZmV0Y2hlZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0KSAvIGxvb3BfY291bnQ7CiAJ fQogCWVsc2UKIAl7CkBAIC02NTkwLDEwICs2NTc5LDggQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQ bGFubmVySW5mbyAqcm9vdCwKIAkgKiBldmFsdWF0ZWQgb25jZSBhdCB0aGUgc3RhcnQgb2YgdGhl IHNjYW4gdG8gcmVkdWNlIHRoZW0gdG8gcnVudGltZSBrZXlzCiAJICogdG8gcGFzcyB0byB0aGUg aW5kZXggQU0gKHNlZSBub2RlSW5kZXhzY2FuLmMpLiAgV2UgbW9kZWwgdGhlIHBlci10dXBsZQog CSAqIENQVSBjb3N0cyBhcyBjcHVfaW5kZXhfdHVwbGVfY29zdCBwbHVzIG9uZSBjcHVfb3BlcmF0 b3JfY29zdCBwZXIKLQkgKiBpbmRleHF1YWwgb3BlcmF0b3IuICBCZWNhdXNlIHdlIGhhdmUgbnVt SW5kZXhUdXBsZXMgYXMgYSBwZXItc2NhbgotCSAqIG51bWJlciwgd2UgaGF2ZSB0byBtdWx0aXBs eSBieSBudW1fc2Ffc2NhbnMgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdAotCSAqIGZvciBTY2Fs YXJBcnJheU9wRXhwciBjYXNlcy4gIFNpbWlsYXJseSBhZGQgaW4gY29zdHMgZm9yIGFueSBpbmRl eAotCSAqIE9SREVSIEJZIGV4cHJlc3Npb25zLgorCSAqIGluZGV4cXVhbCBvcGVyYXRvci4gIFNp bWlsYXJseSBhZGQgaW4gY29zdHMgZm9yIGFueSBpbmRleCBPUkRFUiBCWQorCSAqIGV4cHJlc3Np b25zLgogCSAqCiAJICogTm90ZTogdGhpcyBuZWdsZWN0cyB0aGUgcG9zc2libGUgY29zdHMgb2Yg cmVjaGVja2luZyBsb3NzeSBvcGVyYXRvcnMuCiAJICogRGV0ZWN0aW5nIHRoYXQgdGhhdCBtaWdo dCBiZSBuZWVkZWQgc2VlbXMgbW9yZSBleHBlbnNpdmUgdGhhbiBpdCdzCkBAIC02NjA2LDcgKzY1 OTMsNyBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LAogCiAJaW5kZXhT dGFydHVwQ29zdCA9IHF1YWxfYXJnX2Nvc3Q7CiAJaW5kZXhUb3RhbENvc3QgKz0gcXVhbF9hcmdf Y29zdDsKLQlpbmRleFRvdGFsQ29zdCArPSBudW1JbmRleFR1cGxlcyAqIG51bV9zYV9zY2FucyAq IChjcHVfaW5kZXhfdHVwbGVfY29zdCArIHF1YWxfb3BfY29zdCk7CisJaW5kZXhUb3RhbENvc3Qg Kz0gbnVtSW5kZXhUdXBsZXMgKiAoY3B1X2luZGV4X3R1cGxlX2Nvc3QgKyBxdWFsX29wX2Nvc3Qp OwogCiAJLyoKIAkgKiBHZW5lcmljIGFzc3VtcHRpb24gYWJvdXQgaW5kZXggY29ycmVsYXRpb246 IHRoZXJlIGlzbid0IGFueS4KQEAgLTY2ODQsNyArNjY3MSw2IEBAIGJ0Y29zdGVzdGltYXRlKFBs YW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCWJv b2wJCWVxUXVhbEhlcmU7CiAJYm9vbAkJZm91bmRfc2FvcDsKIAlib29sCQlmb3VuZF9pc19udWxs X29wOwotCWRvdWJsZQkJbnVtX3NhX3NjYW5zOwogCUxpc3RDZWxsICAgKmxjOwogCiAJLyoKQEAg LTY2OTksMTcgKzY2ODUsMTIgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIElu ZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICoKIAkgKiBGb3IgYSBSb3dDb21w YXJlRXhwciwgd2UgY29uc2lkZXIgb25seSB0aGUgZmlyc3QgY29sdW1uLCBqdXN0IGFzCiAJICog cm93Y29tcGFyZXNlbCgpIGRvZXMuCi0JICoKLQkgKiBJZiB0aGVyZSdzIGEgU2NhbGFyQXJyYXlP cEV4cHIgaW4gdGhlIHF1YWxzLCB3ZSdsbCBhY3R1YWxseSBwZXJmb3JtIE4KLQkgKiBpbmRleCBz Y2FucyBub3Qgb25lLCBidXQgdGhlIFNjYWxhckFycmF5T3BFeHByJ3Mgb3BlcmF0b3IgY2FuIGJl Ci0JICogY29uc2lkZXJlZCB0byBhY3QgdGhlIHNhbWUgYXMgaXQgbm9ybWFsbHkgZG9lcy4KIAkg Ki8KIAlpbmRleEJvdW5kUXVhbHMgPSBOSUw7CiAJaW5kZXhjb2wgPSAwOwogCWVxUXVhbEhlcmUg PSBmYWxzZTsKIAlmb3VuZF9zYW9wID0gZmFsc2U7CiAJZm91bmRfaXNfbnVsbF9vcCA9IGZhbHNl OwotCW51bV9zYV9zY2FucyA9IDE7CiAJZm9yZWFjaChsYywgcGF0aC0+aW5kZXhjbGF1c2VzKQog CXsKIAkJSW5kZXhDbGF1c2UgKmljbGF1c2UgPSBsZmlyc3Rfbm9kZShJbmRleENsYXVzZSwgbGMp OwpAQCAtNjc0OSwxNCArNjczMCw5IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290 LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCQkJZWxzZSBpZiAoSXNBKGNs YXVzZSwgU2NhbGFyQXJyYXlPcEV4cHIpKQogCQkJewogCQkJCVNjYWxhckFycmF5T3BFeHByICpz YW9wID0gKFNjYWxhckFycmF5T3BFeHByICopIGNsYXVzZTsKLQkJCQlOb2RlCSAgICpvdGhlcl9v cGVyYW5kID0gKE5vZGUgKikgbHNlY29uZChzYW9wLT5hcmdzKTsKLQkJCQlpbnQJCQlhbGVuZ3Ro ID0gZXN0aW1hdGVfYXJyYXlfbGVuZ3RoKG90aGVyX29wZXJhbmQpOwogCiAJCQkJY2xhdXNlX29w ID0gc2FvcC0+b3BubzsKIAkJCQlmb3VuZF9zYW9wID0gdHJ1ZTsKLQkJCQkvKiBjb3VudCBudW1i ZXIgb2YgU0Egc2NhbnMgaW5kdWNlZCBieSBpbmRleEJvdW5kUXVhbHMgb25seSAqLwotCQkJCWlm IChhbGVuZ3RoID4gMSkKLQkJCQkJbnVtX3NhX3NjYW5zICo9IGFsZW5ndGg7CiAJCQl9CiAJCQll bHNlIGlmIChJc0EoY2xhdXNlLCBOdWxsVGVzdCkpCiAJCQl7CkBAIC02ODA1LDkgKzY3ODEsOSBA QCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3Vi bGUgbG9vcF9jb3VudCwKIAkJU2VsZWN0aXZpdHkgYnRyZWVTZWxlY3Rpdml0eTsKIAogCQkvKgot CQkgKiBJZiB0aGUgaW5kZXggaXMgcGFydGlhbCwgQU5EIHRoZSBpbmRleCBwcmVkaWNhdGUgd2l0 aCB0aGUKLQkJICogaW5kZXgtYm91bmQgcXVhbHMgdG8gcHJvZHVjZSBhIG1vcmUgYWNjdXJhdGUg aWRlYSBvZiB0aGUgbnVtYmVyIG9mCi0JCSAqIHJvd3MgY292ZXJlZCBieSB0aGUgYm91bmQgY29u ZGl0aW9ucy4KKwkJICogQU5EIHRoZSBpbmRleCBwcmVkaWNhdGUgd2l0aCB0aGUgaW5kZXgtYm91 bmQgcXVhbHMgdG8gcHJvZHVjZSBhCisJCSAqIG1vcmUgYWNjdXJhdGUgaWRlYSBvZiB0aGUgbnVt YmVyIG9mIHJvd3MgY292ZXJlZCBieSB0aGUgYm91bmQKKwkJICogY29uZGl0aW9ucwogCQkgKi8K IAkJc2VsZWN0aXZpdHlRdWFscyA9IGFkZF9wcmVkaWNhdGVfdG9faW5kZXhfcXVhbHMoaW5kZXgs IGluZGV4Qm91bmRRdWFscyk7CiAKQEAgLTY4MTYsMTMgKzY3OTIsNiBAQCBidGNvc3Rlc3RpbWF0 ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwK IAkJCQkJCQkJCQkJCSAgSk9JTl9JTk5FUiwKIAkJCQkJCQkJCQkJCSAgTlVMTCk7CiAJCW51bUlu ZGV4VHVwbGVzID0gYnRyZWVTZWxlY3Rpdml0eSAqIGluZGV4LT5yZWwtPnR1cGxlczsKLQotCQkv KgotCQkgKiBBcyBpbiBnZW5lcmljY29zdGVzdGltYXRlKCksIHdlIGhhdmUgdG8gYWRqdXN0IGZv ciBhbnkKLQkJICogU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgaW5jbHVkZWQgaW4gaW5kZXhCb3Vu ZFF1YWxzLCBhbmQgdGhlbiByb3VuZAotCQkgKiB0byBpbnRlZ2VyLgotCQkgKi8KLQkJbnVtSW5k ZXhUdXBsZXMgPSByaW50KG51bUluZGV4VHVwbGVzIC8gbnVtX3NhX3NjYW5zKTsKIAl9CiAKIAkv KgpAQCAtNjgzMiw2ICs2ODAxLDQzIEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290 LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCiAJZ2VuZXJpY2Nvc3Rlc3Rp bWF0ZShyb290LCBwYXRoLCBsb29wX2NvdW50LCAmY29zdHMpOwogCisJLyoKKwkgKiBOb3cgY29t cGVuc2F0ZSBmb3IgYnRyZWUncyBhYmlsaXR5IHRvIGVmZmljaWVudGx5IGV4ZWN1dGUgc2NhbnMg d2l0aAorCSAqIFNBT1AgY2xhdXNlcy4KKwkgKgorCSAqIGJ0cmVlIGF1dG9tYXRpY2FsbHkgY29t YmluZXMgaW5kaXZpZHVhbCBTY2FsYXJBcnJheU9wRXhwciBwcmltaXRpdmUKKwkgKiBpbmRleCBz Y2FucyB3aGVuZXZlciB0aGUgdHVwbGVzIGNvdmVyZWQgYnkgdGhlIG5leHQgc2V0IG9mIGFycmF5 IGtleXMKKwkgKiBhcmUgY2xvc2UgdG8gdHVwbGVzIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgc2V0 LiAgVGhpcyBtYWtlcyB0aGUgZmluYWwKKwkgKiBudW1iZXIgb2YgZGVzY2VudHMgcGFydGljdWxh cmx5IGRpZmZpY3VsdCB0byBlc3RpbWF0ZS4gIEhvd2V2ZXIsIGJ0cmVlCisJICogc2NhbnMgbmV2 ZXIgdmlzaXQgYW55IHNpbmdsZSBsZWFmIHBhZ2UgbW9yZSB0aGFuIG9uY2UuICBUaGF0IHB1dHMg YQorCSAqIG5hdHVyYWwgZmxvb3IgdW5kZXIgdGhlIHdvcnN0IGNhc2UgbnVtYmVyIG9mIGRlc2Nl bnRzLgorCSAqCisJICogSXQncyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRoYXQgd2Ugbm90IHdp bGRseSBvdmVyZXN0aW1hdGUgdGhlIG51bWJlcgorCSAqIG9mIGRlc2NlbnRzIG5lZWRlZCBmb3Ig YSBjbGF1c2UgbGlzdCB3aXRoIHNldmVyYWwgU0FPUHMgLS0gdGhlIGNvc3RzCisJICogcmVhbGx5 IGFyZW4ndCBtdWx0aXBsaWNhdGl2ZSBpbiB0aGUgd2F5IGdlbmVyaWNjb3N0ZXN0aW1hdGUgZXhw ZWN0cy4gSW4KKwkgKiBnZW5lcmFsLCBtb3N0IGRpc3RpbmN0IGNvbWJpbmF0aW9ucyBvZiBTQU9Q IGtleXMgd2lsbCB0ZW5kIHRvIG5vdCBmaW5kCisJICogYW55IG1hdGNoaW5nIHR1cGxlcy4gIEZ1 cnRoZXJtb3JlLCBidHJlZSBzY2FucyBzZWFyY2ggZm9yIHRoZSBuZXh0IHNldAorCSAqIG9mIGFy cmF5IGtleXMgdXNpbmcgdGhlIG5leHQgdHVwbGUgaW4gbGluZSwgYW5kIHNvIHdvbid0IGV2ZW4g bmVlZCBhCisJICogZGlyZWN0IGNvbXBhcmlzb24gdG8gZWxpbWluYXRlIG1vc3Qgbm9uLW1hdGNo aW5nIHNldHMgb2YgYXJyYXkga2V5cy4KKwkgKgorCSAqIENsYW1wIHRoZSBudW1iZXIgb2YgZGVz Y2VudHMgdG8gdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgbGVhZiBwYWdlCisJICogdmlzaXRzLiAg VGhpcyBpcyBzdGlsbCBmYWlybHkgcGVzc2ltaXN0aWMsIGJ1dCB0ZW5kcyB0byByZXN1bHQgaW4g bW9yZQorCSAqIGFjY3VyYXRlIGNvc3Rpbmcgb2Ygc2NhbnMgd2l0aCBzZXZlcmFsIFNBT1AgY2xh dXNlcyAtLSBlc3BlY2lhbGx5IHdoZW4KKwkgKiBlYWNoIGFycmF5IGhhcyBtb3JlIHRoYW4gYSBm ZXcgZWxlbWVudHMuICBUaGUgY29zdCBvZiBhZGRpbmcgYWRkaXRpb25hbAorCSAqIGFycmF5IGNv bnN0YW50cyB0byBhIGxvdy1vcmRlciBTQU9QIGNvbHVtbiBzaG91bGQgc2F0dXJhdGUgcGFzdCBh CisJICogY2VydGFpbiBwb2ludCAoZXhjZXB0IHdoZXJlIHNlbGVjdGl2aXR5IGVzdGltYXRlcyBj b250aW51ZSB0byBzaGlmdCkuCisJICoKKwkgKiBBbHNvIGNsYW1wIHRoZSBudW1iZXIgb2YgZGVz Y2VudHMgdG8gMS8zIHRoZSBudW1iZXIgb2YgaW5kZXggcGFnZXMuCisJICogVGhpcyBhdm9pZHMg aW1wbGF1c2libHkgaGlnaCBlc3RpbWF0ZXMgd2l0aCBsb3cgc2VsZWN0aXZpdHkgcGF0aHMsCisJ ICogd2hlcmUgc2NhbnMgZnJlcXVlbnRseSByZXF1aXJlIG5vIG1vcmUgdGhhbiBvbmUgb3IgdHdv IGRlc2NlbnRzLgorCSAqLworCWlmIChjb3N0cy5udW1fc2Ffc2NhbnMgPiAxKQorCXsKKwkJY29z dHMubnVtX3NhX3NjYW5zID0gTWluKGNvc3RzLm51bV9zYV9zY2FucywgY29zdHMubnVtSW5kZXhQ YWdlcyk7CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1pbihjb3N0cy5udW1fc2Ffc2NhbnMsIGlu ZGV4LT5wYWdlcyAvIDMpOworCQljb3N0cy5udW1fc2Ffc2NhbnMgPSBNYXgoY29zdHMubnVtX3Nh X3NjYW5zLCAxKTsKKwl9CisKIAkvKgogCSAqIEFkZCBhIENQVS1jb3N0IGNvbXBvbmVudCB0byBy ZXByZXNlbnQgdGhlIGNvc3RzIG9mIGluaXRpYWwgYnRyZWUKIAkgKiBkZXNjZW50LiAgV2UgZG9u J3QgY2hhcmdlIGFueSBJL08gY29zdCBmb3IgdG91Y2hpbmcgdXBwZXIgYnRyZWUgbGV2ZWxzLApA QCAtNjgzOSw5ICs2ODQ1LDkgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIElu ZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICogY29tcGFyaXNvbnMgdG8gZGVz Y2VuZCBhIGJ0cmVlIG9mIE4gbGVhZiB0dXBsZXMuICBXZSBjaGFyZ2Ugb25lCiAJICogY3B1X29w ZXJhdG9yX2Nvc3QgcGVyIGNvbXBhcmlzb24uCiAJICoKLQkgKiBJZiB0aGVyZSBhcmUgU2NhbGFy QXJyYXlPcEV4cHJzLCBjaGFyZ2UgdGhpcyBvbmNlIHBlciBTQSBzY2FuLiAgVGhlCi0JICogb25l cyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBub3Qgc3RhcnR1cCBjb3N0IHNvIGZhciBhcyB0aGUg b3ZlcmFsbAotCSAqIHBsYW4gaXMgY29uY2VybmVkLCBzbyBhZGQgdGhlbSBvbmx5IHRvICJ0b3Rh bCIgY29zdC4KKwkgKiBJZiB0aGVyZSBhcmUgU2NhbGFyQXJyYXlPcEV4cHJzLCBjaGFyZ2UgdGhp cyBvbmNlIHBlciBlc3RpbWF0ZWQKKwkgKiBwcmltaXRpdmUgU0Egc2Nhbi4gIFRoZSBvbmVzIGFm dGVyIHRoZSBmaXJzdCBvbmUgYXJlIG5vdCBzdGFydHVwIGNvc3QKKwkgKiBzbyBmYXIgYXMgdGhl IG92ZXJhbGwgcGxhbiBnb2VzLCBzbyBqdXN0IGFkZCB0aGVtIHRvICJ0b3RhbCIgY29zdC4KIAkg Ki8KIAlpZiAoaW5kZXgtPnR1cGxlcyA+IDEpCQkvKiBhdm9pZCBjb21wdXRpbmcgbG9nKDApICov CiAJewpAQCAtNjg1OCw3ICs2ODY0LDggQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJv b3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJICogaW4gY2FzZXMgd2hl cmUgb25seSBhIHNpbmdsZSBsZWFmIHBhZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgdmlzaXRlZC4gIFRo aXMKIAkgKiBjb3N0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IHNldCBhdCA1MHggY3B1X29wZXJh dG9yX2Nvc3QgcGVyIHBhZ2UKIAkgKiB0b3VjaGVkLiAgVGhlIG51bWJlciBvZiBzdWNoIHBhZ2Vz IGlzIGJ0cmVlIHRyZWUgaGVpZ2h0IHBsdXMgb25lIChpZSwKLQkgKiB3ZSBjaGFyZ2UgZm9yIHRo ZSBsZWFmIHBhZ2UgdG9vKS4gIEFzIGFib3ZlLCBjaGFyZ2Ugb25jZSBwZXIgU0Egc2Nhbi4KKwkg KiB3ZSBjaGFyZ2UgZm9yIHRoZSBsZWFmIHBhZ2UgdG9vKS4gIEFzIGFib3ZlLCBjaGFyZ2Ugb25j ZSBwZXIgZXN0aW1hdGVkCisJICogcHJpbWl0aXZlIFNBIHNjYW4uCiAJICovCiAJZGVzY2VudENv c3QgPSAoaW5kZXgtPnRyZWVfaGVpZ2h0ICsgMSkgKiBERUZBVUxUX1BBR0VfQ1BVX01VTFRJUExJ RVIgKiBjcHVfb3BlcmF0b3JfY29zdDsKIAljb3N0cy5pbmRleFN0YXJ0dXBDb3N0ICs9IGRlc2Nl bnRDb3N0OwpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbCBiL2RvYy9z cmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKaW5kZXggMTE0OTA5M2E4Li42YTUwNjhjNzIgMTAwNjQ0 Ci0tLSBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL21v bml0b3Jpbmcuc2dtbApAQCAtNDAwNSw2ICs0MDA1LDE5IEBAIGRlc2NyaXB0aW9uIHwgV2FpdGlu ZyBmb3IgYSBuZXdseSBpbml0aWFsaXplZCBXQUwgZmlsZSB0byByZWFjaCBkdXJhYmxlIHN0b3Jh Z2UKICAgIDwvcGFyYT4KICAgPC9ub3RlPgogCisgIDxub3RlPgorICAgPHBhcmE+CisgICAgRXZl cnkgdGltZSBhbiBpbmRleCBpcyBzZWFyY2hlZCwgdGhlIGluZGV4J3MKKyAgICA8c3RydWN0bmFt ZT5wZ19zdGF0X2FsbF9pbmRleGVzPC9zdHJ1Y3RuYW1lPi48c3RydWN0ZmllbGQ+aWR4X3NjYW48 L3N0cnVjdGZpZWxkPgorICAgIGZpZWxkIGlzIGluY3JlbWVudGVkLiAgVGhpcyB1c3VhbGx5IGhh cHBlbnMgb25jZSBwZXIgaW5kZXggc2NhbiBub2RlCisgICAgZXhlY3V0aW9uLCBidXQgbWlnaHQg dGFrZSBwbGFjZSBzZXZlcmFsIHRpbWVzIGR1cmluZyBleGVjdXRpb24gb2YgYSBzY2FuCisgICAg dGhhdCBzZWFyY2hlcyBmb3IgbXVsdGlwbGUgdmFsdWVzIHRvZ2V0aGVyLiAgT25seSBxdWVyaWVz IHRoYXQgdXNlIGNlcnRhaW4KKyAgICA8YWNyb255bT5TUUw8L2Fjcm9ueW0+IGNvbnN0cnVjdHMg dG8gc2VhcmNoIGZvciByb3dzIG1hdGNoaW5nIGFueSB2YWx1ZQorICAgIG91dCBvZiBhIGxpc3Qg KG9yIGFuIGFycmF5KSBvZiBtdWx0aXBsZSBzY2FsYXIgdmFsdWVzIGFyZSBhZmZlY3RlZC4gIFNl ZQorICAgIDx4cmVmIGxpbmtlbmQ9ImZ1bmN0aW9ucy1jb21wYXJpc29ucyIvPiBmb3IgZGV0YWls cy4KKyAgIDwvcGFyYT4KKyAgPC9ub3RlPgorCiAgPC9zZWN0Mj4KIAogIDxzZWN0MiBpZD0ibW9u aXRvcmluZy1wZy1zdGF0aW8tYWxsLXRhYmxlcy12aWV3Ij4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvY3JlYXRlX2luZGV4Lm91dAppbmRleCBhY2ZkOWQxZjQuLjg0YzA2OGFlMyAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4Lm91dApAQCAtMTkxMCw3ICsxOTEw LDcgQEAgU0VMRUNUIGNvdW50KCopIEZST00gZHVwaW5kZXhjb2xzCiAoMSByb3cpCiAKIC0tCi0t LSBDaGVjayBvcmRlcmluZyBvZiA9QU5ZIGluZGV4cXVhbCByZXN1bHRzIChidWcgaW4gOS4yLjAp CistLSBDaGVjayB0aGF0IGluZGV4IHNjYW5zIHdpdGggPUFOWSBpbmRleHF1YWxzIHJldHVybiBy b3dzIGluIGluZGV4IG9yZGVyCiAtLQogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHVuaXF1 ZTEgRlJPTSB0ZW5rMQpAQCAtMTkzNiwxMiArMTkzNiwxMSBAQCBleHBsYWluIChjb3N0cyBvZmYp CiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwg MiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZIHRob3VzYW5kOwotICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgSW5kZXggT25seSBT Y2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCi0gICBJbmRleCBDb25kOiAo dGhvdXNhbmQgPCAyKQotICAgRmlsdGVyOiAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6 OmludGVnZXJbXSkpCi0oMyByb3dzKQorICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA8IDIpIEFO RCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpKQorKDIgcm93cykK IAogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8 IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCkBAIC0xOTUyLDE4ICsxOTUxLDM1IEBAIE9S REVSIEJZIHRob3VzYW5kOwogICAgICAgICAxIHwgICAgIDEwMDEKICgyIHJvd3MpCiAKK2V4cGxh aW4gKGNvc3RzIG9mZikKK1NFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hF UkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhv dXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIEluZGV4IE9ubHkgU2NhbiBCYWNrd2FyZCB1c2luZyB0ZW5r MV90aG91c190ZW50aG91cyBvbiB0ZW5rMQorICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA8IDIp IEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpKQorKDIgcm93 cykKKworU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91c2Fu ZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBERVND LCB0ZW50aG91cyBERVNDOworIHRob3VzYW5kIHwgdGVudGhvdXMgCistLS0tLS0tLS0tKy0tLS0t LS0tLS0KKyAgICAgICAgMSB8ICAgICAxMDAxCisgICAgICAgIDAgfCAgICAgMzAwMAorKDIgcm93 cykKKwogU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuID0gT0ZGOwogZXhwbGFpbiAoY29zdHMgb2Zm KQogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8 IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBCWSB0aG91c2FuZDsKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot IFNvcnQKLSAgIFNvcnQgS2V5OiB0aG91c2FuZAotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGVu azFfdGhvdXNfdGVudGhvdXMgb24gdGVuazEKLSAgICAgICAgIEluZGV4IENvbmQ6ICgodGhvdXNh bmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgnezEwMDEsMzAwMH0nOjppbnRlZ2VyW10pKSkK LSg0IHJvd3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBJbmRleCBTY2FuIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJ bmRleCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMw MDB9Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQogCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3Vz IEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAw MCkKQEAgLTE5NzQsNiArMTk5MCwyNSBAQCBPUkRFUiBCWSB0aG91c2FuZDsKICAgICAgICAgMSB8 ICAgICAxMDAxCiAoMiByb3dzKQogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNh bmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMg SU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBT Y2FuIEJhY2t3YXJkIHVzaW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRl eCBDb25kOiAoKHRob3VzYW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMwMDB9 Jzo6aW50ZWdlcltdKSkpCisoMiByb3dzKQorCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZS T00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkK K09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisgdGhvdXNhbmQgfCB0ZW50 aG91cyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgIDEwMDEKKyAgICAg ICAgMCB8ICAgICAzMDAwCisoMiByb3dzKQorCiBSRVNFVCBlbmFibGVfaW5kZXhvbmx5c2NhbjsK IC0tCiAtLSBDaGVjayBlbGltaW5hdGlvbiBvZiBjb25zdGFudC1OVUxMIHN1YmV4cHJlc3Npb25z CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCBiOTVkMzBmNjUuLjI1ODE1NjM0YyAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC03Nzk1LDEwICs3Nzk1LDkgQEAgd2hl cmUgajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAxIGFuZCBqMi5pZDEgPj0g YW55IChhcnJheVsxLDVdKTsKICAgIE1lcmdlIENvbmQ6IChqMS5pZDEgPSBqMi5pZDEpCiAgICBK b2luIEZpbHRlcjogKGoyLmlkMiA9IGoxLmlkMikKICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGox X2lkMV9pZHggb24gajEKLSAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajJfcGtleSBvbiBq MgorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajJfaWQxX2lkeCBvbiBqMgogICAgICAgICAgSW5k ZXggQ29uZDogKGlkMSA+PSBBTlkgKCd7MSw1fSc6OmludGVnZXJbXSkpCi0gICAgICAgICBGaWx0 ZXI6ICgoaWQxICUgMTAwMCkgPSAxKQotKDcgcm93cykKKyg2IHJvd3MpCiAKIHNlbGVjdCAqIGZy b20gajEKIGlubmVyIGpvaW4gajIgb24gajEuaWQxID0gajIuaWQxIGFuZCBqMS5pZDIgPSBqMi5p ZDIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwgYi9z cmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCmluZGV4IGQ0OWNlOWYzMC4uNDFi OTU1YTI3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3Fs CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKQEAgLTc1Myw3ICs3 NTMsNyBAQCBTRUxFQ1QgY291bnQoKikgRlJPTSBkdXBpbmRleGNvbHMKICAgV0hFUkUgZjEgQkVU V0VFTiAnV0EnIEFORCAnWlpaJyBhbmQgaWQgPCAxMDAwIGFuZCBmMSB+PH4gJ1lYJzsKIAogLS0K LS0tIENoZWNrIG9yZGVyaW5nIG9mID1BTlkgaW5kZXhxdWFsIHJlc3VsdHMgKGJ1ZyBpbiA5LjIu MCkKKy0tIENoZWNrIHRoYXQgaW5kZXggc2NhbnMgd2l0aCA9QU5ZIGluZGV4cXVhbHMgcmV0dXJu IHJvd3MgaW4gaW5kZXggb3JkZXIKIC0tCiAKIGV4cGxhaW4gKGNvc3RzIG9mZikKQEAgLTc3NCw2 ICs3NzQsMTUgQEAgU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0 aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBCWSB0aG91c2Fu ZDsKIAorZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9N IHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitP UkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50aG91cyBERVNDOworCitTRUxFQ1QgdGhvdXNhbmQs IHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4g KDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisKIFNF VCBlbmFibGVfaW5kZXhvbmx5c2NhbiA9IE9GRjsKIAogZXhwbGFpbiAoY29zdHMgb2ZmKQpAQCAt Nzg1LDYgKzc5NCwxNSBAQCBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdI RVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZIHRo b3VzYW5kOwogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3Vz IEZST00gdGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAw MCkKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7CisKK1NFTEVDVCB0aG91 c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91 cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgREVTQywgdGVudGhvdXMgREVTQzsK KwogUkVTRVQgZW5hYmxlX2luZGV4b25seXNjYW47CiAKIC0tCi0tIAoyLjQyLjAKCg== --000000000000fb240f0607c77218--