From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Subject: [RESEND PATCH i-g-t v4 5/5] Add support for hotplug testing with the Chamelium Date: Fri, 20 Jan 2017 13:58:24 -0500 Message-ID: <20170120185824.12692-6-lyude@redhat.com> References: <20170120185824.12692-1-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by gabe.freedesktop.org (Postfix) with ESMTPS id CC16B6EC65 for ; Fri, 20 Jan 2017 18:58:48 +0000 (UTC) In-Reply-To: <20170120185824.12692-1-lyude@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: Lyude List-Id: intel-gfx@lists.freedesktop.org Rm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgdGhpbmdzIHN1Y2ggYXMgaG90cGx1Z2dpbmcgYW5k IGJhZCBtb25pdG9ycywKdGhlIENocm9tZU9TIHRlYW0gZW5kZWQgdXAgZGVzaWduaW5nIGEgbmVh dCBsaXR0bGUgZGV2aWNlIGtub3duIGFzIHRoZQpDaGFtZWxpdW0uIE1vcmUgaW5mb3JtYXRpb24g b24gdGhpcyBjYW4gYmUgZm91bmQgaGVyZToKCglodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvY2hy b21pdW0tb3MvdGVzdGluZy9jaGFtZWxpdW0KClRoaXMgYWRkcyBzdXBwb3J0IGZvciBhIGNvdXBs ZSBvZiB0aGluZ3MgdG8gaW50ZWwtZ3B1LXRvb2xzOgogLSBpZ3QgbGlicmFyeSBmdW5jdGlvbnMg Zm9yIGNvbm5lY3RpbmcgdG8gdWRldiBhbmQgbW9uaXRvcmluZyBpdCBmb3IKICAgaG90cGx1ZyBl dmVudHMsIGxvb3NlbHkgYmFzZWQgb2ZmIG9mIHRoZSB1bmZpbmlzaGVkIGhvdHBsdWdnaW5nCiAg IGltcGxlbWVudGF0aW9uIGluIHRlc3RkaXNwbGF5CiAtIExpYnJhcnkgZnVuY3Rpb25zIGZvciBj b250cm9sbGluZyB0aGUgY2hhbWVsaXVtIGluIHRlc3RzIHVzaW5nCiAgIHhtbHJwYy4gQSBjb3Vw bGUgb2YgUlBDIGNhbGxzIHdlcmUgb21taXR0ZWQgaGVyZSwgbWFpbmx5IGJlY2F1c2UgdGhleQog ICBkaWRuJ3Qgc2VlbSB2ZXJ5IHVzZWZ1bCBmb3Igb3VyIG5lZWRzICh5ZXQpCiAtIEEgc2V0IG9m IGZ1bmN0aW9ucyBmb3IgZG9pbmcgQ1JDIGNoZWNrcyBhbmQgZnJhbWUgY29tcGFyaXNvbnMgaW4K ICAgdGVzdHMKIC0gQSBzZXQgb2YgYmFzaWMgdGVzdHMgdXNpbmcgdGhlIENoYW1lbGl1bSBsaWJy YXJ5LgoKQ2M6IFRvbWV1IFZpem9zbyA8dG9tZXVAdG9tZXV2aXpvc28ubmV0PgpTaWduZWQtb2Zm LWJ5OiBMeXVkZSA8bHl1ZGVAcmVkaGF0LmNvbT4KCkNoYW5nZXMgc2luY2UgdjE6Ci0gRG9uJ3Qg dHJ5IHRvIGd1ZXNzIGNvbm5lY3RvciBtYXBwaW5ncywgaGF2ZSB0aGUgdXNlciBzcGVjaWZ5IHRo ZW0KICBtYW51YWxseSB1c2luZyBhIGNvbmZpZ3VyYXRpb24gZmlsZQotIE9wZW4gRFJNIGZkIHVz aW5nIERSSVZFUl9BTlksIG5vdCBEUklWRVJfSU5URUwKLSBMb3dlciB0aGUgaG90cGx1ZyB0aW1l b3V0IGEgbGl0dGxlIGJpdCwgc2luY2UgMzAgc2Vjb25kcyB3YXMgbGVmdG92ZXIKICBmcm9tIGRl YnVnZ2luZyB0aGVzZSB0ZXN0cyBhbnl3YXkKLSBEb24ndCB0cnkgdG8ga2VlcCB0cmFjayBvZiB0 aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIGNoYW1lbGl1bSBwb3J0cywKICBhbmQganVzdCBsZWF2 ZSB0aGVtIHBsdWdnZWQgaW4gYWZ0ZXIgZWFjaCBydW4uIFRoaXMgbWFrZXMgbW9yZSBzZW5zZQog IHRvIG1lLCBzaW5jZSBJJ2QgaW1hZ2luZSBpbiBhdXRvbWF0ZWQgdGVzdGluZyBzZXR1cHMgdXNp bmcgY2hhbWVsaXVtcwogIHRoYXQgYWxsIG9mIHRoZSBleHRyYSBtb25pdG9ycyB3aWxsIHByb2Jh Ymx5IGJlIHByb3ZpZGVkIGJ5IHRoZQogIENoYW1lbGl1bSB0byBiZWdpbiB3aXRoLCBzbyBrZWVw aW5nIHRoZW0gcGx1Z2dlZCBpbiB3b3VsZCBtYWtlIHN1cmUKICB0ZXN0cyBydW5uaW5nIGFmdGVy d2FyZHMgdGhhdCByZXF1aXJlID4xIG1vbml0b3IgZG9uJ3QgZ2V0IHNraXBwZWQuCi0gQWRkIHdh aXRfZm9yX2Nvbm5lY3RvcigpIHRvIHRoZSBjaGFtZWxpdW0gdGVzdHMuIEFmdGVyIHNvbWUgbW9y ZQogIHRlc3RpbmcsIEkgZm91bmQgdGhhdCBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbSBzb21lIHRl c3RzIHdvdWxkIHRocm93CiAgZmFsc2UgbmVnYXRpdmVzIGR1ZSB0byB1cyBub3Qgd2FpdGluZyBs b25nIGVub3VnaCBmb3IgdGhlIHN5c3RlbSB0bwogIGRldGVjdCB0aGF0IHdlIGNvbm5lY3RlZCBz b21ldGhpbmcgdG8gaXQuIFRoaXMgbWFpbmx5IGhhcHBlbmVkIHdpdGgKICBWR0EgY29ubmVjdG9y cywgc2luY2UgdGhlaXIgbGFjayBvZiBIUEQgbWFrZXMgdGhlbSB0YWtlIHNpZ25pZmljYW50bHkK ICBsb25nZXIgZm9yIHRoZSBoYXJkd2FyZSB0byBub3RpY2UuIHdhaXRfZm9yX2Nvbm5lY3Rvcigp IGZpeGVzIHRoaXMgYnkKICBjb250aW51YWxseSByZXByb2JpbmcgdGhlIHN0YXR1cyBvZiB0aGUg ZGVzaXJlZCBjb25uZWN0b3IgKHdpdGhvdXQKICByZWx5aW5nIG9uIGEgaHBkIGV2ZW50IGhhcHBl bmluZywgc2luY2UgdGhhdCBtaWdodCBuZXZlciBjb21lKSB1bnRpbAogIHdlIGdldCB3aGF0IHdl IHdhbnQsIG9yIHdlIHRpbWUgb3V0IGFuZCBmYWlsLgotIFVzZSBrbXN0ZXN0X2dldF9wcm9wZXJ0 eSgpIGZvciByZXRyaWV2aW5nIEVESURzIGluc3RlYWQgb2YgZG9pbmcgaXQgYnkKICBoYW5kCi0g RG9uJ3QgaGFyZGNvZGUgUElQRV9BIGZvciBicmluZ2luZyB1cCB0aGUgZGlzcGxheSwgdXNlIGtt c3Rlc3QgdG8gZmluZAogIGFuIGFwcHJvcHJpYXRlIENSVEMgdG8gdXNlLgpDaGFuZ2VzIHNpbmNl IHYyOgotIEZpeCBpbmNvcnJlY3QgdXNhZ2Ugb2YgdGhlIGxpc3QgaGVscGVycyB3aGVuIHJlY29y ZGluZyBuZXcgRURJRHMKLSBBZGQgbWlzc2luZyBkb2N1bWVudGF0aW9uCi0gTWFrZSBzdXJlIGRv Y3VtZW50YXRpb24gYWN0dWFsbHkgYXBwZWFycwotIFNpbmNlIHdlIGZpbmFsbHkgZ290IHZpZGVv IGNhcHR1cmUgd29ya2luZywgYWRkIENSQyBmdW5jdGlvbnMgYW5kIGZpeAogIHRoZSBvbmVzIHdl IGNvdWxkbid0IGFjdHVhbGx5IHRlc3QgYmVmb3JlCi0gSW4gdGhlIGV4aXQgaGFuZGxlciwgcmVz ZXQgdGhlIHhtbHJwYyBlbnYgc28gd2UgY2FuIHByb3Blcmx5IHJlc2V0IHRoZQogIENoYW1lbGl1 bSBldmVuIGFmdGVyIGFuIFJQQyBlcnJvcgotIE1ha2Ugc3VyZSBjb21waWxpbmcgd2l0aG91dCBD aGFtZWxpdW0gc3VwcG9ydCBzdGlsbCB3b3JrcwpDaGFuZ2VzIHNpbmNlIHYzOgotIENoYW5nZSB0 aGUgY29uZmlnIGZpbGUgbmFtZSBmcm9tIC5pZ3RfY2hhbWVsaXVtX3JjIHRvIC5pZ3RyYwotIFJl bW92ZSBjaGFtZWxpdW0gZ2xvYmFsIGNvbnRleHQKLSBHZXQgcmlkIG9mIGRlZmluZV9jb21tb25f Y29ubmVjdG9yX3Rlc3RzKCkKLSBHZXQgcmlkIG9mIGNvbm5lY3RvciBsaXN0LCBleHBvc2UgY29u bmVjdG9ycyBhcyBvcGFxdWUgb2JqZWN0cyBhbmQKICBwcm92aWRlIGhlbHBlcnMgZm9yIGFjY2Vz c2luZyB0aGVpciBhdHRyaWJ1dGVzCi0gR2V0IHJpZCBvZiBjb25maWd1cmUuYWMgb3B0aW9uIGZv ciBDaGFtZWxpdW0KLSBBZGQgdGVzdHMgZm9yIENSQyBmdW5jdGlvbnMKLSBBZGQgZnJhbWUgZHVt cGluZyBmdW5jdGlvbnMgKyB0ZXN0cwotIEFkZCBGU00gaGFuZGxpbmcgdG8gY2hhbWVsaXVtX3Jw YygpCi0gVXNlIExJQlVERVZfTElCUyBpbiBhdXRvbWFrZSwgbm90IFVERVZfTElCUwotIERvY3Vt ZW50YXRpb24gZml4ZXMKLSBJbXByb3ZlIGRlYnVnZ2luZyBvdXRwdXQgc29tZSBtb3JlCi0gUmVt b3ZlIHNraXBfd2l0aG91dF9zdXNwZW5kX3N1cHBvcnQsIHdlIG5vIGxvbmdlciBuZWVkIHRvIGNo ZWNrIGZvcgogIHN1c3BlbmQgc3VwcG9ydCBiZWZvcmUgY2FsbGluZyB0aGluZ3MKLSBSZW1vdmUg dW5uZXNzZWNhcnkgbWFsbG9jKCkgY2hlY2tzIHdpdGggaWd0X2Fzc2VydCgpCi0gRG9uJ3QgdXNl IGlndF9yZXF1aXJlIGluIGNoYW1lbGl1bV9pbml0LCBsZWF2ZSBpdCB1cCB0byB0aGUgY2FsbGVy CiAgd2hldGhlciBvciBub3QgdG8gYWJvcnQgd2hlbiBmYWlsaW5nIHRvIGluaXRpYWxpemUgdGhl IGNoYW1lbGl1bQotIFVzZSBpZ3RfYXNzZXJ0X2VxIGZvciBtYWtpbmcgYXNzZXJ0aW9ucyBhYm91 dCBjb25uZWN0b3IncyBzdGF0dXNlcwotIERlZmluZSBzdXNwZW5kL3Jlc3VtZSBkZWxheSBmb3Ig dGVzdHMgYXMgY29uc3RhbnQKLS0tCiBjb25maWd1cmUuYWMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgIDQgKwogLi4uL2ludGVsLWdwdS10b29scy9pbnRlbC1ncHUt dG9vbHMtZG9jcy54bWwgICAgICAgfCAgICAxICsKIGxpYi9NYWtlZmlsZS5hbSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgNiArCiBsaWIvTWFrZWZpbGUuc291cmNlcyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKwogbGliL2lndC5oICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIGxpYi9pZ3RfY2hhbWVs aXVtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTM0NiArKysrKysrKysrKysr KysrKysrKwogbGliL2lndF9jaGFtZWxpdW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgMTAzICsrCiB0ZXN0cy9NYWtlZmlsZS5hbSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8ICAgIDUgKy0KIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgMSArCiB0ZXN0cy9jaGFtZWxpdW0uYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICA2ODkgKysrKysrKysrKwogMTAgZmlsZXMgY2hhbmdlZCwgMjE1 NyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2ln dF9jaGFtZWxpdW0uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pZ3RfY2hhbWVsaXVtLmgKIGNy ZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9jaGFtZWxpdW0uYwoKZGlmZiAtLWdpdCBhL2NvbmZpZ3Vy ZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCA0MTFiZmFiLi4yMjkxODVjIDEwMDY0NAotLS0gYS9j b25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0xNjksNiArMTY5LDEwIEBAIGlmIHRl c3QgeCIkdWRldiIgPSB4eWVzOyB0aGVuCiBmaQogUEtHX0NIRUNLX01PRFVMRVMoR0xJQiwgZ2xp Yi0yLjApCiAKKyMgZm9yIGNoYW1lbGl1bQorUEtHX0NIRUNLX01PRFVMRVMoWE1MUlBDLCB4bWxy cGNfY2xpZW50KQorUEtHX0NIRUNLX01PRFVMRVMoUElYTUFOLCBwaXhtYW4tMSkKKwogIyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogIwkJCUNvbmZpZ3VyYXRpb24gb3B0aW9ucwogIyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9yZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2lu dGVsLWdwdS10b29scy1kb2NzLnhtbCBiL2RvY3MvcmVmZXJlbmNlL2ludGVsLWdwdS10b29scy9p bnRlbC1ncHUtdG9vbHMtZG9jcy54bWwKaW5kZXggOTFiMjQ5OS4uOTkwYmJiOCAxMDA2NDQKLS0t IGEvZG9jcy9yZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2ludGVsLWdwdS10b29scy1kb2NzLnht bAorKysgYi9kb2NzL3JlZmVyZW5jZS9pbnRlbC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRvb2xzLWRv Y3MueG1sCkBAIC0zNCw2ICszNCw3IEBACiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF92 YzQueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF92Z2VtLnhtbCIvPgogICAg IDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3RfZHVtbXlsb2FkLnhtbCIvPgorICAgIDx4aTppbmNs dWRlIGhyZWY9InhtbC9pZ3RfY2hhbWVsaXVtLnhtbCIvPgogICA8L2NoYXB0ZXI+CiAgIDx4aTpp bmNsdWRlIGhyZWY9InhtbC9pZ3RfdGVzdF9wcm9ncmFtcy54bWwiLz4KIApkaWZmIC0tZ2l0IGEv bGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IDU3ZDNkYmIuLjcwMzBlYTIg MTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTMx LDYgKzMxLDkgQEAgQU1fQ0ZMQUdTID0gXAogCSAgICAkKEtNT0RfQ0ZMQUdTKSBcCiAJICAgICQo UFJPQ1BTX0NGTEFHUykgXAogCSAgICAkKERFQlVHX0NGTEFHUykgXAorCSAgICAkKFhNTFJQQ19D RkxBR1MpIFwKKwkgICAgJChMSUJVREVWX0NGTEFHUykgXAorCSAgICAkKFBJWE1BTl9DRkxBR1Mp IFwKIAkgICAgLURJR1RfU1JDRElSPVwiIiQoYWJzX3RvcF9zcmNkaXIpL3Rlc3RzIlwiIFwKIAkg ICAgLURJR1RfREFUQURJUj1cIiIkKHBrZ2RhdGFkaXIpIlwiIFwKIAkgICAgLURJR1RfTE9HX0RP TUFJTj1cIiIkKHN1YnN0IF8sLSwkKikiXCIgXApAQCAtNDcsNSArNTAsOCBAQCBsaWJpbnRlbF90 b29sc19sYV9MSUJBREQgPSBcCiAJJChMSUJVREVWX0xJQlMpIFwKIAkkKExJQlVOV0lORF9MSUJT KSBcCiAJJChUSU1FUl9MSUJTKSBcCisJJChYTUxSUENfTElCUykgXAorCSQoTElCVURFVl9MSUJT KSBcCisJJChQSVhNQU5fTElCUykgXAogCS1sbQogCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUu c291cmNlcyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDUzZmRiNTQuLjhjYjk1ZDggMTAw NjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL2xpYi9NYWtlZmlsZS5zb3VyY2Vz CkBAIC04Myw2ICs4Myw4IEBAIGxpYl9zb3VyY2VfbGlzdCA9CSAJXAogCXV3aWxkbWF0L3V3aWxk bWF0LmMJXAogCWlndF9rbW9kLmMJCVwKIAlpZ3Rfa21vZC5oCQlcCisJaWd0X2NoYW1lbGl1bS5o CQlcCisJaWd0X2NoYW1lbGl1bS5jCQlcCiAJJChOVUxMKQogCiAuUEhPTlk6IHZlcnNpb24uaC50 bXAKZGlmZiAtLWdpdCBhL2xpYi9pZ3QuaCBiL2xpYi9pZ3QuaAppbmRleCBhMDAyOGQ1Li5hOTc5 MjNlIDEwMDY0NAotLS0gYS9saWIvaWd0LmgKKysrIGIvbGliL2lndC5oCkBAIC0zOCw2ICszOCw3 IEBACiAjaW5jbHVkZSAiaWd0X2ttcy5oIgogI2luY2x1ZGUgImlndF9wbS5oIgogI2luY2x1ZGUg ImlndF9zdGF0cy5oIgorI2luY2x1ZGUgImlndF9jaGFtZWxpdW0uaCIKICNpbmNsdWRlICJpbnN0 ZG9uZS5oIgogI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCiAjaW5jbHVkZSAiaW50ZWxf Y2hpcHNldC5oIgpkaWZmIC0tZ2l0IGEvbGliL2lndF9jaGFtZWxpdW0uYyBiL2xpYi9pZ3RfY2hh bWVsaXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxNWNlNgotLS0g L2Rldi9udWxsCisrKyBiL2xpYi9pZ3RfY2hhbWVsaXVtLmMKQEAgLTAsMCArMSwxMzQ2IEBACisv KgorICogQ29weXJpZ2h0IMKpIDIwMTYgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3Vi bGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5n IHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUg U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lO RCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBU SEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAq IFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlN LCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9G IENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9S IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFM SU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHl1ZGUgUGF1 bCA8bHl1ZGVAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNs dWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHhtbHJwYy1jL2Jh c2UuaD4KKyNpbmNsdWRlIDx4bWxycGMtYy9jbGllbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+ CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPHBpeG1hbi5oPgorI2luY2x1ZGUgPGNhaXJv Lmg+CisKKyNpbmNsdWRlICJpZ3QuaCIKKworLyoqCisgKiBTRUNUSU9OOmlndF9jaGFtZWxpdW0K KyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogTGlicmFyeSBmb3IgdXNpbmcgdGhlIENoYW1lbGl1bSBp bnRvIGlndCB0ZXN0cworICogQHRpdGxlOiBDaGFtZWxpdW0KKyAqIEBpbmNsdWRlOiBpZ3RfY2hh bWVsaXVtLmgKKyAqCisgKiBUaGlzIGxpYnJhcnkgY29udGFpbnMgaGVscGVycyBmb3IgdXNpbmcg Q2hhbWVsaXVtcyBpbiBJR1QgdGVzdHMuIFRoaXMgYWxsb3dzCisgKiBmb3IgdGVzdHMgdG8gc2lt dWxhdGUgbW9yZSBkaWZmaWN1bHQgdGFza3MgdG8gYXV0b21hdGUgc3VjaCBhcyBkaXNwbGF5Cisg KiBob3RwbHVnZ2luZywgZmF1bHR5IGRpc3BsYXkgYmVoYXZpb3JzLCBldGMuCisgKgorICogTW9y ZSBpbmZvcm1hdGlvbiBvbiB0aGUgQ2hhbWVsaXVtIGNhbiBiZSBmb3VuZAorICogW29uIHRoZSBD aHJvbWVPUyBwcm9qZWN0IHBhZ2VdKGh0dHBzOi8vd3d3LmNocm9taXVtLm9yZy9jaHJvbWl1bS1v cy90ZXN0aW5nL2NoYW1lbGl1bSkuCisgKgorICogSW4gb3JkZXIgdG8gcnVuIHRlc3RzIHVzaW5n IHRoZSBDaGFtZWxpdW0sIGEgdmFsaWQgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgYmUKKyAqIHBy ZXNlbnQuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgbm9ybWFsIEdsaWIga2V5ZmlsZSAo c2ltaWxhciB0byBXaW5kb3dzCisgKiBJTkkpIHN0cnVjdHVyZWQgbGlrZSBzbzoKKyAqCisgKiB8 WzwhLS0gbGFuZ3VhZ2U9InBsYWluIiAtLT4KKyAqCVtDaGFtZWxpdW1dCisgKglVUkw9aHR0cDov L2NoYW1lbGVvbjo5OTkyICMgVGhlIFVSTCB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSBDaGFt ZWxpdW0ncyBSUEMgc2VydmVyCisgKgorICoJIyBUaGUgcmVzdCBvZiB0aGUgc2VjdGlvbnMgYXJl IHVzZWQgZm9yIGRlZmluaW5nIGNvbm5lY3RvciBtYXBwaW5ncy4KKyAqCSMgVGhpcyBpcyByZXF1 aXJlZCBzbyBhbnkgdGVzdHMgdXNpbmcgdGhlIENoYW1lbGl1bSBrbm93IHdoaWNoIGNvbm5lY3Rv cgorICoJIyBvbiB0aGUgdGVzdCBtYWNoaW5lIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gZWFjaCBD aGFtZWxpdW0gcG9ydC4KKyAqCSMKKyAqCSMgSW4gdGhlIGV2ZW50IHRoYXQgYW55IG9mIHRoZXNl IG1hcHBpbmdzIGFyZSBzcGVjaWZpZWQgaW5jb3JyZWN0bHksCisgKgkjIGFueSBob3RwbHVnZ2lu ZyB0ZXN0cyBmb3IgdGhlIGluY29ycmVjdCBjb25uZWN0b3IgbWFwcGluZyB3aWxsIGZhaWwuCisg KgorICoJW0NoYW1lbGl1bTpEUC0xXSAjIFRoZSBuYW1lIG9mIHRoZSBEUk0gY29ubmVjdG9yCisg KglDaGFtZWxpdW1Qb3J0SUQ9MSAjIFRoZSBJRCBvZiB0aGUgcG9ydCBvbiB0aGUgQ2hhbWVsaXVt IHRoaXMgY29ubmVjdG9yIGlzIGF0dGFjaGVkIHRvCisgKgorICoJW0NoYW1lbGl1bTpIRE1JLUEt MV0KKyAqCUNoYW1lbGl1bVBvcnRJRD0zCisgKiBdfAorICoKKyAqIEJ5IGRlZmF1bHQsIHRoaXMg ZmlsZSBpcyBleHBlY3RlZCB0byBleGlzdCBpbiB+Ly5pZ3RyYyAuIFRoZSBkaXJlY3RvcnkgZm9y CisgKiB0aGlzIGNhbiBiZSBvdmVycmlkZW4gYnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFy aWFibGUgJUlHVF9DT05GSUdfUEFUSC4KKyAqLworCitzdHJ1Y3QgY2hhbWVsaXVtX2VkaWQgewor CWludCBpZDsKKwlzdHJ1Y3QgaWd0X2xpc3QgbGluazsKK307CisKK3N0cnVjdCBjaGFtZWxpdW1f cG9ydCB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJaW50IGlkOworCWludCBjb25uZWN0b3JfaWQ7 CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVtcCB7CisJdW5z aWduZWQgY2hhciAqYmdyOworCXNpemVfdCBzaXplOworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0 OworCXN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKK307CisKK3N0cnVjdCBjaGFtZWxpdW0g eworCXhtbHJwY19lbnYgZW52OworCXhtbHJwY19jbGllbnQgKmNsaWVudDsKKwljaGFyICp1cmw7 CisKKwkvKiBJbmRpY2F0ZXMgdGhlIGxhc3QgcG9ydCB0byBoYXZlIGJlZW4gdXNlZCBmb3IgY2Fw dHVyaW5nIHZpZGVvICovCisJc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpjYXB0dXJpbmdfcG9ydDsK KworCWludCBkcm1fZmQ7CisKKwlzdHJ1Y3QgY2hhbWVsaXVtX2VkaWQgKmVkaWRzOworCXN0cnVj dCBjaGFtZWxpdW1fcG9ydCAqcG9ydHM7CisJaW50IHBvcnRfY291bnQ7Cit9OworCitzdGF0aWMg c3RydWN0IGNoYW1lbGl1bSAqY2xlYW51cF9pbnN0YW5jZTsKKworLyoqCisgKiBjaGFtZWxpdW1f Z2V0X3BvcnRzOgorICogQGNoYW1lbGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UK KyAqIEBjb3VudDogV2hlcmUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBwb3J0cworICoKKyAqIFJl dHJpZXZlcyBhbGwgb2YgdGhlIHBvcnRzIGN1cnJlbnRseSBjb25maWd1cmVkIGZvciB1c2Ugd2l0 aCB0aGlzIGNoYW1lbGl1bQorICoKKyAqIFJldHVybnM6IGFuIGFycmF5IGNvbnRhaW5pbmcgYSBw b2ludGVyIHRvIGVhY2ggY29uZmlndXJlZCBjaGFtZWxpdW0gcG9ydAorICovCitzdHJ1Y3QgY2hh bWVsaXVtX3BvcnQgKipjaGFtZWxpdW1fZ2V0X3BvcnRzKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1l bGl1bSwKKwkJCQkJICAgIGludCAqY291bnQpCit7CisJaW50IGk7CisJc3RydWN0IGNoYW1lbGl1 bV9wb3J0ICoqcmV0ID0KKwkJY2FsbG9jKHNpemVvZih2b2lkKiksIGNoYW1lbGl1bS0+cG9ydF9j b3VudCk7CisKKwkqY291bnQgPSBjaGFtZWxpdW0tPnBvcnRfY291bnQ7CisJZm9yIChpID0gMDsg aSA8IGNoYW1lbGl1bS0+cG9ydF9jb3VudDsgaSsrKQorCQlyZXRbaV0gPSAmY2hhbWVsaXVtLT5w b3J0c1tpXTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX3BvcnRfZ2V0 X3R5cGU6CisgKiBAcG9ydDogVGhlIGNoYW1lbGl1bSBwb3J0IHRvIHJldHJpZXZlIHRoZSB0eXBl IGZyb20KKyAqCisgKiBSZXRyaWV2ZXMgdGhlIERSTSBjb25uZWN0b3IgdHlwZSBvZiB0aGUgcGh5 c2ljYWwgcG9ydCBvbiB0aGUgQ2hhbWVsaXVtLiBJdAorICogc2hvdWxkIGJlIG5vdGVkIHRoYXQg dGhpcyB0eXBlIG1heSBkaWZmZXIgZnJvbSB0aGUgdHlwZSBwcm92aWRlZCBieSB0aGUKKyAqIGRy aXZlci4KKyAqCisgKiBSZXR1cm5zOiB0aGUgRFJNIGNvbm5lY3RvciB0eXBlIG9mIHRoZSBwaHlz aWNhbCBDaGFtZWxpdW0gcG9ydAorICovCit1bnNpZ25lZCBpbnQgY2hhbWVsaXVtX3BvcnRfZ2V0 X3R5cGUoY29uc3Qgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KSB7CisJcmV0dXJuIHBvcnQt PnR5cGU7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX3BvcnRfZ2V0X2Nvbm5lY3RvcjoKKyAqIEBj aGFtZWxpdW06IFRoZSBDaGFtZWxpdW0gaW5zdGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhlIGNo YW1lbGl1bSBwb3J0IHRvIHJldHJpZXZlIHRoZSBEUk0gY29ubmVjdG9yIGZvcgorICogQHJlcHJv YmU6IFdoZXRoZXIgb3Igbm90IHRvIHJlcHJvYmUgdGhlIERSTSBjb25uZWN0b3IKKyAqCisgKiBH ZXQgYSBkcm1Nb2RlQ29ubmVjdG9yIG9iamVjdCBmb3IgdGhlIGdpdmVuIENoYW1lbGl1bSBwb3J0 LCBhbmQgb3B0aW9uYWxseQorICogcmVwcm9iZSB0aGUgcG9ydCBpbiB0aGUgcHJvY2VzcworICoK KyAqIFJldHVybnM6IGEgZHJtTW9kZUNvbm5lY3RvciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0 aGUgZ2l2ZW4gcG9ydAorICovCitkcm1Nb2RlQ29ubmVjdG9yICpjaGFtZWxpdW1fcG9ydF9nZXRf Y29ubmVjdG9yKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwKKwkJCQkJICAgICAgIHN0cnVj dCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCQkJICAgICAgIGJvb2wgcmVwcm9iZSkKK3sKKwlk cm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisKKwlpZiAocmVwcm9iZSkKKwkJY29ubmVjdG9y ID0gZHJtTW9kZUdldENvbm5lY3RvcihjaGFtZWxpdW0tPmRybV9mZCwKKwkJCQkJCXBvcnQtPmNv bm5lY3Rvcl9pZCk7CisJZWxzZQorCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yQ3Vy cmVudCgKKwkJICAgIGNoYW1lbGl1bS0+ZHJtX2ZkLCBwb3J0LT5jb25uZWN0b3JfaWQpOworCisJ cmV0dXJuIGNvbm5lY3RvcjsKK30KKworLyoqCisgKiBjaGFtZWxpdW1fcG9ydF9nZXRfbmFtZToK KyAqIEBwb3J0OiBUaGUgY2hhbWVsaXVtIHBvcnQgdG8gcmV0cmlldmUgdGhlIG5hbWUgb2YKKyAq CisgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBEUk0gY29ubmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8g dGhlIGdpdmVuIENoYW1lbGl1bQorICogcG9ydC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgbmFtZSBv ZiB0aGUgRFJNIGNvbm5lY3RvcgorICovCitjb25zdCBjaGFyICpjaGFtZWxpdW1fcG9ydF9nZXRf bmFtZShzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPm5hbWU7 Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2Rlc3Ryb3lfZnJhbWVfZHVtcDoKKyAqIEBkdW1wOiBU aGUgZnJhbWUgZHVtcCB0byBkZXN0cm95CisgKgorICogRGVzdHJveXMgdGhlIGdpdmVuIGZyYW1l IGR1bXAgYW5kIGZyZWVzIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAorICog aXQuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX2Rlc3Ryb3lfZnJhbWVfZHVtcChzdHJ1Y3QgY2hhbWVs aXVtX2ZyYW1lX2R1bXAgKmR1bXApCit7CisJZnJlZShkdW1wLT5iZ3IpOworCWZyZWUoZHVtcCk7 Cit9CisKK3N0cnVjdCBmc21fbW9uaXRvcl9hcmdzIHsKKwlzdHJ1Y3QgY2hhbWVsaXVtICpjaGFt ZWxpdW07CisJc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0OworCXN0cnVjdCB1ZGV2X21vbml0 b3IgKm1vbjsKK307CisKKy8qCisgKiBXaGVuZXZlciByZXNvbHV0aW9ucyBvciBvdGhlciBmYWN0 b3JzIGNoYW5nZSB3aXRoIHRoZSBkaXNwbGF5IG91dHB1dCwgdGhlCisgKiBDaGFtZWxpdW0ncyBk aXNwbGF5IHJlY2VpdmVycyBuZWVkIHRvIGJlIGZ1bGx5IHJlc2V0IGluIG9yZGVyIHRvIHBlcmZv cm0gYW55CisgKiBmcmFtZS1jYXB0dXJpbmcgcmVsYXRlZCB0YXNrcy4gVGhpcyByZXF1aXJlcyBj dXR0aW5nIG9mZiB0aGUgZGlzcGxheSB0aGVuCisgKiB0dXJuaW5nIGl0IGJhY2sgb24sIGFuZCBp cyBpbmRpY2F0ZWQgYnkgdGhlIENoYW1lbGl1bSBzZW5kaW5nIGhvdHBsdWcgZXZlbnRzCisgKi8K K3N0YXRpYyB2b2lkICpjaGFtZWxpdW1fZnNtX21vbih2b2lkICpkYXRhKQoreworCXN0cnVjdCBm c21fbW9uaXRvcl9hcmdzICphcmdzID0gZGF0YTsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0 b3I7CisJaW50IGRybV9mZCA9IGFyZ3MtPmNoYW1lbGl1bS0+ZHJtX2ZkOworCisJLyoKKwkgKiBX YWl0IGZvciB0aGUgY2hhbWVsaXVtIHRvIHRyeSB1bnBsdWdnaW5nIHRoZSBjb25uZWN0b3IsIG90 aGVyd2lzZQorCSAqIHRoZSB0aHJlYWQgY2FsbGluZyBjaGFtZWxpdW1fcnBjIHdpbGwga2lsbCB1 cworCSAqLworCWlndF9ob3RwbHVnX2RldGVjdGVkKGFyZ3MtPm1vbiwgNjApOworCisJLyoKKwkg KiBKdXN0IGluIGNhc2UgdGhlIFJQQyBjYWxsIGJlaW5nIGV4ZWN1dGVkIHJldHVybnMgYmVmb3Jl IHdlIGNvbXBsZXRlCisJICogdGhlIEZTTSBtb2Rlc2V0dGluZyBzZXF1ZW5jZSwgc28gd2UgZG9u J3QgbGVhdmUgdGhlIGRpc3BsYXkgaW4gYSBiYWQKKwkgKiBzdGF0ZS4KKwkgKi8KKwlwdGhyZWFk X3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0RJU0FCTEUsIE5VTEwpOworCisJaWd0X2Rl YnVnKCJDaGFtZWxpdW0gbmVlZHMgRlNNLCBoYW5kbGluZ1xuIik7CisJY29ubmVjdG9yID0gY2hh bWVsaXVtX3BvcnRfZ2V0X2Nvbm5lY3RvcihhcmdzLT5jaGFtZWxpdW0sIGFyZ3MtPnBvcnQsCisJ CQkJCQkgZmFsc2UpOworCWttc3Rlc3Rfc2V0X2Nvbm5lY3Rvcl9kcG1zKGRybV9mZCwgY29ubmVj dG9yLCBEUk1fTU9ERV9EUE1TX09GRik7CisJa21zdGVzdF9zZXRfY29ubmVjdG9yX2RwbXMoZHJt X2ZkLCBjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT04pOworCisJZHJtTW9kZUZyZWVDb25uZWN0 b3IoY29ubmVjdG9yKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHhtbHJwY192YWx1ZSAq Y2hhbWVsaXVtX3JwYyhzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJICAgc3RydWN0 IGNoYW1lbGl1bV9wb3J0ICpmc21fcG9ydCwKKwkJCQkgICBjb25zdCBjaGFyICptZXRob2RfbmFt ZSwKKwkJCQkgICBjb25zdCBjaGFyICpmb3JtYXRfc3RyLAorCQkJCSAgIC4uLikKK3sKKwl4bWxy cGNfdmFsdWUgKnJlczsKKwl2YV9saXN0IHZhX2FyZ3M7CisJc3RydWN0IGZzbV9tb25pdG9yX2Fy Z3MgbW9uaXRvcl9hcmdzOworCXB0aHJlYWRfdCBmc21fdGhyZWFkX2lkOworCisJLyogQ2xlYW51 cCB0aGUgbGFzdCBlcnJvciwgaWYgYW55ICovCisJaWYgKGNoYW1lbGl1bS0+ZW52LmZhdWx0X29j Y3VycmVkKSB7CisJCXhtbHJwY19lbnZfY2xlYW4oJmNoYW1lbGl1bS0+ZW52KTsKKwkJeG1scnBj X2Vudl9pbml0KCZjaGFtZWxpdW0tPmVudik7CisJfQorCisJLyogVW5mb3J0dW5hdGVseSB4bWxy cGNfY2xpZW50J3MgZXZlbnQgbG9vcCBoZWxwZXJzIGFyZSByYXRoZXIgdXNlbGVzcworCSAqIGZv ciBpbXBsZW1lbnRpbmcgYW55IHNvcnQgb2YgZXZlbnQgbG9vcCwgc2luY2UgdGhleSBwcm92aWRl IG5vIHdheQorCSAqIHRvIHBvbGwgZm9yIGV2ZW50cyBvdGhlciB0aGVuIHRoZSBSUEMgcmVzcG9u c2UuIFRoaXMgbWVhbnMgaW4gb3JkZXIKKwkgKiB0byBoYW5kbGUgdGhlIGNoYW1lbGl1bSBhdHRl bXB0aW5nIEZTTSwgd2UgaGF2ZSB0byBmb3JrIGludG8gYW5vdGhlcgorCSAqIHRocmVhZCBhbmQg aGF2ZSB0aGF0IGhhbmRsZSBob3RwbHVnZ2luZyBkaXNwbGF5cworCSAqLworCWlmIChmc21fcG9y dCkgeworCQltb25pdG9yX2FyZ3MuY2hhbWVsaXVtID0gY2hhbWVsaXVtOworCQltb25pdG9yX2Fy Z3MucG9ydCA9IGZzbV9wb3J0OworCQltb25pdG9yX2FyZ3MubW9uID0gaWd0X3dhdGNoX2hvdHBs dWcoKTsKKwkJcHRocmVhZF9jcmVhdGUoJmZzbV90aHJlYWRfaWQsIE5VTEwsIGNoYW1lbGl1bV9m c21fbW9uLAorCQkJICAgICAgICZtb25pdG9yX2FyZ3MpOworCX0KKworCXZhX3N0YXJ0KHZhX2Fy Z3MsIGZvcm1hdF9zdHIpOworCXhtbHJwY19jbGllbnRfY2FsbDJmX3ZhKCZjaGFtZWxpdW0tPmVu diwgY2hhbWVsaXVtLT5jbGllbnQsCisJCQkJY2hhbWVsaXVtLT51cmwsIG1ldGhvZF9uYW1lLCBm b3JtYXRfc3RyLCAmcmVzLAorCQkJCXZhX2FyZ3MpOworCXZhX2VuZCh2YV9hcmdzKTsKKworCWlm IChmc21fcG9ydCkgeworCQlwdGhyZWFkX2NhbmNlbChmc21fdGhyZWFkX2lkKTsKKwkJaWd0X2Ns ZWFudXBfaG90cGx1Zyhtb25pdG9yX2FyZ3MubW9uKTsKKwl9CisKKwlpZ3RfYXNzZXJ0X2YoIWNo YW1lbGl1bS0+ZW52LmZhdWx0X29jY3VycmVkLAorCQkgICAgICJDaGFtZWxpdW0gUlBDIGNhbGwg ZmFpbGVkOiAlc1xuIiwKKwkJICAgICBjaGFtZWxpdW0tPmVudi5mYXVsdF9zdHJpbmcpOworCisJ cmV0dXJuIHJlczsKK30KKworLyoqCisgKiBjaGFtZWxpdW1fcGx1ZzoKKyAqIEBjaGFtZWxpdW06 IFRoZSBDaGFtZWxpdW0gaW5zdGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhlIHBvcnQgb24gdGhl IGNoYW1lbGl1bSB0byBwbHVnCisgKgorICogU2ltdWxhdGUgYSBkaXNwbGF5IGNvbm5lY3RvciBi ZWluZyBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbSB1c2luZyB0aGUKKyAqIGNoYW1lbGl1bS4KKyAq Lwordm9pZCBjaGFtZWxpdW1fcGx1ZyhzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sIHN0cnVj dCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3RfZGVidWcoIlBsdWdnaW5nICVzXG4iLCBw b3J0LT5uYW1lKTsKKwl4bWxycGNfREVDUkVGKGNoYW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxM LCAiUGx1ZyIsICIoaSkiLCBwb3J0LT5pZCkpOworfQorCisvKioKKyAqIGNoYW1lbGl1bV91bnBs dWc6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQorICogQHBv cnQ6IFRoZSBwb3J0IG9uIHRoZSBjaGFtZWxpdW0gdG8gdW5wbHVnCisgKgorICogU2ltdWxhdGUg YSBkaXNwbGF5IGNvbm5lY3RvciBiZWluZyB1bnBsdWdnZWQgZnJvbSB0aGUgc3lzdGVtIHVzaW5n IHRoZQorICogY2hhbWVsaXVtLgorICovCit2b2lkIGNoYW1lbGl1bV91bnBsdWcoc3RydWN0IGNo YW1lbGl1bSAqY2hhbWVsaXVtLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCit7CisJaWd0 X2RlYnVnKCJVbnBsdWdnaW5nIHBvcnQgJXNcbiIsIHBvcnQtPm5hbWUpOworCXhtbHJwY19ERUNS RUYoY2hhbWVsaXVtX3JwYyhjaGFtZWxpdW0sIE5VTEwsICJVbnBsdWciLCAiKGkpIiwKKwkJCQkg ICAgcG9ydC0+aWQpKTsKK30KKworLyoqCisgKiBjaGFtZWxpdW1faXNfcGx1Z2dlZDoKKyAqIEBj aGFtZWxpdW06IFRoZSBDaGFtZWxpdW0gaW5zdGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhlIHBv cnQgb24gdGhlIENoYW1lbGl1bSB0byBjaGVjayB0aGUgc3RhdHVzIG9mCisgKgorICogQ2hlY2sg d2hldGhlciBvciBub3QgdGhlIGdpdmVuIHBvcnQgaGFzIGJlZW4gcGx1Z2dlZCBpbnRvIHRoZSBz eXN0ZW0gdXNpbmcKKyAqICNjaGFtZWxpdW1fcGx1Zy4KKyAqCisgKiBSZXR1cm5zOiAldHJ1ZSBp ZiB0aGUgY29ubmVjdG9yIGlzIHNldCB0byBwbHVnZ2VkIGluLCAlZmFsc2Ugb3RoZXJ3aXNlLgor ICovCitib29sIGNoYW1lbGl1bV9pc19wbHVnZ2VkKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1 bSwKKwkJCSAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQoreworCXhtbHJwY192YWx1ZSAq cmVzOworCXhtbHJwY19ib29sIGlzX3BsdWdnZWQ7CisKKwlyZXMgPSBjaGFtZWxpdW1fcnBjKGNo YW1lbGl1bSwgTlVMTCwgIklzUGx1Z2dlZCIsICIoaSkiLCBwb3J0LT5pZCk7CisKKwl4bWxycGNf cmVhZF9ib29sKCZjaGFtZWxpdW0tPmVudiwgcmVzLCAmaXNfcGx1Z2dlZCk7CisJeG1scnBjX0RF Q1JFRihyZXMpOworCisJcmV0dXJuIGlzX3BsdWdnZWQ7Cit9CisKKy8qKgorICogY2hhbWVsaXVt X3BvcnRfd2FpdF92aWRlb19pbnB1dF9zdGFibGU6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVs aXVtIGluc3RhbmNlIHRvIHVzZQorICogQHBvcnQ6IFRoZSBwb3J0IG9uIHRoZSBDaGFtZWxpdW0g dG8gY2hlY2sgdGhlIHN0YXR1cyBvZgorICogQHRpbWVvdXRfc2VjczogSG93IGxvbmcgdG8gd2Fp dCBmb3IgYSB2aWRlbyBzaWduYWwgdG8gYXBwZWFyIGJlZm9yZSB0aW1pbmcKKyAqIG91dAorICoK KyAqIFdhaXRzIGZvciBhIHZpZGVvIHNpZ25hbCB0byBhcHBlYXIgb24gdGhlIGdpdmVuIHBvcnQu IFRoaXMgaXMgdXNlZnVsIGZvcgorICogY2hlY2tpbmcgd2hldGhlciBvciBub3Qgd2UndmUgc2V0 dXAgYSBtb25pdG9yIGNvcnJlY3RseS4KKyAqCisgKiBSZXR1cm5zOiAldHJ1ZSBpZiBhIHZpZGVv IHNpZ25hbCB3YXMgZGV0ZWN0ZWQsICVmYWxzZSBpZiB3ZSB0aW1lZCBvdXQKKyAqLworYm9vbCBj aGFtZWxpdW1fcG9ydF93YWl0X3ZpZGVvX2lucHV0X3N0YWJsZShzdHJ1Y3QgY2hhbWVsaXVtICpj aGFtZWxpdW0sCisJCQkJCSAgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsCisJCQkJCSAg ICBpbnQgdGltZW91dF9zZWNzKQoreworCXhtbHJwY192YWx1ZSAqcmVzOworCXhtbHJwY19ib29s IGlzX29uOworCisJaWd0X2RlYnVnKCJXYWl0aW5nIGZvciB2aWRlbyBpbnB1dCB0byBzdGFiYWxp emUgb24gJXNcbiIsIHBvcnQtPm5hbWUpOworCisJcmVzID0gY2hhbWVsaXVtX3JwYyhjaGFtZWxp dW0sIHBvcnQsICJXYWl0VmlkZW9JbnB1dFN0YWJsZSIsICIoaWkpIiwKKwkJCSAgICBwb3J0LT5p ZCwgdGltZW91dF9zZWNzKTsKKworCXhtbHJwY19yZWFkX2Jvb2woJmNoYW1lbGl1bS0+ZW52LCBy ZXMsICZpc19vbik7CisJeG1scnBjX0RFQ1JFRihyZXMpOworCisJcmV0dXJuIGlzX29uOworfQor CisvKioKKyAqIGNoYW1lbGl1bV9maXJlX2hwZF9wdWxzZXM6CisgKiBAY2hhbWVsaXVtOiBUaGUg Q2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQorICogQHBvcnQ6IFRoZSBwb3J0IHRvIGZpcmUgdGhl IEhQRCBwdWxzZXMgb24KKyAqIEB3aWR0aF9tc2VjOiBIb3cgbG9uZyBlYWNoIHB1bHNlIHNob3Vs ZCBsYXN0CisgKiBAY291bnQ6IFRoZSBudW1iZXIgb2YgcHVsc2VzIHRvIHNlbmQKKyAqCisgKiBB IGNvbnZpZW5lbmNlIGZ1bmN0aW9uIGZvciBzZW5kaW5nIG11bHRpcGxlIGhvdHBsdWcgcHVsc2Vz IHRvIHRoZSBzeXN0ZW0uCisgKiBUaGUgcHVsc2VzIHN0YXJ0IGF0IGxvdyAoZS5nLiBjb25uZWN0 b3IgaXMgZGlzY29ubmVjdGVkKSwgYW5kIHRoZW4gYWx0ZXJuYXRlCisgKiBmcm9tIGhpZ2ggKGUu Zy4gY29ubmVjdG9yIGlzIHBsdWdnZWQgaW4pIHRvIGxvdy4gVGhpcyBpcyB0aGUgZXF1aXZhbGVu dCBvZgorICogcmVwZWF0ZWRseSBjYWxsaW5nICNjaGFtZWxpdW1fcGx1ZyBhbmQgI2NoYW1lbGl1 bV91bnBsdWcsIHdhaXRpbmcKKyAqIEB3aWR0aF9tc2VjIGJldHdlZW4gZWFjaCBjYWxsLgorICoK KyAqIElmIEBjb3VudCBpcyBldmVuLCB0aGUgbGFzdCBwdWxzZSBzZW50IHdpbGwgYmUgaGlnaCwg YW5kIGlmIGl0J3Mgb2RkIHRoZW4gaXQKKyAqIHdpbGwgYmUgbG93LiBSZXNldHRpbmcgdGhlIEhQ RCBsaW5lIGJhY2sgdG8gaXQncyBwcmV2aW91cyBzdGF0ZSwgaWYgZGVzaXJlZCwKKyAqIGlzIHRo ZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyLgorICovCit2b2lkIGNoYW1lbGl1bV9maXJl X2hwZF9wdWxzZXMoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJICAgICAgIHN0cnVj dCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCSAgICAgICBpbnQgd2lkdGhfbXNlYywgaW50IGNv dW50KQoreworCXhtbHJwY192YWx1ZSAqcHVsc2Vfd2lkdGhzID0geG1scnBjX2FycmF5X25ldygm Y2hhbWVsaXVtLT5lbnYpOworCXhtbHJwY192YWx1ZSAqd2lkdGggPSB4bWxycGNfaW50X25ldygm Y2hhbWVsaXVtLT5lbnYsIHdpZHRoX21zZWMpOworCWludCBpOworCisJaWd0X2RlYnVnKCJGaXJp bmcgJWQgSFBEIHB1bHNlcyB3aXRoIHdpZHRoIG9mICVkIG1zZWMgb24gJXNcbiIsCisJCSAgY291 bnQsIHdpZHRoX21zZWMsIHBvcnQtPm5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBp KyspCisJCXhtbHJwY19hcnJheV9hcHBlbmRfaXRlbSgmY2hhbWVsaXVtLT5lbnYsIHB1bHNlX3dp ZHRocywgd2lkdGgpOworCisJeG1scnBjX0RFQ1JFRihjaGFtZWxpdW1fcnBjKGNoYW1lbGl1bSwg TlVMTCwgIkZpcmVNaXhlZEhwZFB1bHNlcyIsCisJCQkJICAgICIoaUEpIiwgcG9ydC0+aWQsIHB1 bHNlX3dpZHRocykpOworCisJeG1scnBjX0RFQ1JFRih3aWR0aCk7CisJeG1scnBjX0RFQ1JFRihw dWxzZV93aWR0aHMpOworfQorCisvKioKKyAqIGNoYW1lbGl1bV9maXJlX21peGVkX2hwZF9wdWxz ZXM6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQorICogQHBv cnQ6IFRoZSBwb3J0IHRvIGZpcmUgdGhlIEhQRCBwdWxzZXMgb24KKyAqIEAuLi46IFRoZSBsZW5n dGggb2YgZWFjaCBwdWxzZSBpbiBtaWxsaXNlY29uZHMsIHRlcm1pbmF0ZWQgd2l0aCBhICUwCisg KgorICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyAjY2hhbWVsaXVtX2ZpcmVfaHBkX3B1bHNlcywg YnV0IGFsbG93cyB0aGUgY2FsbGVyIHRvCisgKiBzcGVjaWZ5IHRoZSBsZW5ndGggb2YgZWFjaCBp bmRpdmlkdWFsIHB1bHNlLgorICovCit2b2lkIGNoYW1lbGl1bV9maXJlX21peGVkX2hwZF9wdWxz ZXMoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJCSAgICAgc3RydWN0IGNoYW1lbGl1 bV9wb3J0ICpwb3J0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXhtbHJwY192YWx1ZSAqcHVs c2Vfd2lkdGhzID0geG1scnBjX2FycmF5X25ldygmY2hhbWVsaXVtLT5lbnYpLCAqd2lkdGg7CisJ aW50IGFyZzsKKworCWlndF9kZWJ1ZygiRmlyaW5nIG1peGVkIEhQRCBwdWxzZXMgb24gJXNcbiIs IHBvcnQtPm5hbWUpOworCisJdmFfc3RhcnQoYXJncywgcG9ydCk7CisJZm9yIChhcmcgPSB2YV9h cmcoYXJncywgaW50KTsgYXJnOyBhcmcgPSB2YV9hcmcoYXJncywgaW50KSkgeworCQl3aWR0aCA9 IHhtbHJwY19pbnRfbmV3KCZjaGFtZWxpdW0tPmVudiwgYXJnKTsKKwkJeG1scnBjX2FycmF5X2Fw cGVuZF9pdGVtKCZjaGFtZWxpdW0tPmVudiwgcHVsc2Vfd2lkdGhzLCB3aWR0aCk7CisJCXhtbHJw Y19ERUNSRUYod2lkdGgpOworCX0KKwl2YV9lbmQoYXJncyk7CisKKwl4bWxycGNfREVDUkVGKGNo YW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxMLCAiRmlyZU1peGVkSHBkUHVsc2VzIiwKKwkJCQkg ICAgIihpQSkiLCBwb3J0LT5pZCwgcHVsc2Vfd2lkdGhzKSk7CisKKwl4bWxycGNfREVDUkVGKHB1 bHNlX3dpZHRocyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzeW5jX3JwY19oYW5kbGVyKGNvbnN0IGNo YXIgKnNlcnZlcl91cmwsIGNvbnN0IGNoYXIgKm1ldGhvZF9uYW1lLAorCQkJICAgICAgeG1scnBj X3ZhbHVlICpwYXJhbV9hcnJheSwgdm9pZCAqdXNlcl9kYXRhLAorCQkJICAgICAgeG1scnBjX2Vu diAqZmF1bHQsIHhtbHJwY192YWx1ZSAqcmVzdWx0KQoreworCS8qIFdlIGRvbid0IGNhcmUgYWJv dXQgdGhlIHJlc3BvbnNlcyAqLworfQorCisvKioKKyAqIGNoYW1lbGl1bV9hc3luY19ocGRfcHVs c2Vfc3RhcnQ6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQor ICogQHBvcnQ6IFRoZSBwb3J0IHRvIGZpcmUgdGhlIEhQRCBwdWxzZXMgb24KKyAqIEBoaWdoOiBX aGV0aGVyIHRvIGZpcmUgYSBoaWdoIHB1bHNlIChlLmcuIHNpbXVsYXRlIGEgY29ubmVjdCksIG9y IGEgbG93CisgKiBwdWxzZSAoZS5nLiBzaW11bGF0ZSBhIGRpc2Nvbm5lY3QpCisgKiBAZGVsYXlf c2VjczogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyB0aGUgSFBEIHB1bHNlLgorICoK KyAqIEluc3RydWN0cyB0aGUgY2hhbWVsaXVtIHRvIHNlbmQgYW4gaHBkIHB1bHNlIGFmdGVyIEBk ZWxheV9zZWNzIHNlY29uZHMgaGF2ZQorICogcGFzc2VkLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRo ZSBjaGFtZWxpdW0gdG8gZmluaXNoLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAqIHRlc3RpbmcgdGhp bmdzIHN1Y2ggYXMgaHBkIGFmdGVyIGEgc3VzcGVuZC9yZXN1bWUgY3ljbGUsIHNpbmNlIHdlIGNh bid0IHRlbGwKKyAqIHRoZSBjaGFtZWxpdW0gdG8gc2VuZCBhIGhvdHBsdWcgYXQgdGhlIHNhbWUg dGltZSB0aGF0IG91ciBzeXN0ZW0gaXMKKyAqIHN1c3BlbmRlZC4KKyAqCisgKiBJdCBpcyByZXF1 aXJlZCB0aGF0IHRoZSB1c2VyIGV2ZW50dWFsbHkgY2FsbAorICogI2NoYW1lbGl1bV9hc3luY19o cGRfcHVsc2VfZmluaXNoLCB0byBjbGVhbiB1cCB0aGUgbGVmdG92ZXIgWE1MLVJQQworICogcmVz cG9uc2VzIGZyb20gdGhlIGNoYW1lbGl1bS4KKyAqLwordm9pZCBjaGFtZWxpdW1fYXN5bmNfaHBk X3B1bHNlX3N0YXJ0KHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwKKwkJCQkgICAgIHN0cnVj dCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCQkgICAgIGJvb2wgaGlnaCwgaW50IGRlbGF5X3Nl Y3MpCit7CisJeG1scnBjX3ZhbHVlICpwdWxzZV93aWR0aHMgPSB4bWxycGNfYXJyYXlfbmV3KCZj aGFtZWxpdW0tPmVudiksICp3aWR0aDsKKworCS8qIFRPRE86IEFjdHVhbGx5IGltcGxlbWVudCBz b21ldGhpbmcgaW4gdGhlIGNoYW1lbGVvbiBzZXJ2ZXIgdG8gYWxsb3cKKwkgKiBmb3IgZGVsYXll ZCBhY3Rpb25zIHN1Y2ggYXMgaG90cGx1Z3MuIFRoaXMgd291bGQgd29yayBhIGJpdCBiZXR0ZXIK KwkgKiBhbmQgYWxsb3cgdXMgdG8gdGVzdCBzdXNwZW5kL3Jlc3VtZSBvbiBwb3J0cyB3aXRob3V0 IGhwZCBsaWtlIFZHQQorCSAqLworCisJaWd0X2RlYnVnKCJTZW5kaW5nIEhQRCBwdWxzZSAoJXMp IG9uICVzIHdpdGggJWQgc2Vjb25kIGRlbGF5XG4iLAorCQkgIGhpZ2ggPyAiaGlnaC0+bG93IiA6 ICJsb3ctPmhpZ2giLCBwb3J0LT5uYW1lLCBkZWxheV9zZWNzKTsKKworCS8qIElmIHdlJ3JlIHN0 YXJ0aW5nIGF0IGhpZ2gsIG1ha2UgdGhlIGZpcnN0IHB1bHNlIHdpZHRoIDAgc28gd2Uga2VlcAor CSAqIHRoZSBwb3J0IGNvbm5lY3RlZCAqLworCWlmIChoaWdoKSB7CisJCXdpZHRoID0geG1scnBj X2ludF9uZXcoJmNoYW1lbGl1bS0+ZW52LCAwKTsKKwkJeG1scnBjX2FycmF5X2FwcGVuZF9pdGVt KCZjaGFtZWxpdW0tPmVudiwgcHVsc2Vfd2lkdGhzLCB3aWR0aCk7CisJCXhtbHJwY19ERUNSRUYo d2lkdGgpOworCX0KKworCXdpZHRoID0geG1scnBjX2ludF9uZXcoJmNoYW1lbGl1bS0+ZW52LCBk ZWxheV9zZWNzICogMTAwMCk7CisJeG1scnBjX2FycmF5X2FwcGVuZF9pdGVtKCZjaGFtZWxpdW0t PmVudiwgcHVsc2Vfd2lkdGhzLCB3aWR0aCk7CisJeG1scnBjX0RFQ1JFRih3aWR0aCk7CisKKwl4 bWxycGNfY2xpZW50X3N0YXJ0X3JwY2YoJmNoYW1lbGl1bS0+ZW52LCBjaGFtZWxpdW0tPmNsaWVu dCwKKwkJCQkgY2hhbWVsaXVtLT51cmwsCisJCQkJICJGaXJlTWl4ZWRIcGRQdWxzZXMiLCBhc3lu Y19ycGNfaGFuZGxlciwgTlVMTCwKKwkJCQkgIihpQSkiLCBwb3J0LT5pZCwgcHVsc2Vfd2lkdGhz KTsKKwl4bWxycGNfREVDUkVGKHB1bHNlX3dpZHRocyk7Cit9CisKKy8qKgorICogY2hhbWVsaXVt X2FzeW5jX2hwZF9wdWxzZV9maW5pc2g6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGlu c3RhbmNlIHRvIHVzZQorICoKKyAqIFdhaXRzIGZvciBhbnkgYXN5bmNocm9ub3VzIFJQQyBzdGFy dGVkIGJ5ICNjaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX3N0YXJ0CisgKiB0byBjb21wbGV0ZSwg YW5kIHRoZW4gY2xlYW5zIHVwIGFueSBsZWZ0b3ZlciByZXNwb25zZXMgZnJvbSB0aGUgY2hhbWVs aXVtLgorICogSWYgYWxsIG9mIHRoZSBSUEMgY2FsbHMgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCwg dGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiBpbW1lZGlhdGVseS4KKyAqLwordm9pZCBjaGFtZWxp dW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaChzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0pCit7 CisJeG1scnBjX2NsaWVudF9ldmVudF9sb29wX2ZpbmlzaChjaGFtZWxpdW0tPmNsaWVudCk7Cit9 CisKKy8qKgorICogY2hhbWVsaXVtX25ld19lZGlkOgorICogQGNoYW1lbGl1bTogVGhlIENoYW1l bGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBlZGlkOiBUaGUgZWRpZCBibG9iIHRvIHVwbG9hZCB0 byB0aGUgY2hhbWVsaXVtCisgKgorICogVXBsb2FkcyBhbmQgcmVnaXN0ZXJzIGEgbmV3IEVESUQg d2l0aCB0aGUgY2hhbWVsaXVtLiBUaGUgRURJRCB3aWxsIGJlCisgKiBkZXN0cm95ZWQgYXV0b21h dGljYWxseSB3aGVuICNjaGFtZWxpdW1fZGVpbml0IGlzIGNhbGxlZC4KKyAqCisgKiBSZXR1cm5z OiBUaGUgSUQgb2YgdGhlIEVESUQgdXBsb2FkZWQgdG8gdGhlIGNoYW1lbGl1bS4KKyAqLworaW50 IGNoYW1lbGl1bV9uZXdfZWRpZChzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sIGNvbnN0IHVu c2lnbmVkIGNoYXIgKmVkaWQpCit7CisJeG1scnBjX3ZhbHVlICpyZXM7CisJc3RydWN0IGNoYW1l bGl1bV9lZGlkICphbGxvY2F0ZWRfZWRpZDsKKwlpbnQgZWRpZF9pZDsKKworCXJlcyA9IGNoYW1l bGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxMLCAiQ3JlYXRlRWRpZCIsICIoNikiLAorCQkJICAgIGVk aWQsIEVESURfTEVOR1RIKTsKKworCXhtbHJwY19yZWFkX2ludCgmY2hhbWVsaXVtLT5lbnYsIHJl cywgJmVkaWRfaWQpOworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCWFsbG9jYXRlZF9lZGlkID0g bWFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbWVsaXVtX2VkaWQpKTsKKwltZW1zZXQoYWxsb2NhdGVk X2VkaWQsIDAsIHNpemVvZigqYWxsb2NhdGVkX2VkaWQpKTsKKworCWFsbG9jYXRlZF9lZGlkLT5p ZCA9IGVkaWRfaWQ7CisJaWd0X2xpc3RfaW5pdCgmYWxsb2NhdGVkX2VkaWQtPmxpbmspOworCisJ aWYgKGNoYW1lbGl1bS0+ZWRpZHMpCisJCWlndF9saXN0X2FkZCgmY2hhbWVsaXVtLT5lZGlkcy0+ bGluaywgJmFsbG9jYXRlZF9lZGlkLT5saW5rKTsKKwllbHNlCisJCWNoYW1lbGl1bS0+ZWRpZHMg PSBhbGxvY2F0ZWRfZWRpZDsKKworCXJldHVybiBlZGlkX2lkOworfQorCitzdGF0aWMgdm9pZCBj aGFtZWxpdW1fZGVzdHJveV9lZGlkKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwgaW50IGVk aWRfaWQpCit7CisJeG1scnBjX0RFQ1JFRihjaGFtZWxpdW1fcnBjKGNoYW1lbGl1bSwgTlVMTCwg IkRlc3Ryb3lFZGlkIiwgIihpKSIsCisJCQkJICAgIGVkaWRfaWQpKTsKK30KKworLyoqCisgKiBj aGFtZWxpdW1fcG9ydF9zZXRfZWRpZDoKKyAqIEBjaGFtZWxpdW06IFRoZSBDaGFtZWxpdW0gaW5z dGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhlIHBvcnQgb24gdGhlIENoYW1lbGl1bSB0byBzZXQg dGhlIEVESUQgb24KKyAqIEBlZGlkX2lkOiBUaGUgSUQgb2YgYW4gRURJRCBvbiB0aGUgY2hhbWVs aXVtIGNyZWF0ZWQgd2l0aAorICogI2NoYW1lbGl1bV9uZXdfZWRpZCwgb3IgMCB0byBkaXNhYmxl IHRoZSBFRElEIG9uIHRoZSBwb3J0CisgKgorICogU2V0cyBhIHBvcnQgb24gdGhlIGNoYW1lbGl1 bSB0byB1c2UgdGhlIHNwZWNpZmllZCBFRElELiBUaGlzIGRvZXMgbm90IGZpcmUgYQorICogaG90 cGx1ZyBwdWxzZSBvbiBpdCdzIG93biwgYW5kIG1lcmVseSBjaGFuZ2VzIHdoYXQgRURJRCB0aGUg Y2hhbWVsaXVtIHBvcnQKKyAqIHdpbGwgcmVwb3J0IHRvIHVzIHRoZSBuZXh0IHRpbWUgd2UgcHJv YmUgaXQuIFVzZXJzIHdpbGwgbmVlZCB0byByZXByb2JlIHRoZQorICogY29ubmVjdG9ycyB0aGVt c2VsdmVzIGlmIHRoZXkgd2FudCB0byBzZWUgdGhlIEVESUQgcmVwb3J0ZWQgYnkgdGhlIHBvcnQK KyAqIGNoYW5nZS4KKyAqLwordm9pZCBjaGFtZWxpdW1fcG9ydF9zZXRfZWRpZChzdHJ1Y3QgY2hh bWVsaXVtICpjaGFtZWxpdW0sCisJCQkgICAgIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwg aW50IGVkaWRfaWQpCit7CisJeG1scnBjX0RFQ1JFRihjaGFtZWxpdW1fcnBjKGNoYW1lbGl1bSwg TlVMTCwgIkFwcGx5RWRpZCIsICIoaWkpIiwKKwkJCQkgICAgcG9ydC0+aWQsIGVkaWRfaWQpKTsK K30KKworLyoqCisgKiBjaGFtZWxpdW1fcG9ydF9zZXRfZGRjX3N0YXRlOgorICogQGNoYW1lbGl1 bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBwb3J0OiBUaGUgcG9ydCB0byBj aGFuZ2UgdGhlIEREQyBzdGF0ZSBvbgorICogQGVuYWJsZWQ6IFdoZXRoZXIgb3Igbm90IHRvIGVu YWJsZSB0aGUgRERDIGJ1cworICoKKyAqIFRoaXMgZGlzYWJsZXMgdGhlIEREQyBidXMgKGUuZy4g dGhlIGkyYyBsaW5lIG9uIHRoZSBjb25uZWN0b3IgdGhhdCBnaXZlcyB1cworICogYW4gRURJRCkg b2YgdGhlIHNwZWNpZmllZCBwb3J0IG9uIHRoZSBjaGFtZWxpdW0uIFRoaXMgaXMgdXNlZnVsIGZv ciB0ZXN0aW5nCisgKiBiZWhhdmlvciBvbiBsZWdhY3kgY29ubmVjdG9ycyBzdWNoIGFzIFZHQSwg d2hlcmUgdGhlIHByZXNlbmNlIG9mIGEgRERDIGJ1cworICogaXMgbm90IGFsd2F5cyBndWFyYW50 ZWVkLgorICovCit2b2lkIGNoYW1lbGl1bV9wb3J0X3NldF9kZGNfc3RhdGUoc3RydWN0IGNoYW1l bGl1bSAqY2hhbWVsaXVtLAorCQkJCSAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0LAorCQkJ CSAgYm9vbCBlbmFibGVkKQoreworCWlndF9kZWJ1ZygiJXNhYmxpbmcgRERDIGJ1cyBvbiAlc1xu IiwKKwkJICBlbmFibGVkID8gIkVuIiA6ICJEaXMiLCBwb3J0LT5uYW1lKTsKKworCXhtbHJwY19E RUNSRUYoY2hhbWVsaXVtX3JwYyhjaGFtZWxpdW0sIE5VTEwsICJTZXREZGNTdGF0ZSIsICIoaWIp IiwKKwkJCQkgICAgcG9ydC0+aWQsIGVuYWJsZWQpKTsKK30KKworLyoqCisgKiBjaGFtZWxpdW1f cG9ydF9nZXRfZGRjX3N0YXRlOgorICogQGNoYW1lbGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5j ZSB0byB1c2UKKyAqIEBwb3J0OiBUaGUgcG9ydCBvbiB0aGUgQ2hhbWVsaXVtIHRvIGNoZWNrIHRo ZSBzdGF0dXMgb2YKKyAqCisgKiBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgRERDIGJ1cyBvbiB0 aGUgc3BlY2lmaWVkIGNoYW1lbGl1bSBwb3J0IGlzIGVuYWJsZWQKKyAqIG9yIG5vdC4KKyAqCisg KiBSZXR1cm5zOiAldHJ1ZSBpZiB0aGUgRERDIGJ1cyBpcyBlbmFibGVkLCAlZmFsc2Ugb3RoZXJ3 aXNlLgorICovCitib29sIGNoYW1lbGl1bV9wb3J0X2dldF9kZGNfc3RhdGUoc3RydWN0IGNoYW1l bGl1bSAqY2hhbWVsaXVtLAorCQkJCSAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQorewor CXhtbHJwY192YWx1ZSAqcmVzOworCXhtbHJwY19ib29sIGVuYWJsZWQ7CisKKwlyZXMgPSBjaGFt ZWxpdW1fcnBjKGNoYW1lbGl1bSwgTlVMTCwgIklzRGRjRW5hYmxlZCIsICIoaSkiLCBwb3J0LT5p ZCk7CisJeG1scnBjX3JlYWRfYm9vbCgmY2hhbWVsaXVtLT5lbnYsIHJlcywgJmVuYWJsZWQpOwor CisJeG1scnBjX0RFQ1JFRihyZXMpOworCXJldHVybiBlbmFibGVkOworfQorCisvKioKKyAqIGNo YW1lbGl1bV9wb3J0X2dldF9yZXNvbHV0aW9uOgorICogQGNoYW1lbGl1bTogVGhlIENoYW1lbGl1 bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBwb3J0OiBUaGUgcG9ydCBvbiB0aGUgQ2hhbWVsaXVtIHRv IGNoZWNrCisgKiBAeDogV2hlcmUgdG8gc3RvcmUgdGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBv ZiB0aGUgcG9ydAorICogQHk6IFdoZXJlIHRvIHN0b3JlIHRoZSB2ZXJpY2FsIHJlc29sdXRpb24g b2YgdGhlIHBvcnQKKyAqCisgKiBDaGVjayB0aGUgY3VycmVudCByZXBvcnRlZCBkaXNwbGF5IHJl c29sdXRpb24gb2YgdGhlIHNwZWNpZmllZCBwb3J0IG9uIHRoZQorICogY2hhbWVsaXVtLiBUaGlz IGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZSBjaGFtZWxpdW0gaXRzZWxmLCBub3QgRFJN LgorICogVXNlZnVsIGZvciB2ZXJpZnlpbmcgdGhhdCB3ZSByZWFsbHkgYXJlIHNjYW5uaW5nIG91 dCBhdCB0aGUgcmVzb2x1dGlvbiB3ZQorICogdGhpbmsgd2UgYXJlLgorICovCit2b2lkIGNoYW1l bGl1bV9wb3J0X2dldF9yZXNvbHV0aW9uKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwKKwkJ CQkgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsCisJCQkJICAgaW50ICp4LCBpbnQgKnkp Cit7CisJeG1scnBjX3ZhbHVlICpyZXMsICpyZXNfeCwgKnJlc195OworCisJcmVzID0gY2hhbWVs aXVtX3JwYyhjaGFtZWxpdW0sIHBvcnQsICJEZXRlY3RSZXNvbHV0aW9uIiwgIihpKSIsCisJCQkg ICAgcG9ydC0+aWQpOworCisJeG1scnBjX2FycmF5X3JlYWRfaXRlbSgmY2hhbWVsaXVtLT5lbnYs IHJlcywgMCwgJnJlc194KTsKKwl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZjaGFtZWxpdW0tPmVu diwgcmVzLCAxLCAmcmVzX3kpOworCXhtbHJwY19yZWFkX2ludCgmY2hhbWVsaXVtLT5lbnYsIHJl c194LCB4KTsKKwl4bWxycGNfcmVhZF9pbnQoJmNoYW1lbGl1bS0+ZW52LCByZXNfeSwgeSk7CisK Kwl4bWxycGNfREVDUkVGKHJlc194KTsKKwl4bWxycGNfREVDUkVGKHJlc195KTsKKwl4bWxycGNf REVDUkVGKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW1lbGl1bV9nZXRfY2FwdHVyZWRfcmVz b2x1dGlvbihzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJCSAgICAgIGludCAqdywg aW50ICpoKQoreworCXhtbHJwY192YWx1ZSAqcmVzLCAqcmVzX3csICpyZXNfaDsKKworCXJlcyA9 IGNoYW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxMLCAiR2V0Q2FwdHVyZWRSZXNvbHV0aW9uIiwg IigpIik7CisKKwl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZjaGFtZWxpdW0tPmVudiwgcmVzLCAw LCAmcmVzX3cpOworCXhtbHJwY19hcnJheV9yZWFkX2l0ZW0oJmNoYW1lbGl1bS0+ZW52LCByZXMs IDEsICZyZXNfaCk7CisJeG1scnBjX3JlYWRfaW50KCZjaGFtZWxpdW0tPmVudiwgcmVzX3csIHcp OworCXhtbHJwY19yZWFkX2ludCgmY2hhbWVsaXVtLT5lbnYsIHJlc19oLCBoKTsKKworCXhtbHJw Y19ERUNSRUYocmVzX3cpOworCXhtbHJwY19ERUNSRUYocmVzX2gpOworCXhtbHJwY19ERUNSRUYo cmVzKTsKK30KKworc3RhdGljIHN0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVtcCAqZnJhbWVfZnJv bV94bWwoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJCQkJICAgeG1scnBjX3ZhbHVl ICpmcmFtZV94bWwpCit7CisJc3RydWN0IGNoYW1lbGl1bV9mcmFtZV9kdW1wICpyZXQgPSBtYWxs b2Moc2l6ZW9mKCpyZXQpKTsKKworCWNoYW1lbGl1bV9nZXRfY2FwdHVyZWRfcmVzb2x1dGlvbihj aGFtZWxpdW0sICZyZXQtPndpZHRoLCAmcmV0LT5oZWlnaHQpOworCXJldC0+cG9ydCA9IGNoYW1l bGl1bS0+Y2FwdHVyaW5nX3BvcnQ7CisJeG1scnBjX3JlYWRfYmFzZTY0KCZjaGFtZWxpdW0tPmVu diwgZnJhbWVfeG1sLCAmcmV0LT5zaXplLAorCQkJICAgKHZvaWQqKSZyZXQtPmJncik7CisKKwly ZXR1cm4gcmV0OworfQorCisvKioKKyAqIGNoYW1lbGl1bV9wb3J0X2R1bXBfcGl4ZWxzOgorICog QGNoYW1lbGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBwb3J0OiBUaGUg cG9ydCB0byBwZXJmb3JtIHRoZSB2aWRlbyBjYXB0dXJlIG9uCisgKiBAeDogVGhlIFggY29vcmRp bmF0ZSB0byBjcm9wIHRoZSBzY3JlZW4gY2FwdHVyZSB0bworICogQHk6IFRoZSBZIGNvb3JkaW5h dGUgdG8gY3JvcCB0aGUgc2NyZWVuIGNhcHR1cmUgdG8KKyAqIEB3OiBUaGUgd2lkdGggb2YgdGhl IGFyZWEgdG8gY3JvcCB0aGUgc2NyZWVuIGNhcHR1cmUgdG8sIG9yIDAgZm9yIHRoZSB3aG9sZQor ICogc2NyZWVuCisgKiBAaDogVGhlIGhlaWdodCBvZiB0aGUgYXJlYSB0byBjcm9wIHRoZSBzY3Jl ZW4gY2FwdHVyZSB0bywgb3IgMCBmb3IgdGhlIHdob2xlCisgKiBzY3JlZW4KKyAqCisgKiBDYXB0 dXJlcyB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBpbWFnZSBvbiB0aGUgZ2l2ZW4gY2hhbWVsaXVt IHBvcnQsCisgKiBvcHRpb25hbGx5IGNyb3BwZWQgdG8gYSBnaXZlbiByZWdpb24uIEluIHNpdHVh dGlvbnMgd2hlcmUgcHJlLWNhbGN1bGF0aW5nCisgKiBDUkNzIG1heSBub3QgYmUgcmVsaWFibGUs IHRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGZpZ3VyaW5nCisgKiBvdXQg d2hldGhlciBvciBub3QgdGhlIGNvcnJlY3QgaW1hZ2VzIGFyZSBiZWluZyBkaXNwbGF5ZWQgb24g dGhlIHNjcmVlbi4KKyAqCisgKiBUaGUgZnJhbWUgZHVtcCBkYXRhIHJldHVybmVkIGJ5IHRoaXMg ZnVuY3Rpb24gc2hvdWxkIGJlIGZyZWVkIHdoZW4gdGhlCisgKiBjYWxsZXIgaXMgZG9uZSB3aXRo IGl0IHVzaW5nICNjaGFtZWxpdW1fZGVzdHJveV9mcmFtZV9kdW1wLgorICoKKyAqIEFzIGFuIGlt cG9ydGFudCBub3RlOiBzb21lIG9mIHRoZSBFRElEcyBwcm92aWRlZCBieSB0aGUgQ2hhbWVsaXVt IGNhdXNlCisgKiBjZXJ0YWluIEdQVSBkcml2ZXJzIHRvIGRlZmF1bHQgdG8gdXNpbmcgbGltaXRl ZCBjb2xvciByYW5nZXMuIFRoaXMgY2FuIGNhdXNlCisgKiB2aWRlbyBjYXB0dXJlcyBmcm9tIHRo ZSBDaGFtZWxpdW0gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW1hZ2VzIHRoZW4gZXhwZWN0ZWQKKyAq IGR1ZSB0byB0aGUgZGlmZmVyZW5jZSBpbiBjb2xvciByYW5nZXMgKGZyYW1lYnVmZmVyIHVzZXMg ZnVsbCBjb2xvciByYW5nZSwKKyAqIGJ1dCB0aGUgdmlkZW8gb3V0cHV0IGRvZXNuJ3QpLCBhbmQg YXMgYSByZXN1bHQgbGVhZCB0byBDUkMgbWlzbWF0Y2hlcy4gVG8KKyAqIHdvcmthcm91bmQgdGhp cywgdGhlIGNhbGxlciBzaG91bGQgZm9yY2UgdGhlIGNvbm5lY3RvciB0byB1c2UgZnVsbCBjb2xv cgorICogcmFuZ2VzIGJ5IHVzaW5nICNrbXN0ZXN0X3NldF9jb25uZWN0b3JfYnJvYWRjYXN0X3Jn YiBiZWZvcmUgc2V0dGluZyB1cCB0aGUKKyAqIGRpc3BsYXkuCisgKgorICogUmV0dXJuczogYSBj aGFtZWxpdW1fZnJhbWVfZHVtcCBzdHJ1Y3QKKyAqLworc3RydWN0IGNoYW1lbGl1bV9mcmFtZV9k dW1wICpjaGFtZWxpdW1fcG9ydF9kdW1wX3BpeGVscyhzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxp dW0sCisJCQkJCQkJc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0LAorCQkJCQkJCWludCB4LCBp bnQgeSwKKwkJCQkJCQlpbnQgdywgaW50IGgpCit7CisJeG1scnBjX3ZhbHVlICpyZXM7CisJc3Ry dWN0IGNoYW1lbGl1bV9mcmFtZV9kdW1wICpmcmFtZTsKKworCXJlcyA9IGNoYW1lbGl1bV9ycGMo Y2hhbWVsaXVtLCBwb3J0LCAiRHVtcFBpeGVscyIsCisJCQkgICAgKHcgJiYgaCkgPyAiKGlpaWlp KSIgOiAiKGlubm5uKSIsCisJCQkgICAgcG9ydC0+aWQsIHgsIHksIHcsIGgpOworCWNoYW1lbGl1 bS0+Y2FwdHVyaW5nX3BvcnQgPSBwb3J0OworCisJZnJhbWUgPSBmcmFtZV9mcm9tX3htbChjaGFt ZWxpdW0sIHJlcyk7CisJeG1scnBjX0RFQ1JFRihyZXMpOworCisJcmV0dXJuIGZyYW1lOworfQor CitzdGF0aWMgdm9pZCBjcmNfZnJvbV94bWwoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAor CQkJIHhtbHJwY192YWx1ZSAqeG1sX2NyYywgaWd0X2NyY190ICpvdXQpCit7CisJeG1scnBjX3Zh bHVlICpyZXM7CisJaW50IGk7CisKKwlvdXQtPm5fd29yZHMgPSB4bWxycGNfYXJyYXlfc2l6ZSgm Y2hhbWVsaXVtLT5lbnYsIHhtbF9jcmMpOworCWZvciAoaSA9IDA7IGkgPCBvdXQtPm5fd29yZHM7 IGkrKykgeworCQl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZjaGFtZWxpdW0tPmVudiwgeG1sX2Ny YywgaSwgJnJlcyk7CisJCXhtbHJwY19yZWFkX2ludCgmY2hhbWVsaXVtLT5lbnYsIHJlcywgKGlu dCopJm91dC0+Y3JjW2ldKTsKKwkJeG1scnBjX0RFQ1JFRihyZXMpOworCX0KK30KKworLyoqCisg KiBjaGFtZWxpdW1fZ2V0X2NyY19mb3JfYXJlYToKKyAqIEBjaGFtZWxpdW06IFRoZSBDaGFtZWxp dW0gaW5zdGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhlIHBvcnQgdG8gcGVyZm9ybSB0aGUgQ1JD IGNoZWNraW5nIG9uCisgKiBAeDogVGhlIFggY29vcmRpbmF0ZSBvbiB0aGUgZW11bGF0ZWQgZGlz cGxheSB0byBzdGFydCBjYWxjdWxhdGluZyB0aGUgQ1JDCisgKiBmcm9tCisgKiBAeTogVGhlIFkg Y29vcmRpbmF0ZSBvbiB0aGUgZW11bGF0ZWQgZGlzcGxheSB0byBzdGFydCBjYWxjdWxhdGluZyB0 aGUgQ1JDCisgKiBmcm9tCisgKiBAdzogVGhlIHdpZHRoIG9mIHRoZSBhcmVhIHRvIGZldGNoIHRo ZSBDUkMgZnJvbSwgb3IgJTAgZm9yIHRoZSB3aG9sZSBkaXNwbGF5CisgKiBAaDogVGhlIGhlaWdo dCBvZiB0aGUgYXJlYSB0byBmZXRjaCB0aGUgQ1JDIGZyb20sIG9yICUwIGZvciB0aGUgd2hvbGUg ZGlzcGxheQorICoKKyAqIFJlYWRzIGJhY2sgdGhlIHBpeGVsIENSQyBmb3IgYW4gYXJlYSBvbiB0 aGUgc3BlY2lmaWVkIGNoYW1lbGl1bSBwb3J0LiBUaGlzCisgKiBpcyB0aGUgc2FtZSBhcyB1c2lu ZyB0aGUgQ1JDIHJlYWRiYWNrIGZyb20gYSBHUFUsIHRoZSBtYWluIGRpZmZlcmVuY2UgYmVpbmcK KyAqIHRoZSBkYXRhIGlzIHByb3ZpZGVkIGJ5IHRoZSBjaGFtZWxpdW0gYW5kIGFsc28gYWxsb3dz IHVzIHRvIHNwZWNpZnkgYSByZWdpb24KKyAqIG9mIHRoZSBzY3JlZW4gdG8gdXNlIGFzIG9wcG9z ZWQgdG8gdGhlIGVudGlyZSB0aGluZy4KKyAqCisgKiBBcyBhbiBpbXBvcnRhbnQgbm90ZTogc29t ZSBvZiB0aGUgRURJRHMgcHJvdmlkZWQgYnkgdGhlIENoYW1lbGl1bSBjYXVzZQorICogY2VydGFp biBHUFUgZHJpdmVycyB0byBkZWZhdWx0IHRvIHVzaW5nIGxpbWl0ZWQgY29sb3IgcmFuZ2VzLiBU aGlzIGNhbiBjYXVzZQorICogdmlkZW8gY2FwdHVyZXMgZnJvbSB0aGUgQ2hhbWVsaXVtIHRvIHBy b3ZpZGUgZGlmZmVyZW50IGltYWdlcyB0aGVuIGV4cGVjdGVkCisgKiBkdWUgdG8gdGhlIGRpZmZl cmVuY2UgaW4gY29sb3IgcmFuZ2VzIChmcmFtZWJ1ZmZlciB1c2VzIGZ1bGwgY29sb3IgcmFuZ2Us CisgKiBidXQgdGhlIHZpZGVvIG91dHB1dCBkb2Vzbid0KSwgYW5kIGFzIGEgcmVzdWx0IGxlYWQg dG8gQ1JDIG1pc21hdGNoZXMuIFRvCisgKiB3b3JrYXJvdW5kIHRoaXMsIHRoZSBjYWxsZXIgc2hv dWxkIGZvcmNlIHRoZSBjb25uZWN0b3IgdG8gdXNlIGZ1bGwgY29sb3IKKyAqIHJhbmdlcyBieSB1 c2luZyAja21zdGVzdF9zZXRfY29ubmVjdG9yX2Jyb2FkY2FzdF9yZ2IgYmVmb3JlIHNldHRpbmcg dXAgdGhlCisgKiBkaXNwbGF5LgorICoKKyAqIEFmdGVyIHRoZSBjYWxsZXIgaXMgZmluaXNoZWQg d2l0aCB0aGUgRURJRCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGUKKyAqIGNhbGxlciBz aG91bGQgbWFudWFsbHkgZnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAq CisgKiBSZXR1cm5zOiBUaGUgQ1JDIHJlYWQgYmFjayBmcm9tIHRoZSBjaGFtZWxpdW0KKyAqLwor aWd0X2NyY190ICpjaGFtZWxpdW1fZ2V0X2NyY19mb3JfYXJlYShzdHJ1Y3QgY2hhbWVsaXVtICpj aGFtZWxpdW0sCisJCQkJICAgICAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0LAorCQkJCSAg ICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworCXhtbHJwY192YWx1ZSAqcmVzOwor CWlndF9jcmNfdCAqcmV0ID0gbWFsbG9jKHNpemVvZihpZ3RfY3JjX3QpKTsKKworCXJlcyA9IGNo YW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBwb3J0LCAiQ29tcHV0ZVBpeGVsQ2hlY2tzdW0iLAorCQkJ ICAgICh3ICYmIGgpID8gIihpaWlpaSkiIDogIihpbm5ubikiLAorCQkJICAgIHBvcnQtPmlkLCB4 LCB5LCB3LCBoKTsKKwljaGFtZWxpdW0tPmNhcHR1cmluZ19wb3J0ID0gcG9ydDsKKworCWNyY19m cm9tX3htbChjaGFtZWxpdW0sIHJlcywgcmV0KTsKKwl4bWxycGNfREVDUkVGKHJlcyk7CisKKwly ZXR1cm4gcmV0OworfQorCisvKioKKyAqIGNoYW1lbGl1bV9zdGFydF9jYXB0dXJlOgorICogQGNo YW1lbGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBwb3J0OiBUaGUgcG9y dCB0byBwZXJmb3JtIHRoZSB2aWRlbyBjYXB0dXJlIG9uCisgKiBAeDogVGhlIFggY29vcmRpbmF0 ZSB0byBjcm9wIHRoZSB2aWRlbyB0bworICogQHk6IFRoZSBZIGNvb3JkaW5hdGUgdG8gY3JvcCB0 aGUgdmlkZW8gdG8KKyAqIEB3OiBUaGUgd2lkdGggb2YgdGhlIGNyb3BwZWQgdmlkZW8sIG9yICUw IGZvciB0aGUgd2hvbGUgZGlzcGxheQorICogQGg6IFRoZSBoZWlnaHQgb2YgdGhlIGNyb3BwZWQg dmlkZW8sIG9yICUwIGZvciB0aGUgd2hvbGUgZGlzcGxheQorICoKKyAqIFN0YXJ0cyBjYXB0dXJp bmcgdmlkZW8gZnJhbWVzIG9uIHRoZSBnaXZlbiBDaGFtZWxpdW0gcG9ydC4gT25jZSB0aGUgdXNl ciBpcworICogZmluaXNoZWQgY2FwdHVyaW5nIGZyYW1lcywgdGhleSBzaG91bGQgY2FsbCAjY2hh bWVsaXVtX3N0b3BfY2FwdHVyZS4KKyAqCisgKiBBIGJsb2NraW5nLCBvbmUtc2hvdCB2ZXJzaW9u IG9mIHRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlOiBzZWUKKyAqICNjaGFtZWxpdW1fY2FwdHVy ZQorICoKKyAqIEFzIGFuIGltcG9ydGFudCBub3RlOiBzb21lIG9mIHRoZSBFRElEcyBwcm92aWRl ZCBieSB0aGUgQ2hhbWVsaXVtIGNhdXNlCisgKiBjZXJ0YWluIEdQVSBkcml2ZXJzIHRvIGRlZmF1 bHQgdG8gdXNpbmcgbGltaXRlZCBjb2xvciByYW5nZXMuIFRoaXMgY2FuIGNhdXNlCisgKiB2aWRl byBjYXB0dXJlcyBmcm9tIHRoZSBDaGFtZWxpdW0gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW1hZ2Vz IHRoZW4gZXhwZWN0ZWQKKyAqIGR1ZSB0byB0aGUgZGlmZmVyZW5jZSBpbiBjb2xvciByYW5nZXMg KGZyYW1lYnVmZmVyIHVzZXMgZnVsbCBjb2xvciByYW5nZSwKKyAqIGJ1dCB0aGUgdmlkZW8gb3V0 cHV0IGRvZXNuJ3QpLCBhbmQgYXMgYSByZXN1bHQgbGVhZCB0byBDUkMgYW5kIGZyYW1lIGR1bXAK KyAqIGNvbXBhcmlzb24gbWlzbWF0Y2hlcy4gVG8gd29ya2Fyb3VuZCB0aGlzLCB0aGUgY2FsbGVy IHNob3VsZCBmb3JjZSB0aGUKKyAqIGNvbm5lY3RvciB0byB1c2UgZnVsbCBjb2xvciByYW5nZXMg YnkgdXNpbmcKKyAqICNrbXN0ZXN0X3NldF9jb25uZWN0b3JfYnJvYWRjYXN0X3JnYiBiZWZvcmUg c2V0dGluZyB1cCB0aGUgZGlzcGxheS4KKyAqLwordm9pZCBjaGFtZWxpdW1fc3RhcnRfY2FwdHVy ZShzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkgICAgIHN0cnVjdCBjaGFtZWxpdW1f cG9ydCAqcG9ydCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisJeG1scnBjX0RFQ1JF RihjaGFtZWxpdW1fcnBjKGNoYW1lbGl1bSwgcG9ydCwgIlN0YXJ0Q2FwdHVyaW5nVmlkZW8iLAor CQkJCSAgICAodyAmJiBoKSA/ICIoaWlpaWkpIiA6ICIoaW5ubm4pIiwKKwkJCQkgICAgcG9ydC0+ aWQsIHgsIHksIHcsIGgpKTsKKwljaGFtZWxpdW0tPmNhcHR1cmluZ19wb3J0ID0gcG9ydDsKK30K KworLyoqCisgKiBjaGFtZWxpdW1fc3RvcF9jYXB0dXJlOgorICogQGNoYW1lbGl1bTogVGhlIENo YW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBmcmFtZV9jb3VudDogVGhlIG51bWJlciBvZiBm cmFtZXMgdG8gd2FpdCB0byBjYXB0dXJlLCBvciAlMCB0byBzdG9wCisgKiBpbW1lZGlhdGVseQor ICoKKyAqIEZpbmlzaGVzIGNhcHR1cmluZyB2aWRlbyBmcmFtZXMgb24gdGhlIGdpdmVuIENoYW1l bGl1bSBwb3J0LiBJZiBAZnJhbWVfY291bnQKKyAqIGlzIHNwZWNpZmllZCwgdGhpcyBjYWxsIHdp bGwgYmxvY2sgdW50aWwgdGhlIGdpdmVuIG51bWJlciBvZiBmcmFtZXMgaGF2ZSBiZWVuCisgKiBj YXB0dXJlZC4KKyAqLwordm9pZCBjaGFtZWxpdW1fc3RvcF9jYXB0dXJlKHN0cnVjdCBjaGFtZWxp dW0gKmNoYW1lbGl1bSwgaW50IGZyYW1lX2NvdW50KQoreworCXhtbHJwY19ERUNSRUYoY2hhbWVs aXVtX3JwYyhjaGFtZWxpdW0sIE5VTEwsICJTdG9wQ2FwdHVyaW5nVmlkZW8iLAorCQkJCSAgICAi KGkpIiwgZnJhbWVfY291bnQpKTsKK30KKworLyoqCisgKiBjaGFtZWxpdW1fY2FwdHVyZToKKyAq IEBjaGFtZWxpdW06IFRoZSBDaGFtZWxpdW0gaW5zdGFuY2UgdG8gdXNlCisgKiBAcG9ydDogVGhl IHBvcnQgdG8gcGVyZm9ybSB0aGUgdmlkZW8gY2FwdHVyZSBvbgorICogQHg6IFRoZSBYIGNvb3Jk aW5hdGUgdG8gY3JvcCB0aGUgdmlkZW8gdG8KKyAqIEB5OiBUaGUgWSBjb29yZGluYXRlIHRvIGNy b3AgdGhlIHZpZGVvIHRvCisgKiBAdzogVGhlIHdpZHRoIG9mIHRoZSBjcm9wcGVkIHZpZGVvLCBv ciAlMCBmb3IgdGhlIHdob2xlIGRpc3BsYXkKKyAqIEBoOiBUaGUgaGVpZ2h0IG9mIHRoZSBjcm9w cGVkIHZpZGVvLCBvciAlMCBmb3IgdGhlIHdob2xlIGRpc3BsYXkKKyAqIEBmcmFtZV9jb3VudDog VGhlIG51bWJlciBvZiBmcmFtZXMgdG8gY2FwdHVyZQorICoKKyAqIENhcHR1cmVzIHRoZSBnaXZl biBudW1iZXIgb2YgZnJhbWVzIG9uIHRoZSBjaGFtZWxpdW0uIFRoaXMgaXMgZXF1aXZhbGVudCB0 bworICogY2FsbGluZyAjY2hhbWVsaXVtX3N0YXJ0X2NhcHR1cmUgaW1tZWRpYXRlbHkgZm9sbG93 ZWQgYnkKKyAqICNjaGFtZWxpdW1fc3RvcF9jYXB0dXJlLiBUaGUgY2FsbGVyIGlzIGJsb2NrZWQg dW50aWwgYWxsIG9mIHRoZSBmcmFtZXMgaGF2ZQorICogYmVlbiBjYXB0dXJlZC4KKyAqCisgKiBB cyBhbiBpbXBvcnRhbnQgbm90ZTogc29tZSBvZiB0aGUgRURJRHMgcHJvdmlkZWQgYnkgdGhlIENo YW1lbGl1bSBjYXVzZQorICogY2VydGFpbiBHUFUgZHJpdmVycyB0byBkZWZhdWx0IHRvIHVzaW5n IGxpbWl0ZWQgY29sb3IgcmFuZ2VzLiBUaGlzIGNhbiBjYXVzZQorICogdmlkZW8gY2FwdHVyZXMg ZnJvbSB0aGUgQ2hhbWVsaXVtIHRvIHByb3ZpZGUgZGlmZmVyZW50IGltYWdlcyB0aGVuIGV4cGVj dGVkCisgKiBkdWUgdG8gdGhlIGRpZmZlcmVuY2UgaW4gY29sb3IgcmFuZ2VzIChmcmFtZWJ1ZmZl ciB1c2VzIGZ1bGwgY29sb3IgcmFuZ2UsCisgKiBidXQgdGhlIHZpZGVvIG91dHB1dCBkb2Vzbid0 KSwgYW5kIGFzIGEgcmVzdWx0IGxlYWQgdG8gQ1JDIGFuZCBmcmFtZSBkdW1wCisgKiBjb21wYXJp c29uIG1pc21hdGNoZXMuIFRvIHdvcmthcm91bmQgdGhpcywgdGhlIGNhbGxlciBzaG91bGQgZm9y Y2UgdGhlCisgKiBjb25uZWN0b3IgdG8gdXNlIGZ1bGwgY29sb3IgcmFuZ2VzIGJ5IHVzaW5nCisg KiAja21zdGVzdF9zZXRfY29ubmVjdG9yX2Jyb2FkY2FzdF9yZ2IgYmVmb3JlIHNldHRpbmcgdXAg dGhlIGRpc3BsYXkuCisgKi8KK3ZvaWQgY2hhbWVsaXVtX2NhcHR1cmUoc3RydWN0IGNoYW1lbGl1 bSAqY2hhbWVsaXVtLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsCisJCSAgICAgICBpbnQg eCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGZyYW1lX2NvdW50KQoreworCXhtbHJwY19ERUNS RUYoY2hhbWVsaXVtX3JwYyhjaGFtZWxpdW0sIHBvcnQsICJDYXB0dXJlVmlkZW8iLAorCQkJCSAg ICAodyAmJiBoKSA/ICIoaWlpaWlpKSIgOiAiKGlpbm5ubikiLAorCQkJCSAgICBwb3J0LT5pZCwg ZnJhbWVfY291bnQsIHgsIHksIHcsIGgpKTsKKwljaGFtZWxpdW0tPmNhcHR1cmluZ19wb3J0ID0g cG9ydDsKK30KKworLyoqCisgKiBjaGFtZWxpdW1fcmVhZF9jYXB0dXJlZF9jcmNzOgorICogQGNo YW1lbGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBmcmFtZV9jb3VudDog V2hlcmUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBDUkNzIHdlIHJlYWQgaW4KKyAqCisgKiBSZWFk cyBhbGwgb2YgdGhlIENSQ3MgdGhhdCBoYXZlIGJlZW4gY2FwdHVyZWQgdGh1cyBmYXIgZnJvbSB0 aGUgQ2hhbWVsaXVtLgorICoKKyAqIFJldHVybnM6IEFuIGFycmF5IG9mIEBmcmFtZV9jb3VudCBs ZW5ndGggY29udGFpbmluZyBhbGwgb2YgdGhlIENSQ3Mgd2UgcmVhZAorICovCitpZ3RfY3JjX3Qg KmNoYW1lbGl1bV9yZWFkX2NhcHR1cmVkX2NyY3Moc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVt LAorCQkJCQlpbnQgKmZyYW1lX2NvdW50KQoreworCWlndF9jcmNfdCAqcmV0OworCXhtbHJwY192 YWx1ZSAqcmVzLCAqZWxlbTsKKwlpbnQgaTsKKworCXJlcyA9IGNoYW1lbGl1bV9ycGMoY2hhbWVs aXVtLCBOVUxMLCAiR2V0Q2FwdHVyZWRDaGVja3N1bXMiLCAiKGluKSIsIDApOworCisJKmZyYW1l X2NvdW50ID0geG1scnBjX2FycmF5X3NpemUoJmNoYW1lbGl1bS0+ZW52LCByZXMpOworCXJldCA9 IGNhbGxvYyhzaXplb2YoaWd0X2NyY190KSwgKmZyYW1lX2NvdW50KTsKKworCWZvciAoaSA9IDA7 IGkgPCAqZnJhbWVfY291bnQ7IGkrKykgeworCQl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZjaGFt ZWxpdW0tPmVudiwgcmVzLCBpLCAmZWxlbSk7CisKKwkJY3JjX2Zyb21feG1sKGNoYW1lbGl1bSwg ZWxlbSwgJnJldFtpXSk7CisJCXJldFtpXS5mcmFtZSA9IGk7CisKKwkJeG1scnBjX0RFQ1JFRihl bGVtKTsKKwl9CisKKwl4bWxycGNfREVDUkVGKHJlcyk7CisKKwlyZXR1cm4gcmV0OworfQorCisv KioKKyAqIGNoYW1lbGl1bV9wb3J0X3JlYWRfY2FwdHVyZWRfZnJhbWU6CisgKgorICogQGNoYW1l bGl1bTogVGhlIENoYW1lbGl1bSBpbnN0YW5jZSB0byB1c2UKKyAqIEBpbmRleDogVGhlIGluZGV4 IG9mIHRoZSBjYXB0dXJlZCBmcmFtZSB3ZSB3YW50IHRvIGdldAorICoKKyAqIFJldHJpZXZlcyBh IHNpbmdsZSB2aWRlbyBmcmFtZSBjYXB0dXJlZCBkdXJpbmcgdGhlIGxhc3QgdmlkZW8gY2FwdHVy ZSBvbiB0aGUKKyAqIENoYW1lbGl1bS4gVGhpcyBkYXRhIHNob3VsZCBiZSBmcmVlZCB1c2luZyAj Y2hhbWVsaXVtX2Rlc3Ryb3lfZnJhbWVfZGF0YQorICoKKyAqIFJldHVybnM6IGEgY2hhbWVsaXVt X2ZyYW1lX2R1bXAgc3RydWN0CisgKi8KK3N0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVtcCAqY2hh bWVsaXVtX3JlYWRfY2FwdHVyZWRfZnJhbWUoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAor CQkJCQkJCSAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl4bWxycGNfdmFsdWUgKnJlczsKKwlz dHJ1Y3QgY2hhbWVsaXVtX2ZyYW1lX2R1bXAgKmZyYW1lOworCisJcmVzID0gY2hhbWVsaXVtX3Jw YyhjaGFtZWxpdW0sIE5VTEwsICJSZWFkQ2FwdHVyZWRGcmFtZSIsICIoaSkiLCBpbmRleCk7CisJ ZnJhbWUgPSBmcmFtZV9mcm9tX3htbChjaGFtZWxpdW0sIHJlcyk7CisJeG1scnBjX0RFQ1JFRihy ZXMpOworCisJcmV0dXJuIGZyYW1lOworfQorCisvKioKKyAqIGNoYW1lbGl1bV9nZXRfY2FwdHVy ZWRfZnJhbWVfY291bnQ6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRv IHVzZQorICoKKyAqIEdldHMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZXJlIGNhcHR1cmVk IGR1cmluZyB0aGUgbGFzdCB2aWRlbyBjYXB0dXJlLgorICoKKyAqIFJldHVybnM6IHRoZSBudW1i ZXIgb2YgZnJhbWVzIHRoZSBDaGFtZWxpdW0gY2FwdHVyZWQgZHVyaW5nIHRoZSBsYXN0IHZpZGVv CisgKiBjYXB0dXJlLgorICovCitpbnQgY2hhbWVsaXVtX2dldF9jYXB0dXJlZF9mcmFtZV9jb3Vu dChzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0pCit7CisJeG1scnBjX3ZhbHVlICpyZXM7CisJ aW50IHJldDsKKworCXJlcyA9IGNoYW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxMLCAiR2V0Q2Fw dHVyZWRGcmFtZUNvdW50IiwgIigpIik7CisJeG1scnBjX3JlYWRfaW50KCZjaGFtZWxpdW0tPmVu diwgcmVzLCAmcmV0KTsKKworCXhtbHJwY19ERUNSRUYocmVzKTsKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgcGl4bWFuX2ltYWdlX3QgKmNvbnZlcnRfZnJhbWVfZm9ybWF0KHBpeG1hbl9pbWFn ZV90ICpzcmMsCisJCQkJCSAgICBpbnQgZm9ybWF0KQoreworCXBpeG1hbl9pbWFnZV90ICpjb252 ZXJ0ZWQ7CisJaW50IHcgPSBwaXhtYW5faW1hZ2VfZ2V0X3dpZHRoKHNyYyksIGggPSBwaXhtYW5f aW1hZ2VfZ2V0X2hlaWdodChzcmMpOworCisJY29udmVydGVkID0gcGl4bWFuX2ltYWdlX2NyZWF0 ZV9iaXRzKGZvcm1hdCwgdywgaCwgTlVMTCwKKwkJCQkJICAgICBQSVhNQU5fRk9STUFUX0JQUChm b3JtYXQpICogdyk7CisJcGl4bWFuX2ltYWdlX2NvbXBvc2l0ZShQSVhNQU5fT1BfQURELCBzcmMs IE5VTEwsIGNvbnZlcnRlZCwKKwkJCSAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCB3LCBoKTsKKwor CXJldHVybiBjb252ZXJ0ZWQ7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2Fzc2VydF9mcmFtZV9l cToKKyAqIEBjaGFtZWxpdW06IFRoZSBjaGFtZWxpdW0gaW5zdGFuY2UgdGhlIGZyYW1lIGR1bXAg YmVsb25ncyB0bworICogQGR1bXA6IFRoZSBjaGFtZWxpdW0gZnJhbWUgZHVtcCB0byBjaGVjawor ICogQGZiOiBUaGUgZnJhbWVidWZmZXIgdG8gY2hlY2sgYWdhaW5zdAorICoKKyAqIEFzc2VydHMg dGhhdCB0aGUgaW1hZ2UgY29udGFpbmVkIGluIHRoZSBjaGFtZWxpdW0gZnJhbWUgZHVtcCBpcyBp ZGVudGljYWwgdG8KKyAqIHRoZSBnaXZlbiBmcmFtZWJ1ZmZlci4gVXNlZnVsIGZvciBzY2VuYXJp b3Mgd2hlcmUgcHJlLWNhbGN1bGF0aW5nIENSQ3MgbWlnaHQKKyAqIG5vdCBiZSBpZGVhbC4KKyAq Lwordm9pZCBjaGFtZWxpdW1fYXNzZXJ0X2ZyYW1lX2VxKGNvbnN0IHN0cnVjdCBjaGFtZWxpdW0g KmNoYW1lbGl1bSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2hhbWVsaXVtX2ZyYW1lX2R1bXAg KmR1bXAsCisJCQkgICAgICAgc3RydWN0IGlndF9mYiAqZmIpCit7CisJY2Fpcm9fdCAqY3I7CisJ Y2Fpcm9fc3VyZmFjZV90ICpmYl9zdXJmYWNlOworCXBpeG1hbl9pbWFnZV90ICpyZWZlcmVuY2Vf c3JjLCAqcmVmZXJlbmNlX2JncjsKKwlpbnQgdyA9IGR1bXAtPndpZHRoLCBoID0gZHVtcC0+aGVp Z2h0OworCWJvb2wgZXE7CisKKwkvKiBHZXQgdGhlIGNhaXJvIHN1cmZhY2UgZm9yIHRoZSBmcmFt ZWJ1ZmZlciAqLworCWNyID0gaWd0X2dldF9jYWlyb19jdHgoY2hhbWVsaXVtLT5kcm1fZmQsIGZi KTsKKwlmYl9zdXJmYWNlID0gY2Fpcm9fZ2V0X3RhcmdldChjcik7CisJY2Fpcm9fc3VyZmFjZV9y ZWZlcmVuY2UoZmJfc3VyZmFjZSk7CisJY2Fpcm9fZGVzdHJveShjcik7CisKKwkvKgorCSAqIENv bnZlcnQgdGhlIHJlZmVyZW5jZSBpbWFnZSBpbnRvIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgY2hh bWVsaXVtCisJICogaW1hZ2UKKwkgKi8KKwlyZWZlcmVuY2Vfc3JjID0gcGl4bWFuX2ltYWdlX2Ny ZWF0ZV9iaXRzKAorCSAgICBQSVhNQU5feDhyOGc4YjgsIHcsIGgsCisJICAgICh2b2lkKiljYWly b19pbWFnZV9zdXJmYWNlX2dldF9kYXRhKGZiX3N1cmZhY2UpLAorCSAgICBjYWlyb19pbWFnZV9z dXJmYWNlX2dldF9zdHJpZGUoZmJfc3VyZmFjZSkpOworCXJlZmVyZW5jZV9iZ3IgPSBjb252ZXJ0 X2ZyYW1lX2Zvcm1hdChyZWZlcmVuY2Vfc3JjLCBQSVhNQU5fYjhnOHI4KTsKKwlwaXhtYW5faW1h Z2VfdW5yZWYocmVmZXJlbmNlX3NyYyk7CisKKwkvKiBOb3cgZG8gdGhlIGFjdHVhbCBjb21wYXJp c29uICovCisJZXEgPSBtZW1jbXAoZHVtcC0+YmdyLCBwaXhtYW5faW1hZ2VfZ2V0X2RhdGEocmVm ZXJlbmNlX2JnciksCisJCSAgICBkdW1wLT5zaXplKSA9PSAwOworCisJcGl4bWFuX2ltYWdlX3Vu cmVmKHJlZmVyZW5jZV9iZ3IpOworCWNhaXJvX3N1cmZhY2VfZGVzdHJveShmYl9zdXJmYWNlKTsK KworCWlndF9mYWlsX29uX2YoIWVxLAorCQkgICAgICAiQ2hhbWVsaXVtIGZyYW1lIGR1bXAgZGlk bid0IG1hdGNoIHJlZmVyZW5jZSBpbWFnZVxuIik7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2dl dF9mcmFtZV9saW1pdDoKKyAqIEBjaGFtZWxpdW06IFRoZSBDaGFtZWxpdW0gaW5zdGFuY2UgdG8g dXNlCisgKiBAcG9ydDogVGhlIHBvcnQgdG8gY2hlY2sgdGhlIGZyYW1lIGxpbWl0IG9uCisgKiBA dzogVGhlIHdpZHRoIG9mIHRoZSBhcmVhIHRvIGdldCB0aGUgY2FwdHVyZSBmcmFtZSBsaW1pdCBm b3IsIG9yICUwIGZvciB0aGUKKyAqIHdob2xlIGRpc3BsYXkKKyAqIEBoOiBUaGUgaGVpZ2h0IG9m IHRoZSBhcmVhIHRvIGdldCB0aGUgY2FwdHVyZSBmcmFtZSBsaW1pdCBmb3IsIG9yICUwIGZvciB0 aGUKKyAqIHdob2xlIGRpc3BsYXkKKyAqCisgKiBHZXRzIHRoZSBtYXggbnVtYmVyIG9mIGZyYW1l cyB3ZSBjYW4gY2FwdHVyZSB3aXRoIHRoZSBDaGFtZWxpdW0gZm9yIHRoZSBnaXZlbgorICogcmVz b2x1dGlvbi4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIHRoZSBtYXggbnVtYmVyIG9m IGZyYW1lcyB3ZSBjYW4gY2FwdHVyZQorICovCitpbnQgY2hhbWVsaXVtX2dldF9mcmFtZV9saW1p dChzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkgICAgICBzdHJ1Y3QgY2hhbWVsaXVt X3BvcnQgKnBvcnQsCisJCQkgICAgICBpbnQgdywgaW50IGgpCit7CisJeG1scnBjX3ZhbHVlICpy ZXM7CisJaW50IHJldDsKKworCWlmICghdyAmJiAhaCkKKwkJY2hhbWVsaXVtX3BvcnRfZ2V0X3Jl c29sdXRpb24oY2hhbWVsaXVtLCBwb3J0LCAmdywgJmgpOworCisJcmVzID0gY2hhbWVsaXVtX3Jw YyhjaGFtZWxpdW0sIHBvcnQsICJHZXRNYXhGcmFtZUxpbWl0IiwgIihpaWkpIiwKKwkJCSAgICBw b3J0LT5pZCwgdywgaCk7CisKKwl4bWxycGNfcmVhZF9pbnQoJmNoYW1lbGl1bS0+ZW52LCByZXMs ICZyZXQpOworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyB1bnNpZ25lZCBpbnQgY2hhbWVsaXVtX2dldF9wb3J0X3R5cGUoc3RydWN0IGNoYW1lbGl1bSAq Y2hhbWVsaXVtLAorCQkJCQkgICAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQoreworCXht bHJwY192YWx1ZSAqcmVzOworCWNvbnN0IGNoYXIgKnBvcnRfdHlwZV9zdHI7CisJdW5zaWduZWQg aW50IHBvcnRfdHlwZTsKKworCXJlcyA9IGNoYW1lbGl1bV9ycGMoY2hhbWVsaXVtLCBOVUxMLCAi R2V0Q29ubmVjdG9yVHlwZSIsCisJCQkgICAgIihpKSIsIHBvcnQtPmlkKTsKKworCXhtbHJwY19y ZWFkX3N0cmluZygmY2hhbWVsaXVtLT5lbnYsIHJlcywgJnBvcnRfdHlwZV9zdHIpOworCWlndF9k ZWJ1ZygiUG9ydCAlZCBpcyBvZiB0eXBlICclcydcbiIsIHBvcnQtPmlkLCBwb3J0X3R5cGVfc3Ry KTsKKworCWlmIChzdHJjbXAocG9ydF90eXBlX3N0ciwgIkRQIikgPT0gMCkKKwkJcG9ydF90eXBl ID0gRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0OworCWVsc2UgaWYgKHN0cmNtcChwb3J0 X3R5cGVfc3RyLCAiSERNSSIpID09IDApCisJCXBvcnRfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RP Ul9IRE1JQTsKKwllbHNlIGlmIChzdHJjbXAocG9ydF90eXBlX3N0ciwgIlZHQSIpID09IDApCisJ CXBvcnRfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7CisJZWxzZQorCQlwb3J0X3R5cGUg PSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bjsKKworCWZyZWUoKHZvaWQqKXBvcnRfdHlwZV9z dHIpOworCXhtbHJwY19ERUNSRUYocmVzKTsKKworCXJldHVybiBwb3J0X3R5cGU7Cit9CisKK3N0 YXRpYyBib29sIGNoYW1lbGl1bV9yZWFkX3BvcnRfbWFwcGluZ3Moc3RydWN0IGNoYW1lbGl1bSAq Y2hhbWVsaXVtLAorCQkJCQkgaW50IGRybV9mZCwgR0tleUZpbGUgKmtleV9maWxlKQoreworCWRy bU1vZGVSZXMgKnJlczsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGNo YW1lbGl1bV9wb3J0ICpwb3J0OworCUdFcnJvciAqZXJyb3IgPSBOVUxMOworCWNoYXIgKipncm91 cF9saXN0OworCWNoYXIgKmdyb3VwLCAqbWFwX25hbWU7CisJaW50IHBvcnRfaSwgaSwgajsKKwli b29sIHJldCA9IHRydWU7CisKKwlncm91cF9saXN0ID0gZ19rZXlfZmlsZV9nZXRfZ3JvdXBzKGtl eV9maWxlLCBOVUxMKTsKKworCS8qIENvdW50IGhvdyBtYW55IGNvbm5lY3RvciBtYXBwaW5ncyBh cmUgc3BlY2lmaWVkIGluIHRoZSBjb25maWcgKi8KKwlmb3IgKGkgPSAwOyBncm91cF9saXN0W2ld ICE9IE5VTEw7IGkrKykgeworCQlpZiAoc3Ryc3RyKGdyb3VwX2xpc3RbaV0sICJDaGFtZWxpdW06 IikpCisJCQljaGFtZWxpdW0tPnBvcnRfY291bnQrKzsKKwl9CisKKwljaGFtZWxpdW0tPnBvcnRz ID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQpLAorCQkJCSAgY2hhbWVsaXVt LT5wb3J0X2NvdW50KTsKKwlwb3J0X2kgPSAwOworCXJlcyA9IGRybU1vZGVHZXRSZXNvdXJjZXMo ZHJtX2ZkKTsKKworCWZvciAoaSA9IDA7IGdyb3VwX2xpc3RbaV0gIT0gTlVMTDsgaSsrKSB7CisJ CWdyb3VwID0gZ3JvdXBfbGlzdFtpXTsKKworCQlpZiAoIXN0cnN0cihncm91cCwgIkNoYW1lbGl1 bToiKSkKKwkJCWNvbnRpbnVlOworCisJCW1hcF9uYW1lID0gZ3JvdXAgKyAoc2l6ZW9mKCJDaGFt ZWxpdW06IikgLSAxKTsKKworCQlwb3J0ID0gJmNoYW1lbGl1bS0+cG9ydHNbcG9ydF9pKytdOwor CQlwb3J0LT5uYW1lID0gc3RyZHVwKG1hcF9uYW1lKTsKKwkJcG9ydC0+aWQgPSBnX2tleV9maWxl X2dldF9pbnRlZ2VyKGtleV9maWxlLCBncm91cCwKKwkJCQkJCSAgIkNoYW1lbGl1bVBvcnRJRCIs CisJCQkJCQkgICZlcnJvcik7CisJCWlmICghcG9ydC0+aWQpIHsKKwkJCWlndF93YXJuKCJGYWls ZWQgdG8gcmVhZCBjaGFtZWxpdW0gcG9ydCBJRCBmb3IgJXM6ICVzXG4iLAorCQkJCSBtYXBfbmFt ZSwgZXJyb3ItPm1lc3NhZ2UpOworCQkJcmV0ID0gZmFsc2U7CisJCQlnb3RvIG91dDsKKwkJfQor CisJCXBvcnQtPnR5cGUgPSBjaGFtZWxpdW1fZ2V0X3BvcnRfdHlwZShjaGFtZWxpdW0sIHBvcnQp OworCQlpZiAocG9ydC0+dHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfVW5rbm93bikgeworCQkJ aWd0X3dhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSB0aGUgcGh5c2ljYWwgcG9ydCB0eXBlIGZyb20g dGhlIENoYW1lbGl1bSBmb3IgJyVzJ1xuIiwKKwkJCQkgbWFwX25hbWUpOworCQkJcmV0ID0gZmFs c2U7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZvciAoaiA9IDA7CisJCSAgICAgaiA8IHJlcy0+ Y291bnRfY29ubmVjdG9ycyAmJiAhcG9ydC0+Y29ubmVjdG9yX2lkOworCQkgICAgIGorKykgewor CQkJY2hhciBuYW1lWzUwXTsKKworCQkJY29ubmVjdG9yID0gZHJtTW9kZUdldENvbm5lY3RvckN1 cnJlbnQoCisJCQkgICAgZHJtX2ZkLCByZXMtPmNvbm5lY3RvcnNbal0pOworCisJCQkvKiBXZSBo YXZlIHRvIGdlbmVyYXRlIHRoZSBjb25uZWN0b3IgbmFtZSBvbiBvdXIgb3duICovCisJCQlzbnBy aW50ZihuYW1lLCA1MCwgIiVzLSV1IiwKKwkJCQkga21zdGVzdF9jb25uZWN0b3JfdHlwZV9zdHIo Y29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSksCisJCQkJIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5 cGVfaWQpOworCisJCQlpZiAoc3RyY21wKG5hbWUsIG1hcF9uYW1lKSA9PSAwKQorCQkJCXBvcnQt PmNvbm5lY3Rvcl9pZCA9IGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lkOworCisJCQlkcm1Nb2RlRnJl ZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCQl9CisJCWlmICghcG9ydC0+Y29ubmVjdG9yX2lkKSB7 CisJCQlpZ3Rfd2FybigiTm8gY29ubmVjdG9yIGZvdW5kIHdpdGggbmFtZSAnJXMnXG4iLAorCQkJ CSBtYXBfbmFtZSk7CisJCQlyZXQgPSBmYWxzZTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWd0 X2RlYnVnKCJQb3J0ICclcycgd2l0aCBwaHlzaWNhbCB0eXBlICclcycgbWFwcGVkIHRvIENoYW1l bGl1bSBwb3J0ICVkXG4iLAorCQkJICBtYXBfbmFtZSwga21zdGVzdF9jb25uZWN0b3JfdHlwZV9z dHIocG9ydC0+dHlwZSksCisJCQkgIHBvcnQtPmlkKTsKKwl9CisKK291dDoKKwlkcm1Nb2RlRnJl ZVJlc291cmNlcyhyZXMpOworCWdfc3RyZnJlZXYoZ3JvdXBfbGlzdCk7CisKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgYm9vbCBjaGFtZWxpdW1fcmVhZF9jb25maWcoc3RydWN0IGNoYW1lbGl1 bSAqY2hhbWVsaXVtLCBpbnQgZHJtX2ZkKQoreworCUdLZXlGaWxlICprZXlfZmlsZSA9IGdfa2V5 X2ZpbGVfbmV3KCk7CisJR0Vycm9yICplcnJvciA9IE5VTEw7CisJY2hhciAqa2V5X2ZpbGVfbG9j LCAqa2V5X2ZpbGVfZW52OworCWludCByYzsKKwlib29sIHJldCA9IHRydWU7CisKKwlrZXlfZmls ZV9lbnYgPSBnZXRlbnYoIklHVF9DT05GSUdfUEFUSCIpOworCWlmIChrZXlfZmlsZV9lbnYpIHsK KwkJa2V5X2ZpbGVfbG9jID0ga2V5X2ZpbGVfZW52OworCX0gZWxzZSB7CisJCWtleV9maWxlX2xv YyA9IG1hbGxvYygxMDApOworCQlzbnByaW50ZihrZXlfZmlsZV9sb2MsIDEwMCwgIiVzLy5pZ3Ry YyIsIGdfZ2V0X2hvbWVfZGlyKCkpOworCX0KKworCXJjID0gZ19rZXlfZmlsZV9sb2FkX2Zyb21f ZmlsZShrZXlfZmlsZSwga2V5X2ZpbGVfbG9jLAorCQkJCSAgICAgICBHX0tFWV9GSUxFX05PTkUs ICZlcnJvcik7CisJaWYgKCFyYykgeworCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHJlYWQgY2hhbWVs aXVtIGNvbmZpZ3VyYXRpb24gZmlsZTogJXNcbiIsCisJCQkgZXJyb3ItPm1lc3NhZ2UpOworCQly ZXQgPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCisJY2hhbWVsaXVtLT51cmwgPSBnX2tleV9m aWxlX2dldF9zdHJpbmcoa2V5X2ZpbGUsICJDaGFtZWxpdW0iLCAiVVJMIiwKKwkJCQkJICAgICAg ICZlcnJvcik7CisJaWYgKCFjaGFtZWxpdW0tPnVybCkgeworCQlpZ3Rfd2FybigiQ291bGRuJ3Qg cmVhZCBjaGFtZWxpdW0gVVJMIGZyb20gY29uZmlnIGZpbGU6ICVzXG4iLAorCQkJIGVycm9yLT5t ZXNzYWdlKTsKKwkJcmV0ID0gZmFsc2U7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGNoYW1l bGl1bV9yZWFkX3BvcnRfbWFwcGluZ3MoY2hhbWVsaXVtLCBkcm1fZmQsIGtleV9maWxlKTsKKwor b3V0OgorCWdfa2V5X2ZpbGVfZnJlZShrZXlfZmlsZSk7CisKKwlpZiAoIWtleV9maWxlX2VudikK KwkJZnJlZShrZXlfZmlsZV9sb2MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjaGFt ZWxpdW1fcmVzZXQ6CisgKiBAY2hhbWVsaXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVz ZQorICoKKyAqIFJlc2V0cyB0aGUgY2hhbWVsaXVtJ3MgSU8gYm9hcmQuIEFzIHdlbGwsIHRoaXMg YWxzbyBoYXMgdGhlIGVmZmVjdCBvZgorICogY2F1c2luZyBhbGwgb2YgdGhlIGNoYW1lbGl1bSBw b3J0cyB0byBnZXQgc2V0IHRvIHVucGx1Z2dlZAorICovCit2b2lkIGNoYW1lbGl1bV9yZXNldChz dHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0pCit7CisJaWd0X2RlYnVnKCJSZXNldHRpbmcgdGhl IGNoYW1lbGl1bVxuIik7CisJeG1scnBjX0RFQ1JFRihjaGFtZWxpdW1fcnBjKGNoYW1lbGl1bSwg TlVMTCwgIlJlc2V0IiwgIigpIikpOworfQorCitzdGF0aWMgdm9pZCBjaGFtZWxpdW1fZXhpdF9o YW5kbGVyKGludCBzaWcpCit7CisJaWd0X2RlYnVnKCJEZWluaXRpYWxpemluZyBDaGFtZWxpdW1c biIpOworCisJaWYgKGNsZWFudXBfaW5zdGFuY2UpCisJCWNoYW1lbGl1bV9kZWluaXQoY2xlYW51 cF9pbnN0YW5jZSk7Cit9CisKKy8qKgorICogY2hhbWVsaXVtX2luaXQ6CisgKiBAY2hhbWVsaXVt OiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQorICogQGRybV9mZDogYSBkaXNwbGF5IGlu aXRpYWxpemVkIHdpdGggI2lndF9kaXNwbGF5X2luaXQKKyAqCisgKiBTZXRzIHVwIGEgY29ubmVj dGlvbiB3aXRoIGEgY2hhbWVsaXVtLCB1c2luZyB0aGUgVVJMIHNwZWNpZmllZCBpbiB0aGUKKyAq IENoYW1lbGl1bSBjb25maWd1cmF0aW9uLiBUaGlzIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9y ZSB0cnlpbmcgdG8gdXNlIHRoZQorICogY2hhbWVsaXVtLgorICoKKyAqIElmIHdlIGZhaWwgdG8g ZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBjaGFtZWxpdW0sIGZhaWwgdG8gZmluZCBh CisgKiBjb25maWd1cmVkIGNvbm5lY3RvciwgZXRjLiB3ZSBmYWlsIHRoZSBjdXJyZW50IHRlc3Qu CisgKgorICogUmV0dXJuczogQSBuZXdseSBpbml0aWFsaXplZCBjaGFtZWxpdW0gc3RydWN0LCBv ciBOVUxMIG9uIGVycm9yCisgKi8KK3N0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bV9pbml0KGlu dCBkcm1fZmQpCit7CisJc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtID0gbWFsbG9jKHNpemVv ZihzdHJ1Y3QgY2hhbWVsaXVtKSk7CisKKwlpZiAoIWNoYW1lbGl1bSkKKwkJcmV0dXJuIE5VTEw7 CisKKwkvKiBBIGNoYW1lbGl1bSBpbnN0YW5jZSB3YXMgc2V0IHVwIHByZXZpb3VzbHksIHNvIGNs ZWFuIGl0IHVwIGJlZm9yZQorCSAqIHN0YXJ0aW5nIGEgbmV3IG9uZQorCSAqLworCWlmIChjbGVh bnVwX2luc3RhbmNlKQorCQljaGFtZWxpdW1fZGVpbml0KGNsZWFudXBfaW5zdGFuY2UpOworCisJ bWVtc2V0KGNoYW1lbGl1bSwgMCwgc2l6ZW9mKCpjaGFtZWxpdW0pKTsKKwljaGFtZWxpdW0tPmRy bV9mZCA9IGRybV9mZDsKKworCS8qIFNldHVwIHRoZSBsaWJ4bWxycGMgY29udGV4dCAqLworCXht bHJwY19lbnZfaW5pdCgmY2hhbWVsaXVtLT5lbnYpOworCXhtbHJwY19jbGllbnRfc2V0dXBfZ2xv YmFsX2NvbnN0KCZjaGFtZWxpdW0tPmVudik7CisJeG1scnBjX2NsaWVudF9jcmVhdGUoJmNoYW1l bGl1bS0+ZW52LCBYTUxSUENfQ0xJRU5UX05PX0ZMQUdTLCBQQUNLQUdFLAorCQkJICAgICBQQUNL QUdFX1ZFUlNJT04sIE5VTEwsIDAsICZjaGFtZWxpdW0tPmNsaWVudCk7CisJaWYgKGNoYW1lbGl1 bS0+ZW52LmZhdWx0X29jY3VycmVkKSB7CisJCWlndF9kZWJ1ZygiRmFpbGVkIHRvIGluaXQgeG1s cnBjOiAlc1xuIiwKKwkJCSAgY2hhbWVsaXVtLT5lbnYuZmF1bHRfc3RyaW5nKTsKKwkJZ290byBl cnJvcjsKKwl9CisKKwlpZiAoIWNoYW1lbGl1bV9yZWFkX2NvbmZpZyhjaGFtZWxpdW0sIGRybV9m ZCkpCisJCWdvdG8gZXJyb3I7CisKKwljaGFtZWxpdW1fcmVzZXQoY2hhbWVsaXVtKTsKKworCWNs ZWFudXBfaW5zdGFuY2UgPSBjaGFtZWxpdW07CisJaWd0X2luc3RhbGxfZXhpdF9oYW5kbGVyKGNo YW1lbGl1bV9leGl0X2hhbmRsZXIpOworCisJcmV0dXJuIGNoYW1lbGl1bTsKKworZXJyb3I6CisJ eG1scnBjX2Vudl9jbGVhbigmY2hhbWVsaXVtLT5lbnYpOworCWZyZWUoY2hhbWVsaXVtKTsKKwor CXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGNoYW1lbGl1bV9kZWluaXQ6CisgKiBAY2hhbWVs aXVtOiBUaGUgQ2hhbWVsaXVtIGluc3RhbmNlIHRvIHVzZQorICoKKyAqIEZyZWVzIHRoZSByZXNv dXJjZXMgdXNlZCBieSBhIGNvbm5lY3Rpb24gdG8gdGhlIGNoYW1lbGl1bSB0aGF0IHdhcyBzZXQg dXAKKyAqIHdpdGggI2NoYW1lbGl1bV9pbml0LiBBcyB3ZWxsLCB0aGlzIGZ1bmN0aW9uIHJlc3Rv cmVzIHRoZSBzdGF0ZSBvZiB0aGUKKyAqIGNoYW1lbGl1bSBsaWtlIGl0IHdhcyBiZWZvcmUgY2Fs bGluZyAjY2hhbWVsaXVtX2luaXQuIFRoaXMgZnVuY3Rpb24gaXMgYWxzbworICogY2FsbGVkIGFz IGFuIGV4aXQgaGFuZGxlciwgc28gdXNlcnMgb25seSBuZWVkIHRvIGNhbGwgbWFudWFsbHkgaWYg dGhleSBkb24ndAorICogd2FudCB0aGUgY2hhbWVsaXVtIGludGVyZmVyaW5nIHdpdGggb3RoZXIg dGVzdHMgaW4gdGhlIHNhbWUgZmlsZS4KKyAqLwordm9pZCBjaGFtZWxpdW1fZGVpbml0KHN0cnVj dCBjaGFtZWxpdW0gKmNoYW1lbGl1bSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2hhbWVsaXVtX2Vk aWQgKnBvcywgKnRtcDsKKworCS8qIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGxlYXZlIGFsbCBv ZiB0aGUgcG9ydHMgcGx1Z2dlZCBpbiwgc2luY2UKKwkgKiB0ZXN0aW5nIHNldHVwcyByZXF1aXJp bmcgbXVsdGlwbGUgbW9uaXRvcnMgYXJlIHByb2JhYmx5IHVzaW5nIHRoZQorCSAqIGNoYW1lbGl1 bSB0byBwcm92aWRlIHNhaWQgbW9uaXRvcnMKKwkgKi8KKwljaGFtZWxpdW1fcmVzZXQoY2hhbWVs aXVtKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbWVsaXVtLT5wb3J0X2NvdW50OyBpKyspCisJCWNo YW1lbGl1bV9wbHVnKGNoYW1lbGl1bSwgJmNoYW1lbGl1bS0+cG9ydHNbaV0pOworCisJLyogRGVz dHJveSBhbnkgRURJRHMgd2UgY3JlYXRlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhayB0aGVt ICovCisJaWd0X2xpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJmNoYW1lbGl1bS0+ZWRpZHMt PmxpbmssIGxpbmspIHsKKwkJY2hhbWVsaXVtX2Rlc3Ryb3lfZWRpZChjaGFtZWxpdW0sIHBvcy0+ aWQpOworCQlmcmVlKHBvcyk7CisJfQorCisJeG1scnBjX2NsaWVudF9kZXN0cm95KGNoYW1lbGl1 bS0+Y2xpZW50KTsKKwl4bWxycGNfZW52X2NsZWFuKCZjaGFtZWxpdW0tPmVudik7CisKKwlmb3Ig KGkgPSAwOyBpIDwgY2hhbWVsaXVtLT5wb3J0X2NvdW50OyBpKyspCisJCWZyZWUoY2hhbWVsaXVt LT5wb3J0c1tpXS5uYW1lKTsKKworCWZyZWUoY2hhbWVsaXVtLT5wb3J0cyk7CisJZnJlZShjaGFt ZWxpdW0pOworfQorCitpZ3RfY29uc3RydWN0b3IgeworCS8qIEZyYW1lIGR1bXBzIGNhbiBiZSBs YXJnZSwgc28gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlCisJICogcmVz cG9uc2VzCisJICoKKwkgKiBMaW1pdCBoZXJlIGlzIDEwTUIKKwkgKi8KKwl4bWxycGNfbGltaXRf c2V0KFhNTFJQQ19YTUxfU0laRV9MSU1JVF9JRCwgMTA0ODU3NjApOworfQpkaWZmIC0tZ2l0IGEv bGliL2lndF9jaGFtZWxpdW0uaCBiL2xpYi9pZ3RfY2hhbWVsaXVtLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyMWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9pZ3Rf Y2hhbWVsaXVtLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBS ZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3 YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwK KyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGlu ZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnks IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwg Y29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhl CisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxv d2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0 aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkg c2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBv ZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMg SVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVE LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS SU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hU IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX SVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBT T0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUu CisgKgorICogQXV0aG9yczogTHl1ZGUgUGF1bCA8bHl1ZGVAcmVkaGF0LmNvbT4KKyAqLworCisj aWZuZGVmIElHVF9DSEFNRUxJVU1fSAorI2RlZmluZSBJR1RfQ0hBTUVMSVVNX0gKKworI2luY2x1 ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImlndC5oIgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwor c3RydWN0IGNoYW1lbGl1bTsKK3N0cnVjdCBjaGFtZWxpdW1fcG9ydDsKK3N0cnVjdCBjaGFtZWxp dW1fZnJhbWVfZHVtcDsKKworc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtX2luaXQoaW50IGRy bV9mZCk7Cit2b2lkIGNoYW1lbGl1bV9kZWluaXQoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVt KTsKK3ZvaWQgY2hhbWVsaXVtX3Jlc2V0KHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSk7CisK K3N0cnVjdCBjaGFtZWxpdW1fcG9ydCAqKmNoYW1lbGl1bV9nZXRfcG9ydHMoc3RydWN0IGNoYW1l bGl1bSAqY2hhbWVsaXVtLAorCQkJCQkgICAgaW50ICpjb3VudCk7Cit1bnNpZ25lZCBpbnQgY2hh bWVsaXVtX3BvcnRfZ2V0X3R5cGUoY29uc3Qgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KTsK K2RybU1vZGVDb25uZWN0b3IgKmNoYW1lbGl1bV9wb3J0X2dldF9jb25uZWN0b3Ioc3RydWN0IGNo YW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJCQkgICAgICAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpw b3J0LAorCQkJCQkgICAgICAgYm9vbCByZXByb2JlKTsKK2NvbnN0IGNoYXIgKmNoYW1lbGl1bV9w b3J0X2dldF9uYW1lKHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCk7CisKK3ZvaWQgY2hhbWVs aXVtX3BsdWcoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLCBzdHJ1Y3QgY2hhbWVsaXVtX3Bv cnQgKnBvcnQpOwordm9pZCBjaGFtZWxpdW1fdW5wbHVnKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1l bGl1bSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KTsKK2Jvb2wgY2hhbWVsaXVtX2lzX3Bs dWdnZWQoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJICBzdHJ1Y3QgY2hhbWVsaXVt X3BvcnQgKnBvcnQpOworYm9vbCBjaGFtZWxpdW1fcG9ydF93YWl0X3ZpZGVvX2lucHV0X3N0YWJs ZShzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJCSAgICBzdHJ1Y3QgY2hhbWVsaXVt X3BvcnQgKnBvcnQsCisJCQkJCSAgICBpbnQgdGltZW91dF9zZWNzKTsKK3ZvaWQgY2hhbWVsaXVt X2ZpcmVfbWl4ZWRfaHBkX3B1bHNlcyhzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJ ICAgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsIC4uLik7Cit2b2lkIGNoYW1lbGl1bV9m aXJlX2hwZF9wdWxzZXMoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJICAgICAgIHN0 cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCSAgICAgICBpbnQgd2lkdGhfbXNlYywgaW50 IGNvdW50KTsKK3ZvaWQgY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9zdGFydChzdHJ1Y3QgY2hh bWVsaXVtICpjaGFtZWxpdW0sCisJCQkJICAgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQs CisJCQkJICAgICBib29sIGhpZ2gsIGludCBkZWxheV9zZWNzKTsKK3ZvaWQgY2hhbWVsaXVtX2Fz eW5jX2hwZF9wdWxzZV9maW5pc2goc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtKTsKK2ludCBj aGFtZWxpdW1fbmV3X2VkaWQoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVtLCBjb25zdCB1bnNp Z25lZCBjaGFyICplZGlkKTsKK3ZvaWQgY2hhbWVsaXVtX3BvcnRfc2V0X2VkaWQoc3RydWN0IGNo YW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJICAgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQs IGludCBlZGlkX2lkKTsKK2Jvb2wgY2hhbWVsaXVtX3BvcnRfZ2V0X2RkY19zdGF0ZShzdHJ1Y3Qg Y2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQp Owordm9pZCBjaGFtZWxpdW1fcG9ydF9zZXRfZGRjX3N0YXRlKHN0cnVjdCBjaGFtZWxpdW0gKmNo YW1lbGl1bSwKKwkJCQkgIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCQkgIGJvb2wg ZW5hYmxlZCk7Cit2b2lkIGNoYW1lbGl1bV9wb3J0X2dldF9yZXNvbHV0aW9uKHN0cnVjdCBjaGFt ZWxpdW0gKmNoYW1lbGl1bSwKKwkJCQkgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsCisJ CQkJICAgaW50ICp4LCBpbnQgKnkpOworaWd0X2NyY190ICpjaGFtZWxpdW1fZ2V0X2NyY19mb3Jf YXJlYShzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW0sCisJCQkJICAgICAgc3RydWN0IGNoYW1l bGl1bV9wb3J0ICpwb3J0LAorCQkJCSAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsK K3ZvaWQgY2hhbWVsaXVtX3N0YXJ0X2NhcHR1cmUoc3RydWN0IGNoYW1lbGl1bSAqY2hhbWVsaXVt LAorCQkJICAgICBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsCisJCQkgICAgIGludCB4LCBp bnQgeSwgaW50IHcsIGludCBoKTsKK3ZvaWQgY2hhbWVsaXVtX3N0b3BfY2FwdHVyZShzdHJ1Y3Qg Y2hhbWVsaXVtICpjaGFtZWxpdW0sIGludCBmcmFtZV9jb3VudCk7Cit2b2lkIGNoYW1lbGl1bV9j YXB0dXJlKHN0cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0 ICpwb3J0LAorCQkgICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBmcmFtZV9j b3VudCk7CitpZ3RfY3JjX3QgKmNoYW1lbGl1bV9yZWFkX2NhcHR1cmVkX2NyY3Moc3RydWN0IGNo YW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJCQlpbnQgKmZyYW1lX2NvdW50KTsKK3N0cnVjdCBjaGFt ZWxpdW1fZnJhbWVfZHVtcCAqY2hhbWVsaXVtX3JlYWRfY2FwdHVyZWRfZnJhbWUoc3RydWN0IGNo YW1lbGl1bSAqY2hhbWVsaXVtLAorCQkJCQkJCSAgIHVuc2lnbmVkIGludCBpbmRleCk7CitzdHJ1 Y3QgY2hhbWVsaXVtX2ZyYW1lX2R1bXAgKmNoYW1lbGl1bV9wb3J0X2R1bXBfcGl4ZWxzKHN0cnVj dCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwKKwkJCQkJCQlzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBv cnQsCisJCQkJCQkJaW50IHgsIGludCB5LAorCQkJCQkJCWludCB3LCBpbnQgaCk7CitpbnQgY2hh bWVsaXVtX2dldF9jYXB0dXJlZF9mcmFtZV9jb3VudChzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxp dW0pOworaW50IGNoYW1lbGl1bV9nZXRfZnJhbWVfbGltaXQoc3RydWN0IGNoYW1lbGl1bSAqY2hh bWVsaXVtLAorCQkJICAgICAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0LAorCQkJICAgICAg aW50IHcsIGludCBoKTsKKwordm9pZCBjaGFtZWxpdW1fYXNzZXJ0X2ZyYW1lX2VxKGNvbnN0IHN0 cnVjdCBjaGFtZWxpdW0gKmNoYW1lbGl1bSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2hhbWVs aXVtX2ZyYW1lX2R1bXAgKmR1bXAsCisJCQkgICAgICAgc3RydWN0IGlndF9mYiAqZmIpOwordm9p ZCBjaGFtZWxpdW1fZGVzdHJveV9mcmFtZV9kdW1wKHN0cnVjdCBjaGFtZWxpdW1fZnJhbWVfZHVt cCAqZHVtcCk7CisKKyNlbmRpZiAvKiBJR1RfQ0hBTUVMSVVNX0ggKi8KZGlmZiAtLWdpdCBhL3Rl c3RzL01ha2VmaWxlLmFtIGIvdGVzdHMvTWFrZWZpbGUuYW0KaW5kZXggMTRhNDFhZS4uODkzMGMy NCAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0K QEAgLTYyLDcgKzYyLDcgQEAgQU1fQ0ZMQUdTID0gJChEUk1fQ0ZMQUdTKSAkKENXQVJORkxBR1Mp IC1Xbm8tdW51c2VkLXJlc3VsdCAkKERFQlVHX0NGTEFHUylcCiAJJChMSUJVTldJTkRfQ0ZMQUdT KSAkKFdFUlJPUl9DRkxBR1MpIFwKIAkkKE5VTEwpCiAKLUxEQUREID0gLi4vbGliL2xpYmludGVs X3Rvb2xzLmxhICQoR0xJQl9MSUJTKQorTERBREQgPSAuLi9saWIvbGliaW50ZWxfdG9vbHMubGEg JChHTElCX0xJQlMpICQoWE1MUlBDX0xJQlMpCiAKIEFNX0NGTEFHUyArPSAkKENBSVJPX0NGTEFH UykgJChMSUJVREVWX0NGTEFHUykgJChHTElCX0NGTEFHUykKIEFNX0xERkxBR1MgPSAtV2wsLS1h cy1uZWVkZWQKQEAgLTExOCw1ICsxMTgsOCBAQCB2YzRfd2FpdF9ib19DRkxBR1MgPSAkKEFNX0NG TEFHUykgJChEUk1fVkM0X0NGTEFHUykKIHZjNF93YWl0X2JvX0xEQUREID0gJChMREFERCkgJChE Uk1fVkM0X0xJQlMpCiB2YzRfd2FpdF9zZXFub19DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChEUk1f VkM0X0NGTEFHUykKIHZjNF93YWl0X3NlcW5vX0xEQUREID0gJChMREFERCkgJChEUk1fVkM0X0xJ QlMpCisKK2NoYW1lbGl1bV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChYTUxSUENfQ0ZMQUdTKSAk KExJQlVERVZfQ0ZMQUdTKQorY2hhbWVsaXVtX0xEQUREID0gJChMREFERCkgJChYTUxSUENfTElC UykgJChMSUJVREVWX0xJQlMpCiBlbmRpZgogCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5z b3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCAzODM4NWFhLi4wMTZjZDg2IDEw MDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNv dXJjZXMKQEAgLTE0Miw2ICsxNDIsNyBAQCBURVNUU19wcm9nc19NID0gXAogCXRlbXBsYXRlIFwK IAl2Z2VtX2Jhc2ljIFwKIAl2Z2VtX3Nsb3cgXAorCWNoYW1lbGl1bSBcCiAJJChOVUxMKQogCiBU RVNUU19wcm9nc19YTSA9IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoYW1lbGl1bS5jIGIvdGVzdHMv Y2hhbWVsaXVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxNGQ1Ygot LS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoYW1lbGl1bS5jCkBAIC0wLDAgKzEsNjg5IEBACisv KgorICogQ29weXJpZ2h0IMKpIDIwMTYgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3Vi bGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5n IHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUg U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lO RCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBU SEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAq IFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlN LCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9G IENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9S IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFM SU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBMeXVkZSBQ YXVsIDxseXVkZUByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs dWRlICJpZ3QuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisK K3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgY2hhbWVsaXVtICpjaGFtZWxpdW07CisJc3RydWN0 IGNoYW1lbGl1bV9wb3J0ICoqcG9ydHM7CisJaW50IHBvcnRfY291bnQ7CisKKwlpbnQgZHJtX2Zk OworCisJaW50IGVkaWRfaWQ7CisJaW50IGFsdF9lZGlkX2lkOworfSBkYXRhX3Q7CisKKyNkZWZp bmUgSE9UUExVR19USU1FT1VUIDIwIC8qIHNlY29uZHMgKi8KKyNkZWZpbmUgU1VTUEVORF9SRVNV TUVfREVMQVkgMjAgLyogc2Vjb25kcyAqLworCisvKiBQcmUtY2FsY3VsYXRlZCBDUkNzIGZvciB0 aGUgcGF0dGVybiBmYiwgZm9yIGFsbCB0aGUgbW9kZXMgaW4gdGhlIGRlZmF1bHQKKyAqIGNoYW1l bGl1bSBlZGlkCisgKi8KK3N0cnVjdCBjcmNfZW50cnkgeworCWludCB3aWR0aDsKKwlpbnQgaGVp Z2h0OworCWlndF9jcmNfdCBjcmM7Cit9OworCisjZGVmaW5lIENSQ19FTlRSWSh3XywgaF8sIC4u LikgXAorCXsgd18sIGhfLCB7IC5uX3dvcmRzID0gNCwgLmNyYyA9IHsgX19WQV9BUkdTX18gfSB9 IH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjcmNfZW50cnkgcGF0dGVybl9mYl9jcmNzW10gPSB7 CisJQ1JDX0VOVFJZKDE5MjAsIDEwODAsIDB4Zjg1OSwgMHhhNzUxLCAweDhjODEsIDB4NDVhMSks CisJQ1JDX0VOVFJZKDEyODAsICA3MjAsIDB4Y2VjMiwgMHg0MjQ2LCAweDZjZmQsIDB4ZWI0Myks CisJQ1JDX0VOVFJZKDEwMjQsICA3NjgsIDB4ODVlNSwgMHhmMGNkLCAweGFmZTMsIDB4N2YxOCks CisJQ1JDX0VOVFJZKCA4MDAsICA2MDAsIDB4NmIzOSwgMHgzMmI2LCAweDgzMWEsIDB4YjAzZSks CisJQ1JDX0VOVFJZKCA2NDAsICA0ODAsIDB4YTEyMSwgMHgyNDczLCAweGIxNTAsIDB4OGM0Nyks Cit9OworI3VuZGVmIENSQ19FTlRSWQorCitzdGF0aWMgY29uc3QgaWd0X2NyY190ICoKK2dldF9w cmVjYWxjdWxhdGVkX2NyYyhzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQsIGludCB3LCBpbnQg aCkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgY3JjX2VudHJ5ICplbnRyeTsKKworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhdHRlcm5fZmJfY3Jjcyk7IGkrKykgeworCQllbnRyeSA9 ICZwYXR0ZXJuX2ZiX2NyY3NbaV07CisKKwkJaWYgKGVudHJ5LT53aWR0aCA9PSB3ICYmIGVudHJ5 LT5oZWlnaHQgPT0gaCkKKwkJCXJldHVybiAmZW50cnktPmNyYzsKKwl9CisKKwlyZXR1cm4gTlVM TDsKK30KKworc3RhdGljIHZvaWQKK3JlcXVpcmVfY29ubmVjdG9yX3ByZXNlbnQoZGF0YV90ICpk YXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKwlib29sIGZvdW5kID0gZmFsc2U7 CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydF9jb3VudCAmJiAhZm91bmQ7IGkrKykgewor CQlpZiAoY2hhbWVsaXVtX3BvcnRfZ2V0X3R5cGUoZGF0YS0+cG9ydHNbaV0pID09IHR5cGUpCisJ CQlmb3VuZCA9IHRydWU7CisJfQorCisJaWd0X3JlcXVpcmVfZihmb3VuZCwgIk5vIHBvcnQgb2Yg dHlwZSAlcyB3YXMgZm91bmRcbiIsCisJCSAgICAgIGttc3Rlc3RfY29ubmVjdG9yX3R5cGVfc3Ry KHR5cGUpKTsKK30KKworc3RhdGljIGRybU1vZGVDb25uZWN0aW9uCityZXByb2JlX2Nvbm5lY3Rv cihkYXRhX3QgKmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlkcm1Nb2Rl Q29ubmVjdG9yICpjb25uZWN0b3I7CisJZHJtTW9kZUNvbm5lY3Rpb24gc3RhdHVzOworCisJaWd0 X2RlYnVnKCJSZXByb2JpbmcgJXMuLi5cbiIsIGNoYW1lbGl1bV9wb3J0X2dldF9uYW1lKHBvcnQp KTsKKwljb25uZWN0b3IgPSBjaGFtZWxpdW1fcG9ydF9nZXRfY29ubmVjdG9yKGRhdGEtPmNoYW1l bGl1bSwgcG9ydCwgdHJ1ZSk7CisJaWd0X2Fzc2VydChjb25uZWN0b3IpOworCXN0YXR1cyA9IGNv bm5lY3Rvci0+Y29ubmVjdGlvbjsKKworCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7 CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2Nvbm5lY3Rvcihk YXRhX3QgKmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJICAgZHJtTW9kZUNv bm5lY3Rpb24gc3RhdHVzKQoreworCWJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKworCWlndF9kZWJ1 ZygiV2FpdGluZyBmb3IgJXMgdG8gJXNjb25uZWN0Li4uXG4iLAorCQkgIGNoYW1lbGl1bV9wb3J0 X2dldF9uYW1lKHBvcnQpLAorCQkgIHN0YXR1cyA9PSBEUk1fTU9ERV9ESVNDT05ORUNURUQgPyAi ZGlzIiA6ICIiKTsKKworCS8qCisJICogUmVseSBvbiBzaW1wbGUgcmVwcm9iaW5nIHNvIHdlIGRv bid0IGZhaWwgdGVzdHMgdGhhdCBkb24ndCByZXF1aXJlCisJICogdGhhdCBocGQgZXZlbnRzIHdv cmsgaW4gdGhlIGV2ZW50IHRoYXQgaHBkIGRvZXNuJ3Qgd29yayBvbiB0aGUgc3lzdGVtCisJICov CisJaWd0X3VudGlsX3RpbWVvdXQoSE9UUExVR19USU1FT1VUKSB7CisJCWlmIChyZXByb2JlX2Nv bm5lY3RvcihkYXRhLCBwb3J0KSA9PSBzdGF0dXMpIHsKKwkJCWZpbmlzaGVkID0gdHJ1ZTsKKwkJ CXJldHVybjsKKwkJfQorCisJCXNsZWVwKDEpOworCX0KKworCWlndF9hc3NlcnQoZmluaXNoZWQp OworfQorCitzdGF0aWMgdm9pZAorcmVzZXRfc3RhdGUoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hh bWVsaXVtX3BvcnQgKnBvcnQpCit7CisJY2hhbWVsaXVtX3Jlc2V0KGRhdGEtPmNoYW1lbGl1bSk7 CisJd2FpdF9mb3JfY29ubmVjdG9yKGRhdGEsIHBvcnQsIERSTV9NT0RFX0RJU0NPTk5FQ1RFRCk7 Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Jhc2ljX2hvdHBsdWcoZGF0YV90ICpkYXRhLCBzdHJ1 Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVkZXZfbW9uaXRvciAqbW9uID0g aWd0X3dhdGNoX2hvdHBsdWcoKTsKKwlpbnQgaTsKKworCXJlc2V0X3N0YXRlKGRhdGEsIHBvcnQp OworCisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJaWd0X2ZsdXNoX2hvdHBsdWdzKG1v bik7CisKKwkJLyogQ2hlY2sgaWYgd2UgZ2V0IGEgc3lzZnMgaG90cGx1ZyBldmVudCAqLworCQlj aGFtZWxpdW1fcGx1ZyhkYXRhLT5jaGFtZWxpdW0sIHBvcnQpOworCQlpZ3RfYXNzZXJ0KGlndF9o b3RwbHVnX2RldGVjdGVkKG1vbiwgSE9UUExVR19USU1FT1VUKSk7CisJCWlndF9hc3NlcnRfZXEo cmVwcm9iZV9jb25uZWN0b3IoZGF0YSwgcG9ydCksCisJCQkgICAgICBEUk1fTU9ERV9DT05ORUNU RUQpOworCisJCWlndF9mbHVzaF9ob3RwbHVncyhtb24pOworCisJCS8qIE5vdyBjaGVjayBpZiB3 ZSBnZXQgYSBob3RwbHVnIGZyb20gZGlzY29ubmVjdGlvbiAqLworCQljaGFtZWxpdW1fdW5wbHVn KGRhdGEtPmNoYW1lbGl1bSwgcG9ydCk7CisJCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0ZWN0 ZWQobW9uLCBIT1RQTFVHX1RJTUVPVVQpKTsKKwkJaWd0X2Fzc2VydF9lcShyZXByb2JlX2Nvbm5l Y3RvcihkYXRhLCBwb3J0KSwKKwkJCSAgICAgIERSTV9NT0RFX0RJU0NPTk5FQ1RFRCk7CisKKwkJ LyogU2xlZXAgc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGNhdXNlIGFuIGhwZCBzdG9ybSAqLwor CQl1c2xlZXAoNTAwICogMTAwMCk7CisJfQorCisJaWd0X2NsZWFudXBfaG90cGx1Zyhtb24pOwor fQorCitzdGF0aWMgdm9pZAordGVzdF9lZGlkX3JlYWQoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hh bWVsaXVtX3BvcnQgKnBvcnQsCisJICAgICAgIGludCBlZGlkX2lkLCBjb25zdCB1bnNpZ25lZCBj aGFyICplZGlkKQoreworCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgZWRpZF9ibG9iID0gTlVMTDsK Kwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3IgPSBjaGFtZWxpdW1fcG9ydF9nZXRfY29ubmVj dG9yKAorCSAgICBkYXRhLT5jaGFtZWxpdW0sIHBvcnQsIGZhbHNlKTsKKwl1aW50NjRfdCBlZGlk X2Jsb2JfaWQ7CisKKwlyZXNldF9zdGF0ZShkYXRhLCBwb3J0KTsKKworCWNoYW1lbGl1bV9wb3J0 X3NldF9lZGlkKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgZWRpZF9pZCk7CisJY2hhbWVsaXVtX3Bs dWcoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0KTsKKwl3YWl0X2Zvcl9jb25uZWN0b3IoZGF0YSwgcG9y dCwgRFJNX01PREVfQ09OTkVDVEVEKTsKKworCWlndF9hc3NlcnQoa21zdGVzdF9nZXRfcHJvcGVy dHkoZGF0YS0+ZHJtX2ZkLCBjb25uZWN0b3ItPmNvbm5lY3Rvcl9pZCwKKwkJCQkJRFJNX01PREVf T0JKRUNUX0NPTk5FQ1RPUiwgIkVESUQiLCBOVUxMLAorCQkJCQkmZWRpZF9ibG9iX2lkLCBOVUxM KSk7CisJaWd0X2Fzc2VydChlZGlkX2Jsb2IgPSBkcm1Nb2RlR2V0UHJvcGVydHlCbG9iKGRhdGEt PmRybV9mZCwKKwkJCQkJCSAgICAgIGVkaWRfYmxvYl9pZCkpOworCisJaWd0X2Fzc2VydChtZW1j bXAoZWRpZCwgZWRpZF9ibG9iLT5kYXRhLCBFRElEX0xFTkdUSCkgPT0gMCk7CisKKwlkcm1Nb2Rl RnJlZVByb3BlcnR5QmxvYihlZGlkX2Jsb2IpOworCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5l Y3Rvcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N1c3BlbmRfcmVzdW1lX2hwZChkYXRhX3Qg KmRhdGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKKwkJCWVudW0gaWd0X3N1c3BlbmRf c3RhdGUgc3RhdGUsCisJCQllbnVtIGlndF9zdXNwZW5kX3Rlc3QgdGVzdCkKK3sKKwlzdHJ1Y3Qg dWRldl9tb25pdG9yICptb24gPSBpZ3Rfd2F0Y2hfaG90cGx1ZygpOworCisJcmVzZXRfc3RhdGUo ZGF0YSwgcG9ydCk7CisKKwlpZ3Rfc2V0X2F1dG9yZXN1bWVfZGVsYXkoU1VTUEVORF9SRVNVTUVf REVMQVkpOworCWlndF9mbHVzaF9ob3RwbHVncyhtb24pOworCisJLyogTWFrZSBzdXJlIHdlIG5v dGljZSBuZXcgY29ubmVjdG9ycyBhZnRlciByZXN1bWluZyAqLworCWNoYW1lbGl1bV9hc3luY19o cGRfcHVsc2Vfc3RhcnQoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LCBmYWxzZSwKKwkJCQkJU1VTUEVO RF9SRVNVTUVfREVMQVkgLyAyKTsKKwlpZ3Rfc3lzdGVtX3N1c3BlbmRfYXV0b3Jlc3VtZShzdGF0 ZSwgdGVzdCk7CisJY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9maW5pc2goZGF0YS0+Y2hhbWVs aXVtKTsKKworCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0ZWN0ZWQobW9uLCBIT1RQTFVHX1RJ TUVPVVQpKTsKKwlpZ3RfYXNzZXJ0X2VxKHJlcHJvYmVfY29ubmVjdG9yKGRhdGEsIHBvcnQpLCBE Uk1fTU9ERV9DT05ORUNURUQpOworCisJaWd0X2ZsdXNoX2hvdHBsdWdzKG1vbik7CisKKwkvKiBO b3cgbWFrZSBzdXJlIHdlIG5vdGljZSBkaXNjb25uZWN0ZWQgY29ubmVjdG9ycyBhZnRlciByZXN1 bWluZyAqLworCWNoYW1lbGl1bV9hc3luY19ocGRfcHVsc2Vfc3RhcnQoZGF0YS0+Y2hhbWVsaXVt LCBwb3J0LCB0cnVlLAorCQkJCQlTVVNQRU5EX1JFU1VNRV9ERUxBWSAvIDIpOworCWlndF9zeXN0 ZW1fc3VzcGVuZF9hdXRvcmVzdW1lKHN0YXRlLCB0ZXN0KTsKKwljaGFtZWxpdW1fYXN5bmNfaHBk X3B1bHNlX2ZpbmlzaChkYXRhLT5jaGFtZWxpdW0pOworCisJaWd0X2Fzc2VydChpZ3RfaG90cGx1 Z19kZXRlY3RlZChtb24sIEhPVFBMVUdfVElNRU9VVCkpOworCWlndF9hc3NlcnRfZXEocmVwcm9i ZV9jb25uZWN0b3IoZGF0YSwgcG9ydCksIERSTV9NT0RFX0RJU0NPTk5FQ1RFRCk7CisKKwlpZ3Rf Y2xlYW51cF9ob3RwbHVnKG1vbik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N1c3BlbmRfcmVz dW1lX2VkaWRfY2hhbmdlKGRhdGFfdCAqZGF0YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0 LAorCQkJCWVudW0gaWd0X3N1c3BlbmRfc3RhdGUgc3RhdGUsCisJCQkJZW51bSBpZ3Rfc3VzcGVu ZF90ZXN0IHRlc3QsCisJCQkJaW50IGVkaWRfaWQsCisJCQkJaW50IGFsdF9lZGlkX2lkKQorewor CXN0cnVjdCB1ZGV2X21vbml0b3IgKm1vbiA9IGlndF93YXRjaF9ob3RwbHVnKCk7CisKKwlyZXNl dF9zdGF0ZShkYXRhLCBwb3J0KTsKKworCS8qIEZpcnN0IHBsdWcgaW4gdGhlIHBvcnQgKi8KKwlj aGFtZWxpdW1fcG9ydF9zZXRfZWRpZChkYXRhLT5jaGFtZWxpdW0sIHBvcnQsIGVkaWRfaWQpOwor CWNoYW1lbGl1bV9wbHVnKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCk7CisJd2FpdF9mb3JfY29ubmVj dG9yKGRhdGEsIHBvcnQsIERSTV9NT0RFX0NPTk5FQ1RFRCk7CisKKwlpZ3RfZmx1c2hfaG90cGx1 Z3MobW9uKTsKKworCS8qCisJICogQ2hhbmdlIHRoZSBlZGlkIGJlZm9yZSB3ZSBzdXNwZW5kLiBP biByZXN1bWUsIHRoZSBtYWNoaW5lIHNob3VsZAorCSAqIG5vdGljZSB0aGUgRURJRCBjaGFuZ2Ug YW5kIGZpcmUgYSBob3RwbHVnIGV2ZW50LgorCSAqLworCWNoYW1lbGl1bV9wb3J0X3NldF9lZGlk KGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgYWx0X2VkaWRfaWQpOworCisJaWd0X3N5c3RlbV9zdXNw ZW5kX2F1dG9yZXN1bWUoc3RhdGUsIHRlc3QpOworCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0 ZWN0ZWQobW9uLCBIT1RQTFVHX1RJTUVPVVQpKTsKK30KKworc3RhdGljIGlndF9vdXRwdXRfdCAq CitwcmVwYXJlX291dHB1dChkYXRhX3QgKmRhdGEsCisJICAgICAgIGlndF9kaXNwbGF5X3QgKmRp c3BsYXksCisJICAgICAgIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3Rfb3V0 cHV0X3QgKm91dHB1dDsKKwlkcm1Nb2RlUmVzICpyZXM7CisJZHJtTW9kZUNvbm5lY3RvciAqY29u bmVjdG9yID0KKwkJY2hhbWVsaXVtX3BvcnRfZ2V0X2Nvbm5lY3RvcihkYXRhLT5jaGFtZWxpdW0s IHBvcnQsIGZhbHNlKTsKKworCWNoYW1lbGl1bV9yZXNldChkYXRhLT5jaGFtZWxpdW0pOworCisJ aWd0X2Fzc2VydChyZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRhdGEtPmRybV9mZCkpOworCWtt c3Rlc3RfdW5zZXRfYWxsX2NydGNzKGRhdGEtPmRybV9mZCwgcmVzKTsKKworCS8qIFRoZSBjaGFt ZWxpdW0ncyBkZWZhdWx0IEVESUQgaGFzIGEgbG90IG9mIHJlc29sdXRpb25zLCB3YXkgbW9yZSB0 aGVuCisJICogd2UgbmVlZCB0byB0ZXN0CisJICovCisJY2hhbWVsaXVtX3BvcnRfc2V0X2VkaWQo ZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LCBkYXRhLT5lZGlkX2lkKTsKKworCWNoYW1lbGl1bV9wbHVn KGRhdGEtPmNoYW1lbGl1bSwgcG9ydCk7CisJd2FpdF9mb3JfY29ubmVjdG9yKGRhdGEsIHBvcnQs IERSTV9NT0RFX0NPTk5FQ1RFRCk7CisKKwlpZ3RfZGlzcGxheV9pbml0KGRpc3BsYXksIGRhdGEt PmRybV9mZCk7CisJb3V0cHV0ID0gaWd0X291dHB1dF9mcm9tX2Nvbm5lY3RvcihkaXNwbGF5LCBj b25uZWN0b3IpOworCisJaWd0X2Fzc2VydChrbXN0ZXN0X3Byb2JlX2Nvbm5lY3Rvcl9jb25maWco CisJCWRhdGEtPmRybV9mZCwgY29ubmVjdG9yLT5jb25uZWN0b3JfaWQsIH4wLCAmb3V0cHV0LT5j b25maWcpKTsKKwlpZ3Rfb3V0cHV0X3NldF9waXBlKG91dHB1dCwgb3V0cHV0LT5jb25maWcucGlw ZSk7CisKKwlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCWRybU1vZGVGcmVlUmVz b3VyY2VzKHJlcyk7CisKKwlyZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgdm9pZAorZW5hYmxl X291dHB1dChkYXRhX3QgKmRhdGEsCisJICAgICAgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0 LAorCSAgICAgIGlndF9vdXRwdXRfdCAqb3V0cHV0LAorCSAgICAgIGRybU1vZGVNb2RlSW5mbyAq bW9kZSwKKwkgICAgICBzdHJ1Y3QgaWd0X2ZiICpmYikKK3sKKwlpZ3RfZGlzcGxheV90ICpkaXNw bGF5ID0gb3V0cHV0LT5kaXNwbGF5OworCWlndF9wbGFuZV90ICpwcmltYXJ5ID0gaWd0X291dHB1 dF9nZXRfcGxhbmUob3V0cHV0LCBJR1RfUExBTkVfUFJJTUFSWSk7CisJZHJtTW9kZUNvbm5lY3Rv ciAqY29ubmVjdG9yID0gY2hhbWVsaXVtX3BvcnRfZ2V0X2Nvbm5lY3RvcigKKwkgICAgZGF0YS0+ Y2hhbWVsaXVtLCBwb3J0LCBmYWxzZSk7CisKKwlpZ3RfYXNzZXJ0KHByaW1hcnkpOworCisJaWd0 X3BsYW5lX3NldF9zaXplKHByaW1hcnksIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSk7 CisJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5LCBmYik7CisJaWd0X291dHB1dF9vdmVycmlkZV9t b2RlKG91dHB1dCwgbW9kZSk7CisKKwkvKiBDbGVhciBhbnkgY29sb3IgY29ycmVjdGlvbiB2YWx1 ZXMgdGhhdCBtaWdodCBiZSBlbmFibGVkICovCisJaWd0X3BpcGVfc2V0X2RlZ2FtbWFfbHV0KHBy aW1hcnktPnBpcGUsIE5VTEwsIDApOworCWlndF9waXBlX3NldF9nYW1tYV9sdXQocHJpbWFyeS0+ cGlwZSwgTlVMTCwgMCk7CisJaWd0X3BpcGVfc2V0X2N0bV9tYXRyaXgocHJpbWFyeS0+cGlwZSwg TlVMTCwgMCk7CisKKwlrbXN0ZXN0X3NldF9jb25uZWN0b3JfYnJvYWRjYXN0X3JnYihkaXNwbGF5 LT5kcm1fZmQsIGNvbm5lY3RvciwKKwkJCQkJICAgIEJST0FEQ0FTVF9SR0JfRlVMTCk7CisKKwlp Z3RfZGlzcGxheV9jb21taXQoZGlzcGxheSk7CisJY2hhbWVsaXVtX3BvcnRfd2FpdF92aWRlb19p bnB1dF9zdGFibGUoZGF0YS0+Y2hhbWVsaXVtLCBwb3J0LAorCQkJCQkgICAgICAgSE9UUExVR19U SU1FT1VUKTsKKworCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7Cit9CisKK3N0YXRp YyB2b2lkCitkaXNhYmxlX291dHB1dChkYXRhX3QgKmRhdGEsCisJICAgICAgIHN0cnVjdCBjaGFt ZWxpdW1fcG9ydCAqcG9ydCwKKwkgICAgICAgaWd0X291dHB1dF90ICpvdXRwdXQpCit7CisJaWd0 X2Rpc3BsYXlfdCAqZGlzcGxheSA9IG91dHB1dC0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAqcHJp bWFyeSA9IGlndF9vdXRwdXRfZ2V0X3BsYW5lKG91dHB1dCwgSUdUX1BMQU5FX1BSSU1BUlkpOwor CWlndF9hc3NlcnQocHJpbWFyeSk7CisKKwkvKiBEaXNhYmxlIHRoZSBkaXNwbGF5ICovCisJaWd0 X3BsYW5lX3NldF9mYihwcmltYXJ5LCBOVUxMKTsKKwlpZ3RfZGlzcGxheV9jb21taXQoZGlzcGxh eSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Rpc3BsYXlfY3JjX3NpbmdsZShkYXRhX3QgKmRh dGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3RfZGlzcGxheV90IGRpc3Bs YXk7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisJaWd0 X2NyY190ICpjcmM7CisJY29uc3QgaWd0X2NyY190ICpleHBlY3RlZF9jcmM7CisJc3RydWN0IGln dF9mYiBmYjsKKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7CisJZHJtTW9kZUNvbm5lY3RvciAqY29u bmVjdG9yOworCWludCBmYl9pZCwgaTsKKworCW91dHB1dCA9IHByZXBhcmVfb3V0cHV0KGRhdGEs ICZkaXNwbGF5LCBwb3J0KTsKKwljb25uZWN0b3IgPSBjaGFtZWxpdW1fcG9ydF9nZXRfY29ubmVj dG9yKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgZmFsc2UpOworCXByaW1hcnkgPSBpZ3Rfb3V0cHV0 X2dldF9wbGFuZShvdXRwdXQsIElHVF9QTEFORV9QUklNQVJZKTsKKwlpZ3RfYXNzZXJ0KHByaW1h cnkpOworCisJZm9yIChpID0gMDsgaSA8IGNvbm5lY3Rvci0+Y291bnRfbW9kZXM7IGkrKykgewor CQltb2RlID0gJmNvbm5lY3Rvci0+bW9kZXNbaV07CisJCWZiX2lkID0gaWd0X2NyZWF0ZV9jb2xv cl9wYXR0ZXJuX2ZiKGRhdGEtPmRybV9mZCwKKwkJCQkJCSAgICBtb2RlLT5oZGlzcGxheSwKKwkJ CQkJCSAgICBtb2RlLT52ZGlzcGxheSwKKwkJCQkJCSAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAor CQkJCQkJICAgIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUsCisJCQkJCQkgICAgMCwgMCwgMCwg JmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCA+IDApOworCisJCWVuYWJsZV9vdXRwdXQoZGF0YSwg cG9ydCwgb3V0cHV0LCBtb2RlLCAmZmIpOworCisJCWV4cGVjdGVkX2NyYyA9IGdldF9wcmVjYWxj dWxhdGVkX2NyYyhwb3J0LAorCQkJCQkJICAgICBtb2RlLT5oZGlzcGxheSwKKwkJCQkJCSAgICAg bW9kZS0+dmRpc3BsYXkpOworCQlpZiAoIWV4cGVjdGVkX2NyYykgeworCQkJaWd0X3dhcm4oIk5v IHByZWNhbGN1bGF0ZWQgQ1JDIGZvdW5kIGZvciAlZHglZCwgc2tpcHBpbmcgQ1JDIGNoZWNrXG4i LAorCQkJCSBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXkpOworCQkJZ290byBuZXh0Owor CQl9CisKKwkJaWd0X2RlYnVnKCJUZXN0aW5nIHNpbmdsZSBDUkMgZmV0Y2hcbiIpOworCQljcmMg PSBjaGFtZWxpdW1fZ2V0X2NyY19mb3JfYXJlYShkYXRhLT5jaGFtZWxpdW0sIHBvcnQsCisJCQkJ CQkgMCwgMCwgMCwgMCk7CisJCWlndF9hc3NlcnRfY3JjX2VxdWFsKGNyYywgZXhwZWN0ZWRfY3Jj KTsKKwkJZnJlZShjcmMpOworCituZXh0OgorCQlkaXNhYmxlX291dHB1dChkYXRhLCBwb3J0LCBv dXRwdXQpOworCQlpZ3RfcmVtb3ZlX2ZiKGRhdGEtPmRybV9mZCwgJmZiKTsKKwl9CisKKwlkcm1N b2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCWlndF9kaXNwbGF5X2ZpbmkoJmRpc3BsYXkp OworfQorCitzdGF0aWMgdm9pZAordGVzdF9kaXNwbGF5X2NyY19tdWx0aXBsZShkYXRhX3QgKmRh dGEsIHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3RfZGlzcGxheV90IGRpc3Bs YXk7CisJaWd0X291dHB1dF90ICpvdXRwdXQ7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisJaWd0 X2NyY190ICpjcmM7CisJY29uc3QgaWd0X2NyY190ICpleHBlY3RlZF9jcmM7CisJc3RydWN0IGln dF9mYiBmYjsKKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7CisJZHJtTW9kZUNvbm5lY3RvciAqY29u bmVjdG9yOworCWludCBmYl9pZCwgaSwgaiwgY2FwdHVyZWRfZnJhbWVfY291bnQ7CisKKwlvdXRw dXQgPSBwcmVwYXJlX291dHB1dChkYXRhLCAmZGlzcGxheSwgcG9ydCk7CisJY29ubmVjdG9yID0g Y2hhbWVsaXVtX3BvcnRfZ2V0X2Nvbm5lY3RvcihkYXRhLT5jaGFtZWxpdW0sIHBvcnQsIGZhbHNl KTsKKwlwcmltYXJ5ID0gaWd0X291dHB1dF9nZXRfcGxhbmUob3V0cHV0LCBJR1RfUExBTkVfUFJJ TUFSWSk7CisJaWd0X2Fzc2VydChwcmltYXJ5KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0 b3ItPmNvdW50X21vZGVzOyBpKyspIHsKKwkJbW9kZSA9ICZjb25uZWN0b3ItPm1vZGVzW2ldOwor CQlmYl9pZCA9IGlndF9jcmVhdGVfY29sb3JfcGF0dGVybl9mYihkYXRhLT5kcm1fZmQsCisJCQkJ CQkgICAgbW9kZS0+aGRpc3BsYXksCisJCQkJCQkgICAgbW9kZS0+dmRpc3BsYXksCisJCQkJCQkg ICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKKwkJCQkJCSAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9O T05FLAorCQkJCQkJICAgIDAsIDAsIDAsICZmYik7CisJCWlndF9hc3NlcnQoZmJfaWQgPiAwKTsK KworCQllbmFibGVfb3V0cHV0KGRhdGEsIHBvcnQsIG91dHB1dCwgbW9kZSwgJmZiKTsKKworCQll eHBlY3RlZF9jcmMgPSBnZXRfcHJlY2FsY3VsYXRlZF9jcmMocG9ydCwgbW9kZS0+aGRpc3BsYXks CisJCQkJCQkgICAgIG1vZGUtPnZkaXNwbGF5KTsKKwkJaWYgKCFleHBlY3RlZF9jcmMpIHsKKwkJ CWlndF93YXJuKCJObyBwcmVjYWxjdWxhdGVkIENSQyBmb3VuZCBmb3IgJWR4JWQsIHNraXBwaW5n IENSQyBjaGVja1xuIiwKKwkJCQkgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5KTsKKwkJ CWdvdG8gbmV4dDsKKwkJfQorCisJCS8qIFdlIHdhbnQgdG8ga2VlcCB0aGUgZGlzcGxheSBydW5u aW5nIGZvciBhIGxpdHRsZSBiaXQsIHNpbmNlCisJCSAqIHRoZXJlJ3MgYWx3YXlzIHRoZSBwb3Rl bnRpYWwgdGhlIGRyaXZlciBpc24ndCBhYmxlIHRvIGtlZXAKKwkJICogdGhlIGRpc3BsYXkgcnVu bmluZyBwcm9wZXJseSBmb3IgdmVyeSBsb25nCisJCSAqLworCQljaGFtZWxpdW1fY2FwdHVyZShk YXRhLT5jaGFtZWxpdW0sIHBvcnQsIDAsIDAsIDAsIDAsIDMpOworCQljcmMgPSBjaGFtZWxpdW1f cmVhZF9jYXB0dXJlZF9jcmNzKGRhdGEtPmNoYW1lbGl1bSwKKwkJCQkJCSAgICZjYXB0dXJlZF9m cmFtZV9jb3VudCk7CisKKwkJaWd0X2RlYnVnKCJDYXB0dXJlZCAlZCBmcmFtZXNcbiIsIGNhcHR1 cmVkX2ZyYW1lX2NvdW50KTsKKwkJZm9yIChqID0gMDsgaiA8IGNhcHR1cmVkX2ZyYW1lX2NvdW50 OyBqKyspCisJCQlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmY3JjW2pdLCBleHBlY3RlZF9jcmMpOwor CQlmcmVlKGNyYyk7CisKK25leHQ6CisJCWRpc2FibGVfb3V0cHV0KGRhdGEsIHBvcnQsIG91dHB1 dCk7CisJCWlndF9yZW1vdmVfZmIoZGF0YS0+ZHJtX2ZkLCAmZmIpOworCX0KKworCWRybU1vZGVG cmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7CisJaWd0X2Rpc3BsYXlfZmluaSgmZGlzcGxheSk7Cit9 CisKK3N0YXRpYyB2b2lkCit0ZXN0X2Rpc3BsYXlfZnJhbWVfZHVtcChkYXRhX3QgKmRhdGEsIHN0 cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCkKK3sKKwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7CisJ aWd0X291dHB1dF90ICpvdXRwdXQ7CisJaWd0X3BsYW5lX3QgKnByaW1hcnk7CisJc3RydWN0IGln dF9mYiBmYjsKKwlzdHJ1Y3QgY2hhbWVsaXVtX2ZyYW1lX2R1bXAgKmZyYW1lOworCWRybU1vZGVN b2RlSW5mbyAqbW9kZTsKKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IGZiX2lk LCBpLCBqOworCisJb3V0cHV0ID0gcHJlcGFyZV9vdXRwdXQoZGF0YSwgJmRpc3BsYXksIHBvcnQp OworCWNvbm5lY3RvciA9IGNoYW1lbGl1bV9wb3J0X2dldF9jb25uZWN0b3IoZGF0YS0+Y2hhbWVs aXVtLCBwb3J0LCBmYWxzZSk7CisJcHJpbWFyeSA9IGlndF9vdXRwdXRfZ2V0X3BsYW5lKG91dHB1 dCwgSUdUX1BMQU5FX1BSSU1BUlkpOworCWlndF9hc3NlcnQocHJpbWFyeSk7CisKKwlmb3IgKGkg PSAwOyBpIDwgY29ubmVjdG9yLT5jb3VudF9tb2RlczsgaSsrKSB7CisJCW1vZGUgPSAmY29ubmVj dG9yLT5tb2Rlc1tpXTsKKwkJZmJfaWQgPSBpZ3RfY3JlYXRlX2NvbG9yX3BhdHRlcm5fZmIoZGF0 YS0+ZHJtX2ZkLAorCQkJCQkJICAgIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwKKwkJ CQkJCSAgICBEUk1fRk9STUFUX1hSR0I4ODg4LAorCQkJCQkJICAgIExPQ0FMX0RSTV9GT1JNQVRf TU9EX05PTkUsCisJCQkJCQkgICAgMCwgMCwgMCwgJmZiKTsKKwkJaWd0X2Fzc2VydChmYl9pZCA+ IDApOworCisJCWVuYWJsZV9vdXRwdXQoZGF0YSwgcG9ydCwgb3V0cHV0LCBtb2RlLCAmZmIpOwor CisJCWlndF9kZWJ1ZygiUmVhZGluZyBmcmFtZSBkdW1wcyBmcm9tIENoYW1lbGl1bS4uLlxuIik7 CisJCWNoYW1lbGl1bV9jYXB0dXJlKGRhdGEtPmNoYW1lbGl1bSwgcG9ydCwgMCwgMCwgMCwgMCwg NSk7CisJCWZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKKwkJCWZyYW1lID0gY2hhbWVsaXVtX3Jl YWRfY2FwdHVyZWRfZnJhbWUoCisJCQkgICAgZGF0YS0+Y2hhbWVsaXVtLCBqKTsKKwkJCWNoYW1l bGl1bV9hc3NlcnRfZnJhbWVfZXEoZGF0YS0+Y2hhbWVsaXVtLCBmcmFtZSwgJmZiKTsKKwkJCWNo YW1lbGl1bV9kZXN0cm95X2ZyYW1lX2R1bXAoZnJhbWUpOworCQl9CisKKwkJZGlzYWJsZV9vdXRw dXQoZGF0YSwgcG9ydCwgb3V0cHV0KTsKKwkJaWd0X3JlbW92ZV9mYihkYXRhLT5kcm1fZmQsICZm Yik7CisJfQorCisJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKKwlpZ3RfZGlzcGxh eV9maW5pKCZkaXNwbGF5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfaHBkX3dpdGhvdXRfZGRj KGRhdGFfdCAqZGF0YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1 ZGV2X21vbml0b3IgKm1vbiA9IGlndF93YXRjaF9ob3RwbHVnKCk7CisKKwlyZXNldF9zdGF0ZShk YXRhLCBwb3J0KTsKKworCS8qIERpc2FibGUgdGhlIEREQyBvbiB0aGUgY29ubmVjdG9yIGFuZCBt YWtlIHN1cmUgd2Ugc3RpbGwgZ2V0IGEKKwkgKiBob3RwbHVnCisJICovCisJY2hhbWVsaXVtX3Bv cnRfc2V0X2RkY19zdGF0ZShkYXRhLT5jaGFtZWxpdW0sIHBvcnQsIGZhbHNlKTsKKwljaGFtZWxp dW1fcGx1ZyhkYXRhLT5jaGFtZWxpdW0sIHBvcnQpOworCisJaWd0X2Fzc2VydChpZ3RfaG90cGx1 Z19kZXRlY3RlZChtb24sIEhPVFBMVUdfVElNRU9VVCkpOworCWlndF9hc3NlcnRfZXEocmVwcm9i ZV9jb25uZWN0b3IoZGF0YSwgcG9ydCksIERSTV9NT0RFX0NPTk5FQ1RFRCk7CisKKwlpZ3RfY2xl YW51cF9ob3RwbHVnKG1vbik7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfcG9ydChwLCBwb3J0KSAg ICAgICAgICAgIFwKKwlmb3IgKHAgPSAwLCBwb3J0ID0gZGF0YS5wb3J0c1twXTsgXAorCSAgICAg cCA8IGRhdGEucG9ydF9jb3VudDsgICAgICAgICBcCisJICAgICBwKyssIHBvcnQgPSBkYXRhLnBv cnRzW3BdKQorCisjZGVmaW5lIGNvbm5lY3Rvcl9zdWJ0ZXN0KG5hbWVfXywgdHlwZV9fKSAgICAg ICAgICAgICAgICAgICAgXAorCWlndF9zdWJ0ZXN0KG5hbWVfXykgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorCQlmb3JfZWFjaF9wb3J0KHAsIHBvcnQpICAgICAgICAgICAgICAg ICAgICAgICBcCisJCQlpZiAoY2hhbWVsaXVtX3BvcnRfZ2V0X3R5cGUocG9ydCkgPT0gXAorCQkJ ICAgIERSTV9NT0RFX0NPTk5FQ1RPUl8gIyMgdHlwZV9fKQorCitzdGF0aWMgZGF0YV90IGRhdGE7 CisKK2lndF9tYWluCit7CisJc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0OworCWludCBlZGlk X2lkLCBhbHRfZWRpZF9pZCwgcDsKKworCWlndF9maXh0dXJlIHsKKwkJaWd0X3NraXBfb25fc2lt dWxhdGlvbigpOworCisJCWRhdGEuZHJtX2ZkID0gZHJtX29wZW5fZHJpdmVyX21hc3RlcihEUklW RVJfQU5ZKTsKKwkJZGF0YS5jaGFtZWxpdW0gPSBjaGFtZWxpdW1faW5pdChkYXRhLmRybV9mZCk7 CisJCWlndF9yZXF1aXJlKGRhdGEuY2hhbWVsaXVtKTsKKworCQlkYXRhLnBvcnRzID0gY2hhbWVs aXVtX2dldF9wb3J0cyhkYXRhLmNoYW1lbGl1bSwKKwkJCQkJCSAmZGF0YS5wb3J0X2NvdW50KTsK KworCQllZGlkX2lkID0gY2hhbWVsaXVtX25ld19lZGlkKGRhdGEuY2hhbWVsaXVtLAorCQkJCQkg ICAgIGlndF9rbXNfZ2V0X2Jhc2VfZWRpZCgpKTsKKwkJYWx0X2VkaWRfaWQgPSBjaGFtZWxpdW1f bmV3X2VkaWQoZGF0YS5jaGFtZWxpdW0sCisJCQkJCQkgaWd0X2ttc19nZXRfYWx0X2VkaWQoKSk7 CisJCWRhdGEuZWRpZF9pZCA9IGVkaWRfaWQ7CisJCWRhdGEuYWx0X2VkaWRfaWQgPSBhbHRfZWRp ZF9pZDsKKworCQkvKiBTbyBmYmNvbiBkb2Vzbid0IHRyeSB0byByZXByb2JlIHRoaW5ncyBpdHNl bGYgKi8KKwkJa21zdGVzdF9zZXRfdnRfZ3JhcGhpY3NfbW9kZSgpOworCX0KKworCWlndF9zdWJ0 ZXN0X2dyb3VwIHsKKwkJaWd0X2ZpeHR1cmUgeworCQkJcmVxdWlyZV9jb25uZWN0b3JfcHJlc2Vu dCgKKwkJCSAgICAmZGF0YSwgRFJNX01PREVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0KTsKKwkJfQor CisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJkcC1ocGQiLCBEaXNwbGF5UG9ydCkKKwkJCXRlc3RfYmFz aWNfaG90cGx1ZygmZGF0YSwgcG9ydCk7CisKKwkJY29ubmVjdG9yX3N1YnRlc3QoImRwLWVkaWQt cmVhZCIsIERpc3BsYXlQb3J0KSB7CisJCQl0ZXN0X2VkaWRfcmVhZCgmZGF0YSwgcG9ydCwgZWRp ZF9pZCwKKwkJCQkgICAgICAgaWd0X2ttc19nZXRfYmFzZV9lZGlkKCkpOworCQkJdGVzdF9lZGlk X3JlYWQoJmRhdGEsIHBvcnQsIGFsdF9lZGlkX2lkLAorCQkJCSAgICAgICBpZ3Rfa21zX2dldF9h bHRfZWRpZCgpKTsKKwkJfQorCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJkcC1ocGQtYWZ0ZXItc3Vz cGVuZCIsIERpc3BsYXlQb3J0KQorCQkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9ocGQoJmRhdGEsIHBv cnQsCisJCQkJCQlTVVNQRU5EX1NUQVRFX01FTSwKKwkJCQkJCVNVU1BFTkRfVEVTVF9OT05FKTsK KworCQljb25uZWN0b3Jfc3VidGVzdCgiZHAtaHBkLWFmdGVyLWhpYmVybmF0ZSIsIERpc3BsYXlQ b3J0KQorCQkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9ocGQoJmRhdGEsIHBvcnQsCisJCQkJCQlTVVNQ RU5EX1NUQVRFX0RJU0ssCisJCQkJCQlTVVNQRU5EX1RFU1RfREVWSUNFUyk7CisKKwkJY29ubmVj dG9yX3N1YnRlc3QoImRwLWVkaWQtY2hhbmdlLWR1cmluZy1zdXNwZW5kIiwgRGlzcGxheVBvcnQp CisJCQl0ZXN0X3N1c3BlbmRfcmVzdW1lX2VkaWRfY2hhbmdlKCZkYXRhLCBwb3J0LAorCQkJCQkJ CVNVU1BFTkRfU1RBVEVfTUVNLAorCQkJCQkJCVNVU1BFTkRfVEVTVF9OT05FLAorCQkJCQkJCWVk aWRfaWQsIGFsdF9lZGlkX2lkKTsKKworCQljb25uZWN0b3Jfc3VidGVzdCgiZHAtZWRpZC1jaGFu Z2UtZHVyaW5nLWhpYmVybmF0ZSIsIERpc3BsYXlQb3J0KQorCQkJdGVzdF9zdXNwZW5kX3Jlc3Vt ZV9lZGlkX2NoYW5nZSgmZGF0YSwgcG9ydCwKKwkJCQkJCQlTVVNQRU5EX1NUQVRFX0RJU0ssCisJ CQkJCQkJU1VTUEVORF9URVNUX0RFVklDRVMsCisJCQkJCQkJZWRpZF9pZCwgYWx0X2VkaWRfaWQp OworCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJkcC1jcmMtc2luZ2xlIiwgRGlzcGxheVBvcnQpCisJ CQl0ZXN0X2Rpc3BsYXlfY3JjX3NpbmdsZSgmZGF0YSwgcG9ydCk7CisKKwkJY29ubmVjdG9yX3N1 YnRlc3QoImRwLWNyYy1tdWx0aXBsZSIsIERpc3BsYXlQb3J0KQorCQkJdGVzdF9kaXNwbGF5X2Ny Y19tdWx0aXBsZSgmZGF0YSwgcG9ydCk7CisKKwkJY29ubmVjdG9yX3N1YnRlc3QoImRwLWZyYW1l LWR1bXAiLCBEaXNwbGF5UG9ydCkKKwkJCXRlc3RfZGlzcGxheV9mcmFtZV9kdW1wKCZkYXRhLCBw b3J0KTsKKwl9CisKKwlpZ3Rfc3VidGVzdF9ncm91cCB7CisJCWlndF9maXh0dXJlIHsKKwkJCXJl cXVpcmVfY29ubmVjdG9yX3ByZXNlbnQoCisJCQkgICAgJmRhdGEsIERSTV9NT0RFX0NPTk5FQ1RP Ul9IRE1JQSk7CisJCX0KKworCQljb25uZWN0b3Jfc3VidGVzdCgiaGRtaS1ocGQiLCBIRE1JQSkK KwkJCXRlc3RfYmFzaWNfaG90cGx1ZygmZGF0YSwgcG9ydCk7CisKKwkJY29ubmVjdG9yX3N1YnRl c3QoImhkbWktZWRpZC1yZWFkIiwgSERNSUEpIHsKKwkJCXRlc3RfZWRpZF9yZWFkKCZkYXRhLCBw b3J0LCBlZGlkX2lkLAorCQkJCSAgICAgICBpZ3Rfa21zX2dldF9iYXNlX2VkaWQoKSk7CisJCQl0 ZXN0X2VkaWRfcmVhZCgmZGF0YSwgcG9ydCwgYWx0X2VkaWRfaWQsCisJCQkJICAgICAgIGlndF9r bXNfZ2V0X2FsdF9lZGlkKCkpOworCQl9CisKKwkJY29ubmVjdG9yX3N1YnRlc3QoImhkbWktaHBk LWFmdGVyLXN1c3BlbmQiLCBIRE1JQSkKKwkJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfaHBkKCZkYXRh LCBwb3J0LAorCQkJCQkJU1VTUEVORF9TVEFURV9NRU0sCisJCQkJCQlTVVNQRU5EX1RFU1RfTk9O RSk7CisKKwkJY29ubmVjdG9yX3N1YnRlc3QoImhkbWktaHBkLWFmdGVyLWhpYmVybmF0ZSIsIEhE TUlBKQorCQkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9ocGQoJmRhdGEsIHBvcnQsCisJCQkJCQlTVVNQ RU5EX1NUQVRFX0RJU0ssCisJCQkJCQlTVVNQRU5EX1RFU1RfREVWSUNFUyk7CisKKwkJY29ubmVj dG9yX3N1YnRlc3QoImhkbWktZWRpZC1jaGFuZ2UtZHVyaW5nLXN1c3BlbmQiLCBIRE1JQSkKKwkJ CXRlc3Rfc3VzcGVuZF9yZXN1bWVfZWRpZF9jaGFuZ2UoJmRhdGEsIHBvcnQsCisJCQkJCQkJU1VT UEVORF9TVEFURV9NRU0sCisJCQkJCQkJU1VTUEVORF9URVNUX05PTkUsCisJCQkJCQkJZWRpZF9p ZCwgYWx0X2VkaWRfaWQpOworCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJoZG1pLWVkaWQtY2hhbmdl LWR1cmluZy1oaWJlcm5hdGUiLCBIRE1JQSkKKwkJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfZWRpZF9j aGFuZ2UoJmRhdGEsIHBvcnQsCisJCQkJCQkJU1VTUEVORF9TVEFURV9ESVNLLAorCQkJCQkJCVNV U1BFTkRfVEVTVF9ERVZJQ0VTLAorCQkJCQkJCWVkaWRfaWQsIGFsdF9lZGlkX2lkKTsKKworCQlj b25uZWN0b3Jfc3VidGVzdCgiaGRtaS1jcmMtc2luZ2xlIiwgSERNSUEpCisJCQl0ZXN0X2Rpc3Bs YXlfY3JjX3NpbmdsZSgmZGF0YSwgcG9ydCk7CisKKwkJY29ubmVjdG9yX3N1YnRlc3QoImhkbWkt Y3JjLW11bHRpcGxlIiwgSERNSUEpCisJCQl0ZXN0X2Rpc3BsYXlfY3JjX211bHRpcGxlKCZkYXRh LCBwb3J0KTsKKworCQljb25uZWN0b3Jfc3VidGVzdCgiaGRtaS1mcmFtZS1kdW1wIiwgSERNSUEp CisJCQl0ZXN0X2Rpc3BsYXlfZnJhbWVfZHVtcCgmZGF0YSwgcG9ydCk7CisJfQorCisJaWd0X3N1 YnRlc3RfZ3JvdXAgeworCQlpZ3RfZml4dHVyZSB7CisJCQlyZXF1aXJlX2Nvbm5lY3Rvcl9wcmVz ZW50KAorCQkJICAgICZkYXRhLCBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKTsKKwkJfQorCisJCWNv bm5lY3Rvcl9zdWJ0ZXN0KCJ2Z2EtaHBkIiwgVkdBKQorCQkJdGVzdF9iYXNpY19ob3RwbHVnKCZk YXRhLCBwb3J0KTsKKworCQljb25uZWN0b3Jfc3VidGVzdCgidmdhLWVkaWQtcmVhZCIsIFZHQSkg eworCQkJdGVzdF9lZGlkX3JlYWQoJmRhdGEsIHBvcnQsIGVkaWRfaWQsCisJCQkJICAgICAgIGln dF9rbXNfZ2V0X2Jhc2VfZWRpZCgpKTsKKwkJCXRlc3RfZWRpZF9yZWFkKCZkYXRhLCBwb3J0LCBh bHRfZWRpZF9pZCwKKwkJCQkgICAgICAgaWd0X2ttc19nZXRfYWx0X2VkaWQoKSk7CisJCX0KKwor CQkvKiBGSVhNRTogUmlnaHQgbm93IHRoZXJlIGlzbid0IGEgd2F5IHRvIGRvIGFueSBzb3J0IG9m IGRlbGF5ZWQKKwkJICogcHN1ZWRvLWhvdHBsdWcgd2l0aCBWR0EsIHNvIHRlc3RpbmcgZGV0ZWN0 aW9uIGFmdGVyIGEKKwkJICogc3VzcGVuZC9yZXN1bWUgY3ljbGUgaXNuJ3QgcG9zc2libGUgeWV0 CisJCSAqLworCisJCWNvbm5lY3Rvcl9zdWJ0ZXN0KCJ2Z2EtaHBkLXdpdGhvdXQtZGRjIiwgVkdB KQorCQkJdGVzdF9ocGRfd2l0aG91dF9kZGMoJmRhdGEsIHBvcnQpOworCX0KK30KLS0gCjIuOS4z CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK