From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F2181C4361B for ; Fri, 18 Dec 2020 20:50:33 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4693523B6C for ; Fri, 18 Dec 2020 20:50:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4693523B6C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=chris-wilson.co.uk Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B200C89B99; Fri, 18 Dec 2020 20:50:31 +0000 (UTC) Received: from fireflyinternet.com (unknown [77.68.26.236]) by gabe.freedesktop.org (Postfix) with ESMTPS id B745489B99 for ; Fri, 18 Dec 2020 20:50:25 +0000 (UTC) X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; Received: from build.alporthouse.com (unverified [78.156.65.138]) by fireflyinternet.com (Firefly Internet (M1)) with ESMTP id 23371504-1500050 for ; Fri, 18 Dec 2020 20:50:22 +0000 From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Fri, 18 Dec 2020 20:50:20 +0000 Message-Id: <20201218205021.27126-1-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [Intel-gfx] [CI 1/2] drm/i915/gt: Split logical ring contexts from execlist submission X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" U3BsaXQgdGhlIGRlZmluaXRpb24sIGNvbnN0cnVjdGlvbiBhbmQgdXBkYXRpbmcgb2YgdGhlIExv Z2ljYWwgUmluZwpDb250ZXh0IGZyb20gdGhlIGV4ZWNsaXN0IHN1Ym1pc3Npb24gaW50ZXJmYWNl LiBUaGUgTFJDIGlzIHVzZWQgYnkgdGhlCkhXLCBpcnJlc3BlY3RpdmUgb2Ygb3VyIGRpZmZlcmVu dCBzdWJtaXNzaW9uIGJhY2tlbmRzLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJp c0BjaHJpcy13aWxzb24uY28udWs+ClJldmlld2VkLWJ5OiBEYW5pZWxlIENlcmFvbG8gU3B1cmlv IDxkYW5pZWxlLmNlcmFvbG9zcHVyaW9AaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9p OTE1L01ha2VmaWxlICAgICAgICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvZ2VuOF9lbmdpbmVfY3MuYyAgICAgIHwgICAgMiArLQogZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvaW50ZWxfY29udGV4dF9zc2V1LmMgIHwgICAgMyArLQogLi4uL2RybS9pOTE1L2d0L2lu dGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmMgIHwgMTY4MyArLS0tLS0tLS0tLS0tLS0KIC4uLi9k cm0vaTkxNS9ndC9pbnRlbF9leGVjbGlzdHNfc3VibWlzc2lvbi5oICB8ICAgMTcgLQogZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjLmMgICAgICAgICAgIHwgMTU2MSArKysrKysrKysr KysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjLmggICAgICAgICAgIHwgICA4 MiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmNfcmVnLmggICAgICAgfCAgICAy ICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3NlbGZ0ZXN0X2V4ZWNsaXN0cy5jICB8IDE3NzYg Ky0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRlc3RfbHJjLmMg ICAgICAgIHwgMTg2MSArKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv dWMvaW50ZWxfZ3VjX2Fkcy5jICAgIHwgICAgMiArLQogLi4uL2dwdS9kcm0vaTkxNS9ndC91Yy9p bnRlbF9ndWNfc3VibWlzc2lvbi5jIHwgICAyNiArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0 L3NjaGVkdWxlci5jICAgICAgICAgIHwgICAgMSArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X3BlcmYuYyAgICAgICAgICAgICAgfCAgICAyICstCiAxNCBmaWxlcyBjaGFuZ2VkLCAzNTk3IGlu c2VydGlvbnMoKyksIDM0MjIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmMuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L3NlbGZ0ZXN0X2xyYy5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCBm OWVmNTE5OWIxMjQuLjg0OWM3YjNmYzk0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTEwNCw2 ICsxMDQsNyBAQCBndC15ICs9IFwKIAlndC9pbnRlbF9ndF9yZXF1ZXN0cy5vIFwKIAlndC9pbnRl bF9ndHQubyBcCiAJZ3QvaW50ZWxfbGxjLm8gXAorCWd0L2ludGVsX2xyYy5vIFwKIAlndC9pbnRl bF9tb2NzLm8gXAogCWd0L2ludGVsX3BwZ3R0Lm8gXAogCWd0L2ludGVsX3JjNi5vIFwKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfZW5naW5lX2NzLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9ndC9nZW44X2VuZ2luZV9jcy5jCmluZGV4IDljNmYwZWJmYTNjZi4uMTk3 MmRkNWRjYTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW44X2VuZ2lu ZV9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfZW5naW5lX2NzLmMKQEAg LTUsNyArNSw3IEBACiAKICNpbmNsdWRlICJnZW44X2VuZ2luZV9jcy5oIgogI2luY2x1ZGUgImk5 MTVfZHJ2LmgiCi0jaW5jbHVkZSAiaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaCIgLyogWFhY ICovCisjaW5jbHVkZSAiaW50ZWxfbHJjLmgiCiAjaW5jbHVkZSAiaW50ZWxfZ3B1X2NvbW1hbmRz LmgiCiAjaW5jbHVkZSAiaW50ZWxfcmluZy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3NzZXUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0 L2ludGVsX2NvbnRleHRfc3NldS5jCmluZGV4IDVmOTRiNDQwMjJkYy4uOGRmZDhmNjU2YWFhIDEw MDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3NzZXUuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9jb250ZXh0X3NzZXUuYwpAQCAtOCw4 ICs4LDcgQEAKICNpbmNsdWRlICJpbnRlbF9jb250ZXh0LmgiCiAjaW5jbHVkZSAiaW50ZWxfZW5n aW5lX3BtLmgiCiAjaW5jbHVkZSAiaW50ZWxfZ3B1X2NvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaW50 ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaCIKLSNpbmNsdWRlICJpbnRlbF9scmNfcmVnLmgiCisj aW5jbHVkZSAiaW50ZWxfbHJjLmgiCiAjaW5jbHVkZSAiaW50ZWxfcmluZy5oIgogI2luY2x1ZGUg ImludGVsX3NzZXUuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50 ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVs X2V4ZWNsaXN0c19zdWJtaXNzaW9uLmMKaW5kZXggZGNlY2MyODg3ODkxLi4zNThmZDI0NTVmNmUg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJt aXNzaW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZXhlY2xpc3RzX3N1 Ym1pc3Npb24uYwpAQCAtMTA5LDcgKzEwOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0 Lmg+CiAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgotI2luY2x1ZGUgImk5MTVfcGVyZi5oIgogI2lu Y2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpOTE1X3ZncHUuaCIKICNpbmNsdWRlICJn ZW44X2VuZ2luZV9jcy5oIgpAQCAtMTIwLDYgKzExOSw3IEBACiAjaW5jbHVkZSAiaW50ZWxfZ3Qu aCIKICNpbmNsdWRlICJpbnRlbF9ndF9wbS5oIgogI2luY2x1ZGUgImludGVsX2d0X3JlcXVlc3Rz LmgiCisjaW5jbHVkZSAiaW50ZWxfbHJjLmgiCiAjaW5jbHVkZSAiaW50ZWxfbHJjX3JlZy5oIgog I2luY2x1ZGUgImludGVsX21vY3MuaCIKICNpbmNsdWRlICJpbnRlbF9yZXNldC5oIgpAQCAtMTQ0 LDggKzE0NCw2IEBACiAjZGVmaW5lIEdFTjhfQ1RYX1NUQVRVU19DT01QTEVURURfTUFTSyBcCiAJ IChHRU44X0NUWF9TVEFUVVNfQ09NUExFVEUgfCBHRU44X0NUWF9TVEFUVVNfUFJFRU1QVEVEKQog Ci0jZGVmaW5lIENUWF9ERVNDX0ZPUkNFX1JFU1RPUkUgQklUX1VMTCgyKQotCiAjZGVmaW5lIEdF TjEyX0NUWF9TVEFUVVNfU1dJVENIRURfVE9fTkVXX1FVRVVFCSgweDEpIC8qIGxvd2VyIGNzYiBk d29yZCAqLwogI2RlZmluZSBHRU4xMl9DVFhfU1dJVENIX0RFVEFJTChjc2JfZHcpCSgoY3NiX2R3 KSAmIDB4RikgLyogdXBwZXIgY3NiIGR3b3JkICovCiAjZGVmaW5lIEdFTjEyX0NTQl9TV19DVFhf SURfTUFTSwkJR0VOTUFTSygyNSwgMTUpCkBAIC0yMDUsMTM2ICsyMDMsNiBAQCBzdGF0aWMgc3Ry dWN0IHZpcnR1YWxfZW5naW5lICp0b192aXJ0dWFsX2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUpCiAJcmV0dXJuIGNvbnRhaW5lcl9vZihlbmdpbmUsIHN0cnVjdCB2aXJ0dWFs X2VuZ2luZSwgYmFzZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19leGVjbGlzdHNfY29udGV4dF9hbGxv YyhzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCi0JCQkJICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUpOwotCi1zdGF0aWMgdm9pZCBleGVjbGlzdHNfaW5pdF9yZWdfc3RhdGUodTMy ICpyZWdfc3RhdGUsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCi0J CQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCQkJICAgICBj b25zdCBzdHJ1Y3QgaW50ZWxfcmluZyAqcmluZywKLQkJCQkgICAgIGJvb2wgY2xvc2UpOwotc3Rh dGljIHZvaWQKLV9fZXhlY2xpc3RzX3VwZGF0ZV9yZWdfc3RhdGUoY29uc3Qgc3RydWN0IGludGVs X2NvbnRleHQgKmNlLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUsCi0JCQkgICAgIHUzMiBoZWFkKTsKLQotc3RhdGljIGludCBscmNfcmluZ19taV9tb2RlKGNv bnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlpZiAoSU5URUxfR0VOKGVu Z2luZS0+aTkxNSkgPj0gMTIpCi0JCXJldHVybiAweDYwOwotCWVsc2UgaWYgKElOVEVMX0dFTihl bmdpbmUtPmk5MTUpID49IDkpCi0JCXJldHVybiAweDU0OwotCWVsc2UgaWYgKGVuZ2luZS0+Y2xh c3MgPT0gUkVOREVSX0NMQVNTKQotCQlyZXR1cm4gMHg1ODsKLQllbHNlCi0JCXJldHVybiAtMTsK LX0KLQotc3RhdGljIGludCBscmNfcmluZ19ncHIwKGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZSkKLXsKLQlpZiAoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPj0gMTIpCi0JCXJl dHVybiAweDc0OwotCWVsc2UgaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDkpCi0JCXJl dHVybiAweDY4OwotCWVsc2UgaWYgKGVuZ2luZS0+Y2xhc3MgPT0gUkVOREVSX0NMQVNTKQotCQly ZXR1cm4gMHhkODsKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBscmNfcmlu Z193YV9iYl9wZXJfY3R4KGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlpZiAoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPj0gMTIpCi0JCXJldHVybiAweDEyOwotCWVs c2UgaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDkgfHwgZW5naW5lLT5jbGFzcyA9PSBS RU5ERVJfQ0xBU1MpCi0JCXJldHVybiAweDE4OwotCWVsc2UKLQkJcmV0dXJuIC0xOwotfQotCi1z dGF0aWMgaW50IGxyY19yaW5nX2luZGlyZWN0X3B0cihjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUpCi17Ci0JaW50IHg7Ci0KLQl4ID0gbHJjX3Jpbmdfd2FfYmJfcGVyX2N0eChl bmdpbmUpOwotCWlmICh4IDwgMCkKLQkJcmV0dXJuIHg7Ci0KLQlyZXR1cm4geCArIDI7Ci19Ci0K LXN0YXRpYyBpbnQgbHJjX3JpbmdfaW5kaXJlY3Rfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlpbnQgeDsKLQotCXggPSBscmNfcmluZ19pbmRpcmVjdF9w dHIoZW5naW5lKTsKLQlpZiAoeCA8IDApCi0JCXJldHVybiB4OwotCi0JcmV0dXJuIHggKyAyOwot fQotCi1zdGF0aWMgaW50IGxyY19yaW5nX2NtZF9idWZfY2N0bChjb25zdCBzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCi17Ci0JaWYgKGVuZ2luZS0+Y2xhc3MgIT0gUkVOREVSX0NMQVNT KQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPj0gMTIpCi0J CXJldHVybiAweGI2OwotCWVsc2UgaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDExKQot CQlyZXR1cm4gMHhhYTsKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHUzMgotbHJj X3JpbmdfaW5kaXJlY3Rfb2Zmc2V0X2RlZmF1bHQoY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lKQotewotCXN3aXRjaCAoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkpIHsKLQlkZWZh dWx0OgotCQlNSVNTSU5HX0NBU0UoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkpOwotCQlmYWxsdGhy b3VnaDsKLQljYXNlIDEyOgotCQlyZXR1cm4gR0VOMTJfQ1RYX1JDU19JTkRJUkVDVF9DVFhfT0ZG U0VUX0RFRkFVTFQ7Ci0JY2FzZSAxMToKLQkJcmV0dXJuIEdFTjExX0NUWF9SQ1NfSU5ESVJFQ1Rf Q1RYX09GRlNFVF9ERUZBVUxUOwotCWNhc2UgMTA6Ci0JCXJldHVybiBHRU4xMF9DVFhfUkNTX0lO RElSRUNUX0NUWF9PRkZTRVRfREVGQVVMVDsKLQljYXNlIDk6Ci0JCXJldHVybiBHRU45X0NUWF9S Q1NfSU5ESVJFQ1RfQ1RYX09GRlNFVF9ERUZBVUxUOwotCWNhc2UgODoKLQkJcmV0dXJuIEdFTjhf Q1RYX1JDU19JTkRJUkVDVF9DVFhfT0ZGU0VUX0RFRkFVTFQ7Ci0JfQotfQotCi1zdGF0aWMgdm9p ZAotbHJjX3Jpbmdfc2V0dXBfaW5kaXJlY3RfY3R4KHUzMiAqcmVncywKLQkJCSAgICBjb25zdCBz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCQkgICAgdTMyIGN0eF9iYl9nZ3R0X2Fk ZHIsCi0JCQkgICAgdTMyIHNpemUpCi17Ci0JR0VNX0JVR19PTighc2l6ZSk7Ci0JR0VNX0JVR19P TighSVNfQUxJR05FRChzaXplLCBDQUNIRUxJTkVfQllURVMpKTsKLQlHRU1fQlVHX09OKGxyY19y aW5nX2luZGlyZWN0X3B0cihlbmdpbmUpID09IC0xKTsKLQlyZWdzW2xyY19yaW5nX2luZGlyZWN0 X3B0cihlbmdpbmUpICsgMV0gPQotCQljdHhfYmJfZ2d0dF9hZGRyIHwgKHNpemUgLyBDQUNIRUxJ TkVfQllURVMpOwotCi0JR0VNX0JVR19PTihscmNfcmluZ19pbmRpcmVjdF9vZmZzZXQoZW5naW5l KSA9PSAtMSk7Ci0JcmVnc1tscmNfcmluZ19pbmRpcmVjdF9vZmZzZXQoZW5naW5lKSArIDFdID0K LQkJbHJjX3JpbmdfaW5kaXJlY3Rfb2Zmc2V0X2RlZmF1bHQoZW5naW5lKSA8PCA2OwotfQotCi1z dGF0aWMgdTMyIGludGVsX2NvbnRleHRfZ2V0X3J1bnRpbWUoY29uc3Qgc3RydWN0IGludGVsX2Nv bnRleHQgKmNlKQotewotCS8qCi0JICogV2UgY2FuIHVzZSBlaXRoZXIgcHBIV1NQWzE2XSB3aGlj aCBpcyByZWNvcmRlZCBiZWZvcmUgdGhlIGNvbnRleHQKLQkgKiBzd2l0Y2ggKGFuZCBzbyBleGNs dWRlcyB0aGUgY29zdCBvZiBjb250ZXh0IHN3aXRjaGVzKSBvciB1c2UgdGhlCi0JICogdmFsdWUg ZnJvbSB0aGUgY29udGV4dCBpbWFnZSBpdHNlbGYsIHdoaWNoIGlzIHNhdmVkL3Jlc3RvcmVkIGVh cmxpZXIKLQkgKiBhbmQgc28gaW5jbHVkZXMgdGhlIGNvc3Qgb2YgdGhlIHNhdmUuCi0JICovCi0J cmV0dXJuIFJFQURfT05DRShjZS0+bHJjX3JlZ19zdGF0ZVtDVFhfVElNRVNUQU1QXSk7Ci19Ci0K IHN0YXRpYyB2b2lkIG1hcmtfZWlvKHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxKQogewogCWlmIChp OTE1X3JlcXVlc3RfY29tcGxldGVkKHJxKSkKQEAgLTUxMyw1NjggKzM4MSw2IEBAIGFzc2VydF9w cmlvcml0eV9xdWV1ZShjb25zdCBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpwcmV2LAogCXJldHVybiBy cV9wcmlvKHByZXYpID49IHJxX3ByaW8obmV4dCk7CiB9CiAKLS8qCi0gKiBUaGUgY29udGV4dCBk ZXNjcmlwdG9yIGVuY29kZXMgdmFyaW91cyBhdHRyaWJ1dGVzIG9mIGEgY29udGV4dCwKLSAqIGlu Y2x1ZGluZyBpdHMgR1RUIGFkZHJlc3MgYW5kIHNvbWUgZmxhZ3MuIEJlY2F1c2UgaXQncyBmYWly bHkKLSAqIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUsIHdlJ2xsIGp1c3QgZG8gaXQgb25jZSBhbmQg Y2FjaGUgdGhlIHJlc3VsdCwKLSAqIHdoaWNoIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIGNvbnRl eHQgaXMgdW5waW5uZWQuCi0gKgotICogVGhpcyBpcyB3aGF0IGEgZGVzY3JpcHRvciBsb29rcyBs aWtlLCBmcm9tIExTQiB0byBNU0I6OgotICoKLSAqICAgICAgYml0cyAgMC0xMTogICAgZmxhZ3Ms IEdFTjhfQ1RYXyogKGNhY2hlZCBpbiBjdHgtPmRlc2NfdGVtcGxhdGUpCi0gKiAgICAgIGJpdHMg MTItMzE6ICAgIExSQ0EsIEdUVCBhZGRyZXNzIG9mICh0aGUgSFdTUCBvZikgdGhpcyBjb250ZXh0 Ci0gKiAgICAgIGJpdHMgMzItNTI6ICAgIGN0eCBJRCwgYSBnbG9iYWxseSB1bmlxdWUgdGFnICho aWdoZXN0IGJpdCB1c2VkIGJ5IEd1QykKLSAqICAgICAgYml0cyA1My01NDogICAgbWJ6LCByZXNl cnZlZCBmb3IgdXNlIGJ5IGhhcmR3YXJlCi0gKiAgICAgIGJpdHMgNTUtNjM6ICAgIGdyb3VwIElE LCBjdXJyZW50bHkgdW51c2VkIGFuZCBzZXQgdG8gMAotICoKLSAqIFN0YXJ0aW5nIGZyb20gR2Vu MTEsIHRoZSB1cHBlciBkd29yZCBvZiB0aGUgZGVzY3JpcHRvciBoYXMgYSBuZXcgZm9ybWF0Ogot ICoKLSAqICAgICAgYml0cyAzMi0zNjogICAgcmVzZXJ2ZWQKLSAqICAgICAgYml0cyAzNy00Nzog ICAgU1cgY29udGV4dCBJRAotICogICAgICBiaXRzIDQ4OjUzOiAgICBlbmdpbmUgaW5zdGFuY2UK LSAqICAgICAgYml0IDU0OiAgICAgICAgbWJ6LCByZXNlcnZlZCBmb3IgdXNlIGJ5IGhhcmR3YXJl Ci0gKiAgICAgIGJpdHMgNTUtNjA6ICAgIFNXIGNvdW50ZXIKLSAqICAgICAgYml0cyA2MS02Mzog ICAgZW5naW5lIGNsYXNzCi0gKgotICogZW5naW5lIGluZm8sIFNXIGNvbnRleHQgSUQgYW5kIFNX IGNvdW50ZXIgbmVlZCB0byBmb3JtIGEgdW5pcXVlIG51bWJlcgotICogKENvbnRleHQgSUQpIHBl ciBscmMuCi0gKi8KLXN0YXRpYyB1MzIKLWxyY19kZXNjcmlwdG9yKHN0cnVjdCBpbnRlbF9jb250 ZXh0ICpjZSwgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXUzMiBkZXNjOwot Ci0JZGVzYyA9IElOVEVMX0xFR0FDWV8zMkJfQ09OVEVYVDsKLQlpZiAoaTkxNV92bV9pc180bHZs KGNlLT52bSkpCi0JCWRlc2MgPSBJTlRFTF9MRUdBQ1lfNjRCX0NPTlRFWFQ7Ci0JZGVzYyA8PD0g R0VOOF9DVFhfQUREUkVTU0lOR19NT0RFX1NISUZUOwotCi0JZGVzYyB8PSBHRU44X0NUWF9WQUxJ RCB8IEdFTjhfQ1RYX1BSSVZJTEVHRTsKLQlpZiAoSVNfR0VOKGVuZ2luZS0+aTkxNSwgOCkpCi0J CWRlc2MgfD0gR0VOOF9DVFhfTDNMTENfQ09IRVJFTlQ7Ci0KLQlyZXR1cm4gaTkxNV9nZ3R0X29m ZnNldChjZS0+c3RhdGUpIHwgZGVzYzsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQg ZHdvcmRfaW5fcGFnZSh2b2lkICphZGRyKQotewotCXJldHVybiBvZmZzZXRfaW5fcGFnZShhZGRy KSAvIHNpemVvZih1MzIpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfb2Zmc2V0cyh1MzIgKnJlZ3Ms Ci0JCQljb25zdCB1OCAqZGF0YSwKLQkJCWNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSwKLQkJCWJvb2wgY2xlYXIpCi0jZGVmaW5lIE5PUCh4KSAoQklUKDcpIHwgKHgpKQotI2Rl ZmluZSBMUkkoY291bnQsIGZsYWdzKSAoKGZsYWdzKSA8PCA2IHwgKGNvdW50KSB8IEJVSUxEX0JV R19PTl9aRVJPKGNvdW50ID49IEJJVCg2KSkpCi0jZGVmaW5lIFBPU1RFRCBCSVQoMCkKLSNkZWZp bmUgUkVHKHgpICgoKHgpID4+IDIpIHwgQlVJTERfQlVHX09OX1pFUk8oeCA+PSAweDIwMCkpCi0j ZGVmaW5lIFJFRzE2KHgpIFwKLQkoKCh4KSA+PiA5KSB8IEJJVCg3KSB8IEJVSUxEX0JVR19PTl9a RVJPKHggPj0gMHgxMDAwMCkpLCBcCi0JKCgoeCkgPj4gMikgJiAweDdmKQotI2RlZmluZSBFTkQo dG90YWxfc3RhdGVfc2l6ZSkgMCwgKHRvdGFsX3N0YXRlX3NpemUpCi17Ci0JY29uc3QgdTMyIGJh c2UgPSBlbmdpbmUtPm1taW9fYmFzZTsKLQotCXdoaWxlICgqZGF0YSkgewotCQl1OCBjb3VudCwg ZmxhZ3M7Ci0KLQkJaWYgKCpkYXRhICYgQklUKDcpKSB7IC8qIHNraXAgKi8KLQkJCWNvdW50ID0g KmRhdGErKyAmIH5CSVQoNyk7Ci0JCQlpZiAoY2xlYXIpCi0JCQkJbWVtc2V0MzIocmVncywgTUlf Tk9PUCwgY291bnQpOwotCQkJcmVncyArPSBjb3VudDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJ Y291bnQgPSAqZGF0YSAmIDB4M2Y7Ci0JCWZsYWdzID0gKmRhdGEgPj4gNjsKLQkJZGF0YSsrOwot Ci0JCSpyZWdzID0gTUlfTE9BRF9SRUdJU1RFUl9JTU0oY291bnQpOwotCQlpZiAoZmxhZ3MgJiBQ T1NURUQpCi0JCQkqcmVncyB8PSBNSV9MUklfRk9SQ0VfUE9TVEVEOwotCQlpZiAoSU5URUxfR0VO KGVuZ2luZS0+aTkxNSkgPj0gMTEpCi0JCQkqcmVncyB8PSBNSV9MUklfTFJNX0NTX01NSU87Ci0J CXJlZ3MrKzsKLQotCQlHRU1fQlVHX09OKCFjb3VudCk7Ci0JCWRvIHsKLQkJCXUzMiBvZmZzZXQg PSAwOwotCQkJdTggdjsKLQotCQkJZG8gewotCQkJCXYgPSAqZGF0YSsrOwotCQkJCW9mZnNldCA8 PD0gNzsKLQkJCQlvZmZzZXQgfD0gdiAmIH5CSVQoNyk7Ci0JCQl9IHdoaWxlICh2ICYgQklUKDcp KTsKLQotCQkJcmVnc1swXSA9IGJhc2UgKyAob2Zmc2V0IDw8IDIpOwotCQkJaWYgKGNsZWFyKQot CQkJCXJlZ3NbMV0gPSAwOwotCQkJcmVncyArPSAyOwotCQl9IHdoaWxlICgtLWNvdW50KTsKLQl9 Ci0KLQlpZiAoY2xlYXIpIHsKLQkJdTggY291bnQgPSAqKytkYXRhOwotCi0JCS8qIENsZWFyIHBh c3QgdGhlIHRhaWwgZm9yIEhXIGFjY2VzcyAqLwotCQlHRU1fQlVHX09OKGR3b3JkX2luX3BhZ2Uo cmVncykgPiBjb3VudCk7Ci0JCW1lbXNldDMyKHJlZ3MsIE1JX05PT1AsIGNvdW50IC0gZHdvcmRf aW5fcGFnZShyZWdzKSk7Ci0KLQkJLyogQ2xvc2UgdGhlIGJhdGNoOyB1c2VkIG1haW5seSBieSBs aXZlX2xyY19sYXlvdXQoKSAqLwotCQkqcmVncyA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7Ci0JCWlm IChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSAxMCkKLQkJCSpyZWdzIHw9IEJJVCgwKTsKLQl9 Ci19Ci0KLXN0YXRpYyBjb25zdCB1OCBnZW44X3hjc19vZmZzZXRzW10gPSB7Ci0JTk9QKDEpLAot CUxSSSgxMSwgMCksCi0JUkVHMTYoMHgyNDQpLAotCVJFRygweDAzNCksCi0JUkVHKDB4MDMwKSwK LQlSRUcoMHgwMzgpLAotCVJFRygweDAzYyksCi0JUkVHKDB4MTY4KSwKLQlSRUcoMHgxNDApLAot CVJFRygweDExMCksCi0JUkVHKDB4MTFjKSwKLQlSRUcoMHgxMTQpLAotCVJFRygweDExOCksCi0K LQlOT1AoOSksCi0JTFJJKDksIDApLAotCVJFRzE2KDB4M2E4KSwKLQlSRUcxNigweDI4YyksCi0J UkVHMTYoMHgyODgpLAotCVJFRzE2KDB4Mjg0KSwKLQlSRUcxNigweDI4MCksCi0JUkVHMTYoMHgy N2MpLAotCVJFRzE2KDB4Mjc4KSwKLQlSRUcxNigweDI3NCksCi0JUkVHMTYoMHgyNzApLAotCi0J Tk9QKDEzKSwKLQlMUkkoMiwgMCksCi0JUkVHMTYoMHgyMDApLAotCVJFRygweDAyOCksCi0KLQlF TkQoODApCi19OwotCi1zdGF0aWMgY29uc3QgdTggZ2VuOV94Y3Nfb2Zmc2V0c1tdID0gewotCU5P UCgxKSwKLQlMUkkoMTQsIFBPU1RFRCksCi0JUkVHMTYoMHgyNDQpLAotCVJFRygweDAzNCksCi0J UkVHKDB4MDMwKSwKLQlSRUcoMHgwMzgpLAotCVJFRygweDAzYyksCi0JUkVHKDB4MTY4KSwKLQlS RUcoMHgxNDApLAotCVJFRygweDExMCksCi0JUkVHKDB4MTFjKSwKLQlSRUcoMHgxMTQpLAotCVJF RygweDExOCksCi0JUkVHKDB4MWMwKSwKLQlSRUcoMHgxYzQpLAotCVJFRygweDFjOCksCi0KLQlO T1AoMyksCi0JTFJJKDksIFBPU1RFRCksCi0JUkVHMTYoMHgzYTgpLAotCVJFRzE2KDB4MjhjKSwK LQlSRUcxNigweDI4OCksCi0JUkVHMTYoMHgyODQpLAotCVJFRzE2KDB4MjgwKSwKLQlSRUcxNigw eDI3YyksCi0JUkVHMTYoMHgyNzgpLAotCVJFRzE2KDB4Mjc0KSwKLQlSRUcxNigweDI3MCksCi0K LQlOT1AoMTMpLAotCUxSSSgxLCBQT1NURUQpLAotCVJFRzE2KDB4MjAwKSwKLQotCU5PUCgxMyks Ci0JTFJJKDQ0LCBQT1NURUQpLAotCVJFRygweDAyOCksCi0JUkVHKDB4MDljKSwKLQlSRUcoMHgw YzApLAotCVJFRygweDE3OCksCi0JUkVHKDB4MTdjKSwKLQlSRUcxNigweDM1OCksCi0JUkVHKDB4 MTcwKSwKLQlSRUcoMHgxNTApLAotCVJFRygweDE1NCksCi0JUkVHKDB4MTU4KSwKLQlSRUcxNigw eDQxYyksCi0JUkVHMTYoMHg2MDApLAotCVJFRzE2KDB4NjA0KSwKLQlSRUcxNigweDYwOCksCi0J UkVHMTYoMHg2MGMpLAotCVJFRzE2KDB4NjEwKSwKLQlSRUcxNigweDYxNCksCi0JUkVHMTYoMHg2 MTgpLAotCVJFRzE2KDB4NjFjKSwKLQlSRUcxNigweDYyMCksCi0JUkVHMTYoMHg2MjQpLAotCVJF RzE2KDB4NjI4KSwKLQlSRUcxNigweDYyYyksCi0JUkVHMTYoMHg2MzApLAotCVJFRzE2KDB4NjM0 KSwKLQlSRUcxNigweDYzOCksCi0JUkVHMTYoMHg2M2MpLAotCVJFRzE2KDB4NjQwKSwKLQlSRUcx NigweDY0NCksCi0JUkVHMTYoMHg2NDgpLAotCVJFRzE2KDB4NjRjKSwKLQlSRUcxNigweDY1MCks Ci0JUkVHMTYoMHg2NTQpLAotCVJFRzE2KDB4NjU4KSwKLQlSRUcxNigweDY1YyksCi0JUkVHMTYo MHg2NjApLAotCVJFRzE2KDB4NjY0KSwKLQlSRUcxNigweDY2OCksCi0JUkVHMTYoMHg2NmMpLAot CVJFRzE2KDB4NjcwKSwKLQlSRUcxNigweDY3NCksCi0JUkVHMTYoMHg2NzgpLAotCVJFRzE2KDB4 NjdjKSwKLQlSRUcoMHgwNjgpLAotCi0JRU5EKDE3NikKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBn ZW4xMl94Y3Nfb2Zmc2V0c1tdID0gewotCU5PUCgxKSwKLQlMUkkoMTMsIFBPU1RFRCksCi0JUkVH MTYoMHgyNDQpLAotCVJFRygweDAzNCksCi0JUkVHKDB4MDMwKSwKLQlSRUcoMHgwMzgpLAotCVJF RygweDAzYyksCi0JUkVHKDB4MTY4KSwKLQlSRUcoMHgxNDApLAotCVJFRygweDExMCksCi0JUkVH KDB4MWMwKSwKLQlSRUcoMHgxYzQpLAotCVJFRygweDFjOCksCi0JUkVHKDB4MTgwKSwKLQlSRUcx NigweDJiNCksCi0KLQlOT1AoNSksCi0JTFJJKDksIFBPU1RFRCksCi0JUkVHMTYoMHgzYTgpLAot CVJFRzE2KDB4MjhjKSwKLQlSRUcxNigweDI4OCksCi0JUkVHMTYoMHgyODQpLAotCVJFRzE2KDB4 MjgwKSwKLQlSRUcxNigweDI3YyksCi0JUkVHMTYoMHgyNzgpLAotCVJFRzE2KDB4Mjc0KSwKLQlS RUcxNigweDI3MCksCi0KLQlFTkQoODApCi19OwotCi1zdGF0aWMgY29uc3QgdTggZ2VuOF9yY3Nf b2Zmc2V0c1tdID0gewotCU5PUCgxKSwKLQlMUkkoMTQsIFBPU1RFRCksCi0JUkVHMTYoMHgyNDQp LAotCVJFRygweDAzNCksCi0JUkVHKDB4MDMwKSwKLQlSRUcoMHgwMzgpLAotCVJFRygweDAzYyks Ci0JUkVHKDB4MTY4KSwKLQlSRUcoMHgxNDApLAotCVJFRygweDExMCksCi0JUkVHKDB4MTFjKSwK LQlSRUcoMHgxMTQpLAotCVJFRygweDExOCksCi0JUkVHKDB4MWMwKSwKLQlSRUcoMHgxYzQpLAot CVJFRygweDFjOCksCi0KLQlOT1AoMyksCi0JTFJJKDksIFBPU1RFRCksCi0JUkVHMTYoMHgzYTgp LAotCVJFRzE2KDB4MjhjKSwKLQlSRUcxNigweDI4OCksCi0JUkVHMTYoMHgyODQpLAotCVJFRzE2 KDB4MjgwKSwKLQlSRUcxNigweDI3YyksCi0JUkVHMTYoMHgyNzgpLAotCVJFRzE2KDB4Mjc0KSwK LQlSRUcxNigweDI3MCksCi0KLQlOT1AoMTMpLAotCUxSSSgxLCAwKSwKLQlSRUcoMHgwYzgpLAot Ci0JRU5EKDgwKQotfTsKLQotc3RhdGljIGNvbnN0IHU4IGdlbjlfcmNzX29mZnNldHNbXSA9IHsK LQlOT1AoMSksCi0JTFJJKDE0LCBQT1NURUQpLAotCVJFRzE2KDB4MjQ0KSwKLQlSRUcoMHgzNCks Ci0JUkVHKDB4MzApLAotCVJFRygweDM4KSwKLQlSRUcoMHgzYyksCi0JUkVHKDB4MTY4KSwKLQlS RUcoMHgxNDApLAotCVJFRygweDExMCksCi0JUkVHKDB4MTFjKSwKLQlSRUcoMHgxMTQpLAotCVJF RygweDExOCksCi0JUkVHKDB4MWMwKSwKLQlSRUcoMHgxYzQpLAotCVJFRygweDFjOCksCi0KLQlO T1AoMyksCi0JTFJJKDksIFBPU1RFRCksCi0JUkVHMTYoMHgzYTgpLAotCVJFRzE2KDB4MjhjKSwK LQlSRUcxNigweDI4OCksCi0JUkVHMTYoMHgyODQpLAotCVJFRzE2KDB4MjgwKSwKLQlSRUcxNigw eDI3YyksCi0JUkVHMTYoMHgyNzgpLAotCVJFRzE2KDB4Mjc0KSwKLQlSRUcxNigweDI3MCksCi0K LQlOT1AoMTMpLAotCUxSSSgxLCAwKSwKLQlSRUcoMHhjOCksCi0KLQlOT1AoMTMpLAotCUxSSSg0 NCwgUE9TVEVEKSwKLQlSRUcoMHgyOCksCi0JUkVHKDB4OWMpLAotCVJFRygweGMwKSwKLQlSRUco MHgxNzgpLAotCVJFRygweDE3YyksCi0JUkVHMTYoMHgzNTgpLAotCVJFRygweDE3MCksCi0JUkVH KDB4MTUwKSwKLQlSRUcoMHgxNTQpLAotCVJFRygweDE1OCksCi0JUkVHMTYoMHg0MWMpLAotCVJF RzE2KDB4NjAwKSwKLQlSRUcxNigweDYwNCksCi0JUkVHMTYoMHg2MDgpLAotCVJFRzE2KDB4NjBj KSwKLQlSRUcxNigweDYxMCksCi0JUkVHMTYoMHg2MTQpLAotCVJFRzE2KDB4NjE4KSwKLQlSRUcx NigweDYxYyksCi0JUkVHMTYoMHg2MjApLAotCVJFRzE2KDB4NjI0KSwKLQlSRUcxNigweDYyOCks Ci0JUkVHMTYoMHg2MmMpLAotCVJFRzE2KDB4NjMwKSwKLQlSRUcxNigweDYzNCksCi0JUkVHMTYo MHg2MzgpLAotCVJFRzE2KDB4NjNjKSwKLQlSRUcxNigweDY0MCksCi0JUkVHMTYoMHg2NDQpLAot CVJFRzE2KDB4NjQ4KSwKLQlSRUcxNigweDY0YyksCi0JUkVHMTYoMHg2NTApLAotCVJFRzE2KDB4 NjU0KSwKLQlSRUcxNigweDY1OCksCi0JUkVHMTYoMHg2NWMpLAotCVJFRzE2KDB4NjYwKSwKLQlS RUcxNigweDY2NCksCi0JUkVHMTYoMHg2NjgpLAotCVJFRzE2KDB4NjZjKSwKLQlSRUcxNigweDY3 MCksCi0JUkVHMTYoMHg2NzQpLAotCVJFRzE2KDB4Njc4KSwKLQlSRUcxNigweDY3YyksCi0JUkVH KDB4NjgpLAotCi0JRU5EKDE3NikKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBnZW4xMV9yY3Nfb2Zm c2V0c1tdID0gewotCU5PUCgxKSwKLQlMUkkoMTUsIFBPU1RFRCksCi0JUkVHMTYoMHgyNDQpLAot CVJFRygweDAzNCksCi0JUkVHKDB4MDMwKSwKLQlSRUcoMHgwMzgpLAotCVJFRygweDAzYyksCi0J UkVHKDB4MTY4KSwKLQlSRUcoMHgxNDApLAotCVJFRygweDExMCksCi0JUkVHKDB4MTFjKSwKLQlS RUcoMHgxMTQpLAotCVJFRygweDExOCksCi0JUkVHKDB4MWMwKSwKLQlSRUcoMHgxYzQpLAotCVJF RygweDFjOCksCi0JUkVHKDB4MTgwKSwKLQotCU5PUCgxKSwKLQlMUkkoOSwgUE9TVEVEKSwKLQlS RUcxNigweDNhOCksCi0JUkVHMTYoMHgyOGMpLAotCVJFRzE2KDB4Mjg4KSwKLQlSRUcxNigweDI4 NCksCi0JUkVHMTYoMHgyODApLAotCVJFRzE2KDB4MjdjKSwKLQlSRUcxNigweDI3OCksCi0JUkVH MTYoMHgyNzQpLAotCVJFRzE2KDB4MjcwKSwKLQotCUxSSSgxLCBQT1NURUQpLAotCVJFRygweDFi MCksCi0KLQlOT1AoMTApLAotCUxSSSgxLCAwKSwKLQlSRUcoMHgwYzgpLAotCi0JRU5EKDgwKQot fTsKLQotc3RhdGljIGNvbnN0IHU4IGdlbjEyX3Jjc19vZmZzZXRzW10gPSB7Ci0JTk9QKDEpLAot CUxSSSgxMywgUE9TVEVEKSwKLQlSRUcxNigweDI0NCksCi0JUkVHKDB4MDM0KSwKLQlSRUcoMHgw MzApLAotCVJFRygweDAzOCksCi0JUkVHKDB4MDNjKSwKLQlSRUcoMHgxNjgpLAotCVJFRygweDE0 MCksCi0JUkVHKDB4MTEwKSwKLQlSRUcoMHgxYzApLAotCVJFRygweDFjNCksCi0JUkVHKDB4MWM4 KSwKLQlSRUcoMHgxODApLAotCVJFRzE2KDB4MmI0KSwKLQotCU5PUCg1KSwKLQlMUkkoOSwgUE9T VEVEKSwKLQlSRUcxNigweDNhOCksCi0JUkVHMTYoMHgyOGMpLAotCVJFRzE2KDB4Mjg4KSwKLQlS RUcxNigweDI4NCksCi0JUkVHMTYoMHgyODApLAotCVJFRzE2KDB4MjdjKSwKLQlSRUcxNigweDI3 OCksCi0JUkVHMTYoMHgyNzQpLAotCVJFRzE2KDB4MjcwKSwKLQotCUxSSSgzLCBQT1NURUQpLAot CVJFRygweDFiMCksCi0JUkVHMTYoMHg1YTgpLAotCVJFRzE2KDB4NWFjKSwKLQotCU5PUCg2KSwK LQlMUkkoMSwgMCksCi0JUkVHKDB4MGM4KSwKLQlOT1AoMyArIDkgKyAxKSwKLQotCUxSSSg1MSwg UE9TVEVEKSwKLQlSRUcxNigweDU4OCksCi0JUkVHMTYoMHg1ODgpLAotCVJFRzE2KDB4NTg4KSwK LQlSRUcxNigweDU4OCksCi0JUkVHMTYoMHg1ODgpLAotCVJFRzE2KDB4NTg4KSwKLQlSRUcoMHgw MjgpLAotCVJFRygweDA5YyksCi0JUkVHKDB4MGMwKSwKLQlSRUcoMHgxNzgpLAotCVJFRygweDE3 YyksCi0JUkVHMTYoMHgzNTgpLAotCVJFRygweDE3MCksCi0JUkVHKDB4MTUwKSwKLQlSRUcoMHgx NTQpLAotCVJFRygweDE1OCksCi0JUkVHMTYoMHg0MWMpLAotCVJFRzE2KDB4NjAwKSwKLQlSRUcx NigweDYwNCksCi0JUkVHMTYoMHg2MDgpLAotCVJFRzE2KDB4NjBjKSwKLQlSRUcxNigweDYxMCks Ci0JUkVHMTYoMHg2MTQpLAotCVJFRzE2KDB4NjE4KSwKLQlSRUcxNigweDYxYyksCi0JUkVHMTYo MHg2MjApLAotCVJFRzE2KDB4NjI0KSwKLQlSRUcxNigweDYyOCksCi0JUkVHMTYoMHg2MmMpLAot CVJFRzE2KDB4NjMwKSwKLQlSRUcxNigweDYzNCksCi0JUkVHMTYoMHg2MzgpLAotCVJFRzE2KDB4 NjNjKSwKLQlSRUcxNigweDY0MCksCi0JUkVHMTYoMHg2NDQpLAotCVJFRzE2KDB4NjQ4KSwKLQlS RUcxNigweDY0YyksCi0JUkVHMTYoMHg2NTApLAotCVJFRzE2KDB4NjU0KSwKLQlSRUcxNigweDY1 OCksCi0JUkVHMTYoMHg2NWMpLAotCVJFRzE2KDB4NjYwKSwKLQlSRUcxNigweDY2NCksCi0JUkVH MTYoMHg2NjgpLAotCVJFRzE2KDB4NjZjKSwKLQlSRUcxNigweDY3MCksCi0JUkVHMTYoMHg2NzQp LAotCVJFRzE2KDB4Njc4KSwKLQlSRUcxNigweDY3YyksCi0JUkVHKDB4MDY4KSwKLQlSRUcoMHgw ODQpLAotCU5PUCgxKSwKLQotCUVORCgxOTIpCi19OwotCi0jdW5kZWYgRU5ECi0jdW5kZWYgUkVH MTYKLSN1bmRlZiBSRUcKLSN1bmRlZiBMUkkKLSN1bmRlZiBOT1AKLQotc3RhdGljIGNvbnN0IHU4 ICpyZWdfb2Zmc2V0cyhjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0J LyoKLQkgKiBUaGUgZ2VuMTIrIGxpc3RzIG9ubHkgaGF2ZSB0aGUgcmVnaXN0ZXJzIHdlIHByb2dy YW0gaW4gdGhlIGJhc2ljCi0JICogZGVmYXVsdCBzdGF0ZS4gV2UgcmVseSBvbiB0aGUgY29udGV4 dCBpbWFnZSB1c2luZyByZWxhdGl2ZQotCSAqIGFkZHJlc3NpbmcgdG8gYXV0b21hdGljIGZpeHVw IHRoZSByZWdpc3RlciBzdGF0ZSBiZXR3ZWVuIHRoZQotCSAqIHBoeXNpY2FsIGVuZ2luZXMgZm9y IHZpcnR1YWwgZW5naW5lLgotCSAqLwotCUdFTV9CVUdfT04oSU5URUxfR0VOKGVuZ2luZS0+aTkx NSkgPj0gMTIgJiYKLQkJICAgIWludGVsX2VuZ2luZV9oYXNfcmVsYXRpdmVfbW1pbyhlbmdpbmUp KTsKLQotCWlmIChlbmdpbmUtPmNsYXNzID09IFJFTkRFUl9DTEFTUykgewotCQlpZiAoSU5URUxf R0VOKGVuZ2luZS0+aTkxNSkgPj0gMTIpCi0JCQlyZXR1cm4gZ2VuMTJfcmNzX29mZnNldHM7Ci0J CWVsc2UgaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDExKQotCQkJcmV0dXJuIGdlbjEx X3Jjc19vZmZzZXRzOwotCQllbHNlIGlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSA5KQot CQkJcmV0dXJuIGdlbjlfcmNzX29mZnNldHM7Ci0JCWVsc2UKLQkJCXJldHVybiBnZW44X3Jjc19v ZmZzZXRzOwotCX0gZWxzZSB7Ci0JCWlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSAxMikK LQkJCXJldHVybiBnZW4xMl94Y3Nfb2Zmc2V0czsKLQkJZWxzZSBpZiAoSU5URUxfR0VOKGVuZ2lu ZS0+aTkxNSkgPj0gOSkKLQkJCXJldHVybiBnZW45X3hjc19vZmZzZXRzOwotCQllbHNlCi0JCQly ZXR1cm4gZ2VuOF94Y3Nfb2Zmc2V0czsKLQl9Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaTkxNV9yZXF1 ZXN0ICoKIF9fdW53aW5kX2luY29tcGxldGVfcmVxdWVzdHMoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lKQogewpAQCAtMTE4Nyw1OCArNDkzLDYgQEAgc3RhdGljIHZvaWQgaW50ZWxfZW5n aW5lX2NvbnRleHRfb3V0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKIAl3cml0ZV9z ZXF1bmxvY2tfaXJxcmVzdG9yZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CiB9CiAKLXN0 YXRpYyB2b2lkCi1leGVjbGlzdHNfY2hlY2tfY29udGV4dChjb25zdCBzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqY2UsCi0JCQljb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCQlj b25zdCBjaGFyICp3aGVuKQotewotCWNvbnN0IHN0cnVjdCBpbnRlbF9yaW5nICpyaW5nID0gY2Ut PnJpbmc7Ci0JdTMyICpyZWdzID0gY2UtPmxyY19yZWdfc3RhdGU7Ci0JYm9vbCB2YWxpZCA9IHRy dWU7Ci0JaW50IHg7Ci0KLQlpZiAocmVnc1tDVFhfUklOR19TVEFSVF0gIT0gaTkxNV9nZ3R0X29m ZnNldChyaW5nLT52bWEpKSB7Ci0JCXByX2VycigiJXM6IGNvbnRleHQgc3VibWl0dGVkIHdpdGgg aW5jb3JyZWN0IFJJTkdfU1RBUlQgWyUwOHhdLCBleHBlY3RlZCAlMDh4XG4iLAotCQkgICAgICAg ZW5naW5lLT5uYW1lLAotCQkgICAgICAgcmVnc1tDVFhfUklOR19TVEFSVF0sCi0JCSAgICAgICBp OTE1X2dndHRfb2Zmc2V0KHJpbmctPnZtYSkpOwotCQlyZWdzW0NUWF9SSU5HX1NUQVJUXSA9IGk5 MTVfZ2d0dF9vZmZzZXQocmluZy0+dm1hKTsKLQkJdmFsaWQgPSBmYWxzZTsKLQl9Ci0KLQlpZiAo KHJlZ3NbQ1RYX1JJTkdfQ1RMXSAmIH4oUklOR19XQUlUIHwgUklOR19XQUlUX1NFTUFQSE9SRSkp ICE9Ci0JICAgIChSSU5HX0NUTF9TSVpFKHJpbmctPnNpemUpIHwgUklOR19WQUxJRCkpIHsKLQkJ cHJfZXJyKCIlczogY29udGV4dCBzdWJtaXR0ZWQgd2l0aCBpbmNvcnJlY3QgUklOR19DVEwgWyUw OHhdLCBleHBlY3RlZCAlMDh4XG4iLAotCQkgICAgICAgZW5naW5lLT5uYW1lLAotCQkgICAgICAg cmVnc1tDVFhfUklOR19DVExdLAotCQkgICAgICAgKHUzMikoUklOR19DVExfU0laRShyaW5nLT5z aXplKSB8IFJJTkdfVkFMSUQpKTsKLQkJcmVnc1tDVFhfUklOR19DVExdID0gUklOR19DVExfU0la RShyaW5nLT5zaXplKSB8IFJJTkdfVkFMSUQ7Ci0JCXZhbGlkID0gZmFsc2U7Ci0JfQotCi0JeCA9 IGxyY19yaW5nX21pX21vZGUoZW5naW5lKTsKLQlpZiAoeCAhPSAtMSAmJiByZWdzW3ggKyAxXSAm IChyZWdzW3ggKyAxXSA+PiAxNikgJiBTVE9QX1JJTkcpIHsKLQkJcHJfZXJyKCIlczogY29udGV4 dCBzdWJtaXR0ZWQgd2l0aCBTVE9QX1JJTkcgWyUwOHhdIGluIFJJTkdfTUlfTU9ERVxuIiwKLQkJ ICAgICAgIGVuZ2luZS0+bmFtZSwgcmVnc1t4ICsgMV0pOwotCQlyZWdzW3ggKyAxXSAmPSB+U1RP UF9SSU5HOwotCQlyZWdzW3ggKyAxXSB8PSBTVE9QX1JJTkcgPDwgMTY7Ci0JCXZhbGlkID0gZmFs c2U7Ci0JfQotCi0JV0FSTl9PTkNFKCF2YWxpZCwgIkludmFsaWQgbHJjIHN0YXRlIGZvdW5kICVz IHN1Ym1pc3Npb25cbiIsIHdoZW4pOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlX2RlZmF1bHRf c3RhdGUoc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAotCQkJCSAgc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQotewotCXUzMiAqcmVnczsKLQotCXJlZ3MgPSBtZW1zZXQoY2UtPmxyY19y ZWdfc3RhdGUsIDAsIGVuZ2luZS0+Y29udGV4dF9zaXplIC0gUEFHRV9TSVpFKTsKLQlleGVjbGlz dHNfaW5pdF9yZWdfc3RhdGUocmVncywgY2UsIGVuZ2luZSwgY2UtPnJpbmcsIHRydWUpOwotCi0J Y2UtPnJ1bnRpbWUubGFzdCA9IGludGVsX2NvbnRleHRfZ2V0X3J1bnRpbWUoY2UpOwotfQotCiBz dGF0aWMgdm9pZCByZXNldF9hY3RpdmUoc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEsCiAJCQkgc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogewpAQCAtMTI3MSw0MiArNTI1LDEwIEBAIHN0 YXRpYyB2b2lkIHJlc2V0X2FjdGl2ZShzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSwKIAloZWFkID0g aW50ZWxfcmluZ193cmFwKGNlLT5yaW5nLCBoZWFkKTsKIAogCS8qIFNjcnViIHRoZSBjb250ZXh0 IGltYWdlIHRvIHByZXZlbnQgcmVwbGF5aW5nIHRoZSBwcmV2aW91cyBiYXRjaCAqLwotCXJlc3Rv cmVfZGVmYXVsdF9zdGF0ZShjZSwgZW5naW5lKTsKLQlfX2V4ZWNsaXN0c191cGRhdGVfcmVnX3N0 YXRlKGNlLCBlbmdpbmUsIGhlYWQpOworCWxyY19pbml0X3JlZ3MoY2UsIGVuZ2luZSwgdHJ1ZSk7 CiAKIAkvKiBXZSd2ZSBzd2l0Y2hlZCBhd2F5LCBzbyB0aGlzIHNob3VsZCBiZSBhIG5vLW9wLCBi dXQgaW50ZW50IG1hdHRlcnMgKi8KLQljZS0+bHJjLmRlc2MgfD0gQ1RYX0RFU0NfRk9SQ0VfUkVT VE9SRTsKLX0KLQotc3RhdGljIHZvaWQgc3RfdXBkYXRlX3J1bnRpbWVfdW5kZXJmbG93KHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSwgczMyIGR0KQotewotI2lmIElTX0VOQUJMRUQoQ09ORklHX0RS TV9JOTE1X1NFTEZURVNUKQotCWNlLT5ydW50aW1lLm51bV91bmRlcmZsb3crKzsKLQljZS0+cnVu dGltZS5tYXhfdW5kZXJmbG93ID0gbWF4X3QodTMyLCBjZS0+cnVudGltZS5tYXhfdW5kZXJmbG93 LCAtZHQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGludGVsX2NvbnRleHRfdXBkYXRlX3J1 bnRpbWUoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQotewotCXUzMiBvbGQ7Ci0JczMyIGR0Owot Ci0JaWYgKGludGVsX2NvbnRleHRfaXNfYmFycmllcihjZSkpCi0JCXJldHVybjsKLQotCW9sZCA9 IGNlLT5ydW50aW1lLmxhc3Q7Ci0JY2UtPnJ1bnRpbWUubGFzdCA9IGludGVsX2NvbnRleHRfZ2V0 X3J1bnRpbWUoY2UpOwotCWR0ID0gY2UtPnJ1bnRpbWUubGFzdCAtIG9sZDsKLQotCWlmICh1bmxp a2VseShkdCA8IDApKSB7Ci0JCUNFX1RSQUNFKGNlLCAicnVudGltZSB1bmRlcmZsb3c6IGxhc3Q9 JXUsIG5ldz0ldSwgZGVsdGE9JWRcbiIsCi0JCQkgb2xkLCBjZS0+cnVudGltZS5sYXN0LCBkdCk7 Ci0JCXN0X3VwZGF0ZV9ydW50aW1lX3VuZGVyZmxvdyhjZSwgZHQpOwotCQlyZXR1cm47Ci0JfQot Ci0JZXdtYV9ydW50aW1lX2FkZCgmY2UtPnJ1bnRpbWUuYXZnLCBkdCk7Ci0JY2UtPnJ1bnRpbWUu dG90YWwgKz0gZHQ7CisJY2UtPmxyYy5scmNhID0gbHJjX3VwZGF0ZV9yZWdzKGNlLCBlbmdpbmUs IGhlYWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKgpAQCAt MTMyMSw3ICs1NDMsNyBAQCBfX2V4ZWNsaXN0c19zY2hlZHVsZV9pbihzdHJ1Y3QgaTkxNV9yZXF1 ZXN0ICpycSkKIAkJcmVzZXRfYWN0aXZlKHJxLCBlbmdpbmUpOwogCiAJaWYgKElTX0VOQUJMRUQo Q09ORklHX0RSTV9JOTE1X0RFQlVHX0dFTSkpCi0JCWV4ZWNsaXN0c19jaGVja19jb250ZXh0KGNl LCBlbmdpbmUsICJiZWZvcmUiKTsKKwkJbHJjX2NoZWNrX3JlZ3MoY2UsIGVuZ2luZSwgImJlZm9y ZSIpOwogCiAJaWYgKGNlLT50YWcpIHsKIAkJLyogVXNlIGEgZml4ZWQgdGFnIGZvciBPQSBhbmQg ZnJpZW5kcyAqLwpAQCAtMTM5Myw3ICs2MTUsNyBAQCBfX2V4ZWNsaXN0c19zY2hlZHVsZV9vdXQo c3RydWN0IGk5MTVfcmVxdWVzdCAqcnEsCiAJICovCiAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdf RFJNX0k5MTVfREVCVUdfR0VNKSkKLQkJZXhlY2xpc3RzX2NoZWNrX2NvbnRleHQoY2UsIGVuZ2lu ZSwgImFmdGVyIik7CisJCWxyY19jaGVja19yZWdzKGNlLCBlbmdpbmUsICJhZnRlciIpOwogCiAJ LyoKIAkgKiBJZiB3ZSBoYXZlIGp1c3QgY29tcGxldGVkIHRoaXMgY29udGV4dCwgdGhlIGVuZ2lu ZSBtYXkgbm93IGJlCkBAIC0xNDExLDcgKzYzMyw3IEBAIF9fZXhlY2xpc3RzX3NjaGVkdWxlX291 dChzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSwKIAkJc2V0X2JpdChjY2lkIC0gMSwgJmVuZ2luZS0+ Y29udGV4dF90YWcpOwogCX0KIAotCWludGVsX2NvbnRleHRfdXBkYXRlX3J1bnRpbWUoY2UpOwor CWxyY191cGRhdGVfcnVudGltZShjZSk7CiAJaW50ZWxfZW5naW5lX2NvbnRleHRfb3V0KGVuZ2lu ZSk7CiAJZXhlY2xpc3RzX2NvbnRleHRfc3RhdHVzX2NoYW5nZShycSwgSU5URUxfQ09OVEVYVF9T Q0hFRFVMRV9PVVQpOwogCWlmIChlbmdpbmUtPmZ3X2RvbWFpbiAmJiAhYXRvbWljX2RlY19yZXR1 cm4oJmVuZ2luZS0+ZndfYWN0aXZlKSkKQEAgLTE3NTIsMTIgKzk3NCw2IEBAIHN0YXRpYyBib29s IGNhbl9tZXJnZV9ycShjb25zdCBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpwcmV2LAogCXJldHVybiB0 cnVlOwogfQogCi1zdGF0aWMgdm9pZCB2aXJ0dWFsX3VwZGF0ZV9yZWdpc3Rlcl9vZmZzZXRzKHUz MiAqcmVncywKLQkJCQkJICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlz ZXRfb2Zmc2V0cyhyZWdzLCByZWdfb2Zmc2V0cyhlbmdpbmUpLCBlbmdpbmUsIGZhbHNlKTsKLX0K LQogc3RhdGljIGJvb2wgdmlydHVhbF9tYXRjaGVzKGNvbnN0IHN0cnVjdCB2aXJ0dWFsX2VuZ2lu ZSAqdmUsCiAJCQkgICAgY29uc3Qgc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEsCiAJCQkgICAgY29u c3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQpAQCAtMTc5Myw4ICsxMDA5LDcgQEAg c3RhdGljIHZvaWQgdmlydHVhbF94ZmVyX2NvbnRleHQoc3RydWN0IHZpcnR1YWxfZW5naW5lICp2 ZSwKIAogCUdFTV9CVUdfT04oUkVBRF9PTkNFKHZlLT5jb250ZXh0LmluZmxpZ2h0KSk7CiAJaWYg KCFpbnRlbF9lbmdpbmVfaGFzX3JlbGF0aXZlX21taW8oZW5naW5lKSkKLQkJdmlydHVhbF91cGRh dGVfcmVnaXN0ZXJfb2Zmc2V0cyh2ZS0+Y29udGV4dC5scmNfcmVnX3N0YXRlLAotCQkJCQkJZW5n aW5lKTsKKwkJbHJjX3VwZGF0ZV9vZmZzZXRzKCZ2ZS0+Y29udGV4dCwgZW5naW5lKTsKIAogCS8q CiAJICogTW92ZSB0aGUgYm91bmQgZW5naW5lIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QgZm9yCkBA IC0zMjg3LDI0OCArMjUwMiw1NSBAQCBzdGF0aWMgdm9pZCBleGVjbGlzdHNfc3VibWl0X3JlcXVl c3Qoc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVxdWVzdCkKIAlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZlbmdpbmUtPmFjdGl2ZS5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhlY2xp c3RzX2NvbnRleHRfZmluaShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCi17Ci0JaW50ZWxfcmlu Z19wdXQoY2UtPnJpbmcpOwotCWk5MTVfdm1hX3B1dChjZS0+c3RhdGUpOwotfQotCi1zdGF0aWMg dm9pZCBleGVjbGlzdHNfY29udGV4dF9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQorc3RhdGlj IGludCBleGVjbGlzdHNfY29udGV4dF9wcmVfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwK KwkJCQkgICAgIHN0cnVjdCBpOTE1X2dlbV93d19jdHggKnd3LAorCQkJCSAgICAgdm9pZCAqKnZh ZGRyKQogewotCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSA9IGNvbnRhaW5lcl9vZihrcmVmLCB0 eXBlb2YoKmNlKSwgcmVmKTsKLQotCUdFTV9CVUdfT04oIWk5MTVfYWN0aXZlX2lzX2lkbGUoJmNl LT5hY3RpdmUpKTsKLQlHRU1fQlVHX09OKGludGVsX2NvbnRleHRfaXNfcGlubmVkKGNlKSk7Ci0K LQlpZiAoY2UtPnN0YXRlKQotCQlfX2V4ZWNsaXN0c19jb250ZXh0X2ZpbmkoY2UpOwotCi0JaW50 ZWxfY29udGV4dF9maW5pKGNlKTsKLQlpbnRlbF9jb250ZXh0X2ZyZWUoY2UpOwotfQotCi1zdGF0 aWMgdm9pZAotc2V0X3JlZHpvbmUodm9pZCAqdmFkZHIsIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSkKLXsKLQlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X0RFQlVH X0dFTSkpCi0JCXJldHVybjsKLQotCXZhZGRyICs9IGVuZ2luZS0+Y29udGV4dF9zaXplOwotCi0J bWVtc2V0KHZhZGRyLCBDT05URVhUX1JFRFpPTkUsIEk5MTVfR1RUX1BBR0VfU0laRSk7Ci19Ci0K LXN0YXRpYyB2b2lkCi1jaGVja19yZWR6b25lKGNvbnN0IHZvaWQgKnZhZGRyLCBjb25zdCBzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0JaWYgKCFJU19FTkFCTEVEKENPTkZJR19E Uk1fSTkxNV9ERUJVR19HRU0pKQotCQlyZXR1cm47Ci0KLQl2YWRkciArPSBlbmdpbmUtPmNvbnRl eHRfc2l6ZTsKLQotCWlmIChtZW1jaHJfaW52KHZhZGRyLCBDT05URVhUX1JFRFpPTkUsIEk5MTVf R1RUX1BBR0VfU0laRSkpCi0JCWRybV9lcnJfb25jZSgmZW5naW5lLT5pOTE1LT5kcm0sCi0JCQkg ICAgICIlcyBjb250ZXh0IHJlZHpvbmUgb3ZlcndyaXR0ZW4hXG4iLAotCQkJICAgICBlbmdpbmUt Pm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBleGVjbGlzdHNfY29udGV4dF91bnBpbihzdHJ1Y3Qg aW50ZWxfY29udGV4dCAqY2UpCi17Ci0JY2hlY2tfcmVkem9uZSgodm9pZCAqKWNlLT5scmNfcmVn X3N0YXRlIC0gTFJDX1NUQVRFX09GRlNFVCwKLQkJICAgICAgY2UtPmVuZ2luZSk7Ci19Ci0KLXN0 YXRpYyB2b2lkIGV4ZWNsaXN0c19jb250ZXh0X3Bvc3RfdW5waW4oc3RydWN0IGludGVsX2NvbnRl eHQgKmNlKQotewotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAoY2UtPnN0YXRlLT5vYmopOwot fQotCi1zdGF0aWMgdTMyICoKLWdlbjEyX2VtaXRfdGltZXN0YW1wX3dhKGNvbnN0IHN0cnVjdCBp bnRlbF9jb250ZXh0ICpjZSwgdTMyICpjcykKLXsKLQkqY3MrKyA9IE1JX0xPQURfUkVHSVNURVJf TUVNX0dFTjggfAotCQlNSV9TUk1fTFJNX0dMT0JBTF9HVFQgfAotCQlNSV9MUklfTFJNX0NTX01N SU87Ci0JKmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldChHRU44X1JJTkdfQ1NfR1BSKDAsIDAp KTsKLQkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZzZXQoY2UtPnN0YXRlKSArIExSQ19TVEFURV9PRkZT RVQgKwotCQlDVFhfVElNRVNUQU1QICogc2l6ZW9mKHUzMik7Ci0JKmNzKysgPSAwOwotCi0JKmNz KysgPSBNSV9MT0FEX1JFR0lTVEVSX1JFRyB8Ci0JCU1JX0xSUl9TT1VSQ0VfQ1NfTU1JTyB8Ci0J CU1JX0xSSV9MUk1fQ1NfTU1JTzsKLQkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KEdFTjhf UklOR19DU19HUFIoMCwgMCkpOwotCSpjcysrID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19D VFhfVElNRVNUQU1QKDApKTsKLQotCSpjcysrID0gTUlfTE9BRF9SRUdJU1RFUl9SRUcgfAotCQlN SV9MUlJfU09VUkNFX0NTX01NSU8gfAotCQlNSV9MUklfTFJNX0NTX01NSU87Ci0JKmNzKysgPSBp OTE1X21taW9fcmVnX29mZnNldChHRU44X1JJTkdfQ1NfR1BSKDAsIDApKTsKLQkqY3MrKyA9IGk5 MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ1RYX1RJTUVTVEFNUCgwKSk7Ci0KLQlyZXR1cm4gY3M7 CisJcmV0dXJuIGxyY19wcmVfcGluKGNlLCBjZS0+ZW5naW5lLCB3dywgdmFkZHIpOwogfQogCi1z dGF0aWMgdTMyICoKLWdlbjEyX2VtaXRfcmVzdG9yZV9zY3JhdGNoKGNvbnN0IHN0cnVjdCBpbnRl bF9jb250ZXh0ICpjZSwgdTMyICpjcykKLXsKLQlHRU1fQlVHX09OKGxyY19yaW5nX2dwcjAoY2Ut PmVuZ2luZSkgPT0gLTEpOwotCi0JKmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX01FTV9HRU44IHwK LQkJTUlfU1JNX0xSTV9HTE9CQUxfR1RUIHwKLQkJTUlfTFJJX0xSTV9DU19NTUlPOwotCSpjcysr ID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQoR0VOOF9SSU5HX0NTX0dQUigwLCAwKSk7Ci0JKmNzKysg PSBpOTE1X2dndHRfb2Zmc2V0KGNlLT5zdGF0ZSkgKyBMUkNfU1RBVEVfT0ZGU0VUICsKLQkJKGxy Y19yaW5nX2dwcjAoY2UtPmVuZ2luZSkgKyAxKSAqIHNpemVvZih1MzIpOwotCSpjcysrID0gMDsK LQotCXJldHVybiBjczsKLX0KLQotc3RhdGljIHUzMiAqCi1nZW4xMl9lbWl0X2NtZF9idWZfd2Eo Y29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQotewotCUdFTV9CVUdfT04o bHJjX3JpbmdfY21kX2J1Zl9jY3RsKGNlLT5lbmdpbmUpID09IC0xKTsKLQotCSpjcysrID0gTUlf TE9BRF9SRUdJU1RFUl9NRU1fR0VOOCB8Ci0JCU1JX1NSTV9MUk1fR0xPQkFMX0dUVCB8Ci0JCU1J X0xSSV9MUk1fQ1NfTU1JTzsKLQkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KEdFTjhfUklO R19DU19HUFIoMCwgMCkpOwotCSpjcysrID0gaTkxNV9nZ3R0X29mZnNldChjZS0+c3RhdGUpICsg TFJDX1NUQVRFX09GRlNFVCArCi0JCShscmNfcmluZ19jbWRfYnVmX2NjdGwoY2UtPmVuZ2luZSkg KyAxKSAqIHNpemVvZih1MzIpOwotCSpjcysrID0gMDsKLQotCSpjcysrID0gTUlfTE9BRF9SRUdJ U1RFUl9SRUcgfAotCQlNSV9MUlJfU09VUkNFX0NTX01NSU8gfAotCQlNSV9MUklfTFJNX0NTX01N SU87Ci0JKmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldChHRU44X1JJTkdfQ1NfR1BSKDAsIDAp KTsKLQkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ01EX0JVRl9DQ1RMKDApKTsK LQotCXJldHVybiBjczsKLX0KLQotc3RhdGljIHUzMiAqCi1nZW4xMl9lbWl0X2luZGlyZWN0X2N0 eF9yY3MoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQotewotCWNzID0g Z2VuMTJfZW1pdF90aW1lc3RhbXBfd2EoY2UsIGNzKTsKLQljcyA9IGdlbjEyX2VtaXRfY21kX2J1 Zl93YShjZSwgY3MpOwotCWNzID0gZ2VuMTJfZW1pdF9yZXN0b3JlX3NjcmF0Y2goY2UsIGNzKTsK LQotCXJldHVybiBjczsKLX0KLQotc3RhdGljIHUzMiAqCi1nZW4xMl9lbWl0X2luZGlyZWN0X2N0 eF94Y3MoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQotewotCWNzID0g Z2VuMTJfZW1pdF90aW1lc3RhbXBfd2EoY2UsIGNzKTsKLQljcyA9IGdlbjEyX2VtaXRfcmVzdG9y ZV9zY3JhdGNoKGNlLCBjcyk7Ci0KLQlyZXR1cm4gY3M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMy IGNvbnRleHRfd2FfYmJfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKLXsK LQlyZXR1cm4gUEFHRV9TSVpFICogY2UtPndhX2JiX3BhZ2U7Ci19Ci0KLXN0YXRpYyB1MzIgKmNv bnRleHRfaW5kaXJlY3RfYmIoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQotewotCXZv aWQgKnB0cjsKLQotCUdFTV9CVUdfT04oIWNlLT53YV9iYl9wYWdlKTsKLQotCXB0ciA9IGNlLT5s cmNfcmVnX3N0YXRlOwotCXB0ciAtPSBMUkNfU1RBVEVfT0ZGU0VUOyAvKiBiYWNrIHRvIHN0YXJ0 IG9mIGNvbnRleHQgaW1hZ2UgKi8KLQlwdHIgKz0gY29udGV4dF93YV9iYl9vZmZzZXQoY2UpOwot Ci0JcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIHZvaWQKLXNldHVwX2luZGlyZWN0X2N0eF9iYihj b25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSwKLQkJICAgICAgdTMyICooKmVtaXQpKGNvbnN0IHN0cnVjdCBp bnRlbF9jb250ZXh0ICosIHUzMiAqKSkKK3N0YXRpYyBpbnQgZXhlY2xpc3RzX2NvbnRleHRfcGlu KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwgdm9pZCAqdmFkZHIpCiB7Ci0JdTMyICogY29uc3Qg c3RhcnQgPSBjb250ZXh0X2luZGlyZWN0X2JiKGNlKTsKLQl1MzIgKmNzOwotCi0JY3MgPSBlbWl0 KGNlLCBzdGFydCk7Ci0JR0VNX0JVR19PTihjcyAtIHN0YXJ0ID4gSTkxNV9HVFRfUEFHRV9TSVpF IC8gc2l6ZW9mKCpjcykpOwotCXdoaWxlICgodW5zaWduZWQgbG9uZyljcyAlIENBQ0hFTElORV9C WVRFUykKLQkJKmNzKysgPSBNSV9OT09QOwotCi0JbHJjX3Jpbmdfc2V0dXBfaW5kaXJlY3RfY3R4 KGNlLT5scmNfcmVnX3N0YXRlLCBlbmdpbmUsCi0JCQkJICAgIGk5MTVfZ2d0dF9vZmZzZXQoY2Ut PnN0YXRlKSArCi0JCQkJICAgIGNvbnRleHRfd2FfYmJfb2Zmc2V0KGNlKSwKLQkJCQkgICAgKGNz IC0gc3RhcnQpICogc2l6ZW9mKCpjcykpOworCXJldHVybiBscmNfcGluKGNlLCBjZS0+ZW5naW5l LCB2YWRkcik7CiB9CiAKLXN0YXRpYyB2b2lkCi1fX2V4ZWNsaXN0c191cGRhdGVfcmVnX3N0YXRl KGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lLAotCQkJICAgICB1MzIgaGVhZCkKK3N0YXRpYyBpbnQgX19s cmNfc2V0dXAoc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAorCQkgICAgICAgc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lKQogewotCXN0cnVjdCBpbnRlbF9yaW5nICpyaW5nID0gY2UtPnJp bmc7Ci0JdTMyICpyZWdzID0gY2UtPmxyY19yZWdfc3RhdGU7Ci0KLQlHRU1fQlVHX09OKCFpbnRl bF9yaW5nX29mZnNldF92YWxpZChyaW5nLCBoZWFkKSk7Ci0JR0VNX0JVR19PTighaW50ZWxfcmlu Z19vZmZzZXRfdmFsaWQocmluZywgcmluZy0+dGFpbCkpOwotCi0JcmVnc1tDVFhfUklOR19TVEFS VF0gPSBpOTE1X2dndHRfb2Zmc2V0KHJpbmctPnZtYSk7Ci0JcmVnc1tDVFhfUklOR19IRUFEXSA9 IGhlYWQ7Ci0JcmVnc1tDVFhfUklOR19UQUlMXSA9IHJpbmctPnRhaWw7Ci0JcmVnc1tDVFhfUklO R19DVExdID0gUklOR19DVExfU0laRShyaW5nLT5zaXplKSB8IFJJTkdfVkFMSUQ7Ci0KLQkvKiBS UENTICovCi0JaWYgKGVuZ2luZS0+Y2xhc3MgPT0gUkVOREVSX0NMQVNTKSB7Ci0JCXJlZ3NbQ1RY X1JfUFdSX0NMS19TVEFURV0gPQotCQkJaW50ZWxfc3NldV9tYWtlX3JwY3MoZW5naW5lLT5ndCwg JmNlLT5zc2V1KTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gY2UtPnN0YXRl LT5vYmo7CisJdm9pZCAqdmFkZHI7CiAKLQkJaTkxNV9vYV9pbml0X3JlZ19zdGF0ZShjZSwgZW5n aW5lKTsKKwl2YWRkciA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKG9iaiwgSTkxNV9NQVBfV0Ip OworCWlmIChJU19FUlIodmFkZHIpKSB7CisJCWRybV9kYmcoJmVuZ2luZS0+aTkxNS0+ZHJtLCAi Q291bGQgbm90IG1hcCBvYmplY3QgcGFnZXMhXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodmFkZHIp OwogCX0KIAotCWlmIChjZS0+d2FfYmJfcGFnZSkgewotCQl1MzIgKigqZm4pKGNvbnN0IHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSwgdTMyICpjcyk7Ci0KLQkJZm4gPSBnZW4xMl9lbWl0X2luZGly ZWN0X2N0eF94Y3M7Ci0JCWlmIChjZS0+ZW5naW5lLT5jbGFzcyA9PSBSRU5ERVJfQ0xBU1MpCi0J CQlmbiA9IGdlbjEyX2VtaXRfaW5kaXJlY3RfY3R4X3JjczsKKwlscmNfaW5pdF9zdGF0ZShjZSwg ZW5naW5lLCB2YWRkcik7CiAKLQkJLyogTXV0dWFsbHkgZXhjbHVzaXZlIHdydCB0byBnbG9iYWwg aW5kaXJlY3QgYmIgKi8KLQkJR0VNX0JVR19PTihlbmdpbmUtPndhX2N0eC5pbmRpcmVjdF9jdHgu c2l6ZSk7Ci0JCXNldHVwX2luZGlyZWN0X2N0eF9iYihjZSwgZW5naW5lLCBmbik7Ci0JfQorCV9f aTkxNV9nZW1fb2JqZWN0X2ZsdXNoX21hcChvYmosIDAsIGVuZ2luZS0+Y29udGV4dF9zaXplKTsK KwlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKG9iaik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRp YyBpbnQKLWV4ZWNsaXN0c19jb250ZXh0X3ByZV9waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNl LAotCQkJICBzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4ICp3dywgdm9pZCAqKnZhZGRyKQorc3RhdGlj IGludCBfX2V4ZWNsaXN0c19jb250ZXh0X2FsbG9jKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwK KwkJCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKIHsKLQlHRU1fQlVHX09O KCFjZS0+c3RhdGUpOwotCUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX3Bpbm5lZChjZS0+c3RhdGUp KTsKLQotCSp2YWRkciA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKGNlLT5zdGF0ZS0+b2JqLAot CQkJCQlpOTE1X2NvaGVyZW50X21hcF90eXBlKGNlLT5lbmdpbmUtPmk5MTUpIHwKLQkJCQkJSTkx NV9NQVBfT1ZFUlJJREUpOworCWludCBlcnI7CiAKLQlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKCp2 YWRkcik7Ci19CisJZXJyID0gbHJjX2FsbG9jKGNlLCBlbmdpbmUpOworCWlmIChlcnIpCisJCXJl dHVybiBlcnI7CiAKLXN0YXRpYyBpbnQKLV9fZXhlY2xpc3RzX2NvbnRleHRfcGluKHN0cnVjdCBp bnRlbF9jb250ZXh0ICpjZSwKLQkJCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKLQkJ CXZvaWQgKnZhZGRyKQotewotCWNlLT5scmMubHJjYSA9IGxyY19kZXNjcmlwdG9yKGNlLCBlbmdp bmUpIHwgQ1RYX0RFU0NfRk9SQ0VfUkVTVE9SRTsKLQljZS0+bHJjX3JlZ19zdGF0ZSA9IHZhZGRy ICsgTFJDX1NUQVRFX09GRlNFVDsKLQlfX2V4ZWNsaXN0c191cGRhdGVfcmVnX3N0YXRlKGNlLCBl bmdpbmUsIGNlLT5yaW5nLT50YWlsKTsKKwllcnIgPSBfX2xyY19zZXR1cChjZSwgZW5naW5lKTsK KwlpZiAoZXJyKQorCQlnb3RvIGVycl9scmM7CiAKIAlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGlu dCBleGVjbGlzdHNfY29udGV4dF9waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB2b2lkICp2 YWRkcikKLXsKLQlyZXR1cm4gX19leGVjbGlzdHNfY29udGV4dF9waW4oY2UsIGNlLT5lbmdpbmUs IHZhZGRyKTsKK2Vycl9scmM6CisJbHJjX2ZpbmkoY2UpOworCXJldHVybiBlcnI7CiB9CiAKIHN0 YXRpYyBpbnQgZXhlY2xpc3RzX2NvbnRleHRfYWxsb2Moc3RydWN0IGludGVsX2NvbnRleHQgKmNl KQpAQCAtMzUzNiwzNCArMjU1OCwxOSBAQCBzdGF0aWMgaW50IGV4ZWNsaXN0c19jb250ZXh0X2Fs bG9jKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKIAlyZXR1cm4gX19leGVjbGlzdHNfY29udGV4 dF9hbGxvYyhjZSwgY2UtPmVuZ2luZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV4ZWNsaXN0c19jb250 ZXh0X3Jlc2V0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKLXsKLQlDRV9UUkFDRShjZSwgInJl c2V0XG4iKTsKLQlHRU1fQlVHX09OKCFpbnRlbF9jb250ZXh0X2lzX3Bpbm5lZChjZSkpOwotCi0J aW50ZWxfcmluZ19yZXNldChjZS0+cmluZywgY2UtPnJpbmctPmVtaXQpOwotCi0JLyogU2NydWIg YXdheSB0aGUgZ2FyYmFnZSAqLwotCWV4ZWNsaXN0c19pbml0X3JlZ19zdGF0ZShjZS0+bHJjX3Jl Z19zdGF0ZSwKLQkJCQkgY2UsIGNlLT5lbmdpbmUsIGNlLT5yaW5nLCB0cnVlKTsKLQlfX2V4ZWNs aXN0c191cGRhdGVfcmVnX3N0YXRlKGNlLCBjZS0+ZW5naW5lLCBjZS0+cmluZy0+dGFpbCk7Ci0K LQljZS0+bHJjLmRlc2MgfD0gQ1RYX0RFU0NfRk9SQ0VfUkVTVE9SRTsKLX0KLQogc3RhdGljIGNv bnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0X29wcyBleGVjbGlzdHNfY29udGV4dF9vcHMgPSB7CiAJ LmFsbG9jID0gZXhlY2xpc3RzX2NvbnRleHRfYWxsb2MsCiAKIAkucHJlX3BpbiA9IGV4ZWNsaXN0 c19jb250ZXh0X3ByZV9waW4sCiAJLnBpbiA9IGV4ZWNsaXN0c19jb250ZXh0X3BpbiwKLQkudW5w aW4gPSBleGVjbGlzdHNfY29udGV4dF91bnBpbiwKLQkucG9zdF91bnBpbiA9IGV4ZWNsaXN0c19j b250ZXh0X3Bvc3RfdW5waW4sCisJLnVucGluID0gbHJjX3VucGluLAorCS5wb3N0X3VucGluID0g bHJjX3Bvc3RfdW5waW4sCiAKIAkuZW50ZXIgPSBpbnRlbF9jb250ZXh0X2VudGVyX2VuZ2luZSwK IAkuZXhpdCA9IGludGVsX2NvbnRleHRfZXhpdF9lbmdpbmUsCiAKLQkucmVzZXQgPSBleGVjbGlz dHNfY29udGV4dF9yZXNldCwKLQkuZGVzdHJveSA9IGV4ZWNsaXN0c19jb250ZXh0X2Rlc3Ryb3ks CisJLnJlc2V0ID0gbHJjX3Jlc2V0LAorCS5kZXN0cm95ID0gbHJjX2Rlc3Ryb3ksCiB9OwogCiBz dGF0aWMgaW50IGVtaXRfcGRwcyhzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKQEAgLTM2NTAsMzMw ICsyNjU3LDYgQEAgc3RhdGljIGludCBleGVjbGlzdHNfcmVxdWVzdF9hbGxvYyhzdHJ1Y3QgaTkx NV9yZXF1ZXN0ICpyZXF1ZXN0KQogCXJldHVybiAwOwogfQogCi0vKgotICogSW4gdGhpcyBXQSB3 ZSBuZWVkIHRvIHNldCBHRU44X0wzU1FDUkVHNFsyMToyMV0gYW5kIHJlc2V0IGl0IGFmdGVyCi0g KiBQSVBFX0NPTlRST0wgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBmbHVz aCB0byBoYXBwZW4gY29ycmVjdGx5Ci0gKiBidXQgdGhlcmUgaXMgYSBzbGlnaHQgY29tcGxpY2F0 aW9uIGFzIHRoaXMgaXMgYXBwbGllZCBpbiBXQSBiYXRjaCB3aGVyZSB0aGUKLSAqIHZhbHVlcyBh cmUgb25seSBpbml0aWFsaXplZCBvbmNlIHNvIHdlIGNhbm5vdCB0YWtlIHJlZ2lzdGVyIHZhbHVl IGF0IHRoZQotICogYmVnaW5uaW5nIGFuZCByZXVzZSBpdCBmdXJ0aGVyOyBoZW5jZSB3ZSBzYXZl IGl0cyB2YWx1ZSB0byBtZW1vcnksIHVwbG9hZCBhCi0gKiBjb25zdGFudCB2YWx1ZSB3aXRoIGJp dDIxIHNldCBhbmQgdGhlbiB3ZSByZXN0b3JlIGl0IGJhY2sgd2l0aCB0aGUgc2F2ZWQgdmFsdWUu Ci0gKiBUbyBzaW1wbGlmeSB0aGUgV0EsIGEgY29uc3RhbnQgdmFsdWUgaXMgZm9ybWVkIGJ5IHVz aW5nIHRoZSBkZWZhdWx0IHZhbHVlCi0gKiBvZiB0aGlzIHJlZ2lzdGVyLiBUaGlzIHNob3VsZG4n dCBiZSBhIHByb2JsZW0gYmVjYXVzZSB3ZSBhcmUgb25seSBtb2RpZnlpbmcKLSAqIGl0IGZvciBh IHNob3J0IHBlcmlvZCBhbmQgdGhpcyBiYXRjaCBpbiBub24tcHJlbXB0aWJsZS4gV2UgY2FuIG9m Y291cnNlCi0gKiB1c2UgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIHRoZSBhY3R1 YWwgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyCi0gKiBhdCB0aGF0IHRpbWUgYW5kIHNldCBvdXIgYml0 IG9mIGludGVyZXN0IGJ1dCBpdCBtYWtlcyB0aGUgV0EgY29tcGxpY2F0ZWQuCi0gKgotICogVGhp cyBXQSBpcyBhbHNvIHJlcXVpcmVkIGZvciBHZW45IHNvIGV4dHJhY3RpbmcgYXMgYSBmdW5jdGlv biBhdm9pZHMKLSAqIGNvZGUgZHVwbGljYXRpb24uCi0gKi8KLXN0YXRpYyB1MzIgKgotZ2VuOF9l bWl0X2ZsdXNoX2NvaGVyZW50bDNfd2Eoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCB1 MzIgKmJhdGNoKQotewotCS8qIE5CIG5vIG9uZSBlbHNlIGlzIGFsbG93ZWQgdG8gc2NyaWJibGUg b3ZlciBzY3JhdGNoICsgMjU2ISAqLwotCSpiYXRjaCsrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVN X0dFTjggfCBNSV9TUk1fTFJNX0dMT0JBTF9HVFQ7Ci0JKmJhdGNoKysgPSBpOTE1X21taW9fcmVn X29mZnNldChHRU44X0wzU1FDUkVHNCk7Ci0JKmJhdGNoKysgPSBpbnRlbF9ndF9zY3JhdGNoX29m ZnNldChlbmdpbmUtPmd0LAotCQkJCQkgICBJTlRFTF9HVF9TQ1JBVENIX0ZJRUxEX0NPSEVSRU5U TDNfV0EpOwotCSpiYXRjaCsrID0gMDsKLQotCSpiYXRjaCsrID0gTUlfTE9BRF9SRUdJU1RFUl9J TU0oMSk7Ci0JKmJhdGNoKysgPSBpOTE1X21taW9fcmVnX29mZnNldChHRU44X0wzU1FDUkVHNCk7 Ci0JKmJhdGNoKysgPSAweDQwNDAwMDAwIHwgR0VOOF9MUVNDX0ZMVVNIX0NPSEVSRU5UX0xJTkVT OwotCi0JYmF0Y2ggPSBnZW44X2VtaXRfcGlwZV9jb250cm9sKGJhdGNoLAotCQkJCSAgICAgICBQ SVBFX0NPTlRST0xfQ1NfU1RBTEwgfAotCQkJCSAgICAgICBQSVBFX0NPTlRST0xfRENfRkxVU0hf RU5BQkxFLAotCQkJCSAgICAgICAwKTsKLQotCSpiYXRjaCsrID0gTUlfTE9BRF9SRUdJU1RFUl9N RU1fR0VOOCB8IE1JX1NSTV9MUk1fR0xPQkFMX0dUVDsKLQkqYmF0Y2grKyA9IGk5MTVfbW1pb19y ZWdfb2Zmc2V0KEdFTjhfTDNTUUNSRUc0KTsKLQkqYmF0Y2grKyA9IGludGVsX2d0X3NjcmF0Y2hf b2Zmc2V0KGVuZ2luZS0+Z3QsCi0JCQkJCSAgIElOVEVMX0dUX1NDUkFUQ0hfRklFTERfQ09IRVJF TlRMM19XQSk7Ci0JKmJhdGNoKysgPSAwOwotCi0JcmV0dXJuIGJhdGNoOwotfQotCi0vKgotICog VHlwaWNhbGx5IHdlIG9ubHkgaGF2ZSBvbmUgaW5kaXJlY3RfY3R4IGFuZCBwZXJfY3R4IGJhdGNo IGJ1ZmZlciB3aGljaCBhcmUKLSAqIGluaXRpYWxpemVkIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNo YXJlZCBhY3Jvc3MgYWxsIGNvbnRleHRzIGJ1dCB0aGlzIGZpZWxkCi0gKiBoZWxwcyB1cyB0byBo YXZlIG11bHRpcGxlIGJhdGNoZXMgYXQgZGlmZmVyZW50IG9mZnNldHMgYW5kIHNlbGVjdCB0aGVt IGJhc2VkCi0gKiBvbiBhIGNyaXRlcmlhLiBBdCB0aGUgbW9tZW50IHRoaXMgYmF0Y2ggYWx3YXlz IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UKLSAqIGFuZCBhdCB0aGlzIHBvaW50 IHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgd2FfY3R4IGJhdGNoIGJ1ZmZlcnMuCi0gKgotICogVGhl IG51bWJlciBvZiBXQSBhcHBsaWVkIGFyZSBub3Qga25vd24gYXQgdGhlIGJlZ2lubmluZzsgd2Ug dXNlIHRoaXMgZmllbGQKLSAqIHRvIHJldHVybiB0aGUgbm8gb2YgRFdPUkRTIHdyaXR0ZW4uCi0g KgotICogSXQgaXMgdG8gYmUgbm90ZWQgdGhhdCB0aGlzIGJhdGNoIGRvZXMgbm90IGNvbnRhaW4g TUlfQkFUQ0hfQlVGRkVSX0VORAotICogc28gaXQgYWRkcyBOT09QcyBhcyBwYWRkaW5nIHRvIG1h a2UgaXQgY2FjaGVsaW5lIGFsaWduZWQuCi0gKiBNSV9CQVRDSF9CVUZGRVJfRU5EIHdpbGwgYmUg YWRkZWQgdG8gcGVyY3R4IGJhdGNoIGFuZCBib3RoIG9mIHRoZW0gdG9nZXRoZXIKLSAqIG1ha2Vz IGEgY29tcGxldGUgYmF0Y2ggYnVmZmVyLgotICovCi1zdGF0aWMgdTMyICpnZW44X2luaXRfaW5k aXJlY3RjdHhfYmIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCB1MzIgKmJhdGNoKQot ewotCS8qIFdhRGlzYWJsZUN0eFJlc3RvcmVBcmJpdHJhdGlvbjpiZHcsY2h2ICovCi0JKmJhdGNo KysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0RJU0FCTEU7Ci0KLQkvKiBXYUZsdXNoQ29oZXJl bnRMM0NhY2hlTGluZXNBdENvbnRleHRTd2l0Y2g6YmR3ICovCi0JaWYgKElTX0JST0FEV0VMTChl bmdpbmUtPmk5MTUpKQotCQliYXRjaCA9IGdlbjhfZW1pdF9mbHVzaF9jb2hlcmVudGwzX3dhKGVu Z2luZSwgYmF0Y2gpOwotCi0JLyogV2FDbGVhclNsbVNwYWNlQXRDb250ZXh0U3dpdGNoOmJkdyxj aHYgKi8KLQkvKiBBY3R1YWwgc2NyYXRjaCBsb2NhdGlvbiBpcyBhdCAxMjggYnl0ZXMgb2Zmc2V0 ICovCi0JYmF0Y2ggPSBnZW44X2VtaXRfcGlwZV9jb250cm9sKGJhdGNoLAotCQkJCSAgICAgICBQ SVBFX0NPTlRST0xfRkxVU0hfTDMgfAotCQkJCSAgICAgICBQSVBFX0NPTlRST0xfU1RPUkVfREFU QV9JTkRFWCB8Ci0JCQkJICAgICAgIFBJUEVfQ09OVFJPTF9DU19TVEFMTCB8Ci0JCQkJICAgICAg IFBJUEVfQ09OVFJPTF9RV19XUklURSwKLQkJCQkgICAgICAgTFJDX1BQSFdTUF9TQ1JBVENIX0FE RFIpOwotCi0JKmJhdGNoKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0VOQUJMRTsKLQotCS8q IFBhZCB0byBlbmQgb2YgY2FjaGVsaW5lICovCi0Jd2hpbGUgKCh1bnNpZ25lZCBsb25nKWJhdGNo ICUgQ0FDSEVMSU5FX0JZVEVTKQotCQkqYmF0Y2grKyA9IE1JX05PT1A7Ci0KLQkvKgotCSAqIE1J X0JBVENIX0JVRkZFUl9FTkQgaXMgbm90IHJlcXVpcmVkIGluIEluZGlyZWN0IGN0eCBCQiBiZWNh dXNlCi0JICogZXhlY3V0aW9uIGRlcGVuZHMgb24gdGhlIGxlbmd0aCBzcGVjaWZpZWQgaW4gdGVy bXMgb2YgY2FjaGUgbGluZXMKLQkgKiBpbiB0aGUgcmVnaXN0ZXIgQ1RYX1JDU19JTkRJUkVDVF9D VFgKLQkgKi8KLQotCXJldHVybiBiYXRjaDsKLX0KLQotc3RydWN0IGxyaSB7Ci0JaTkxNV9yZWdf dCByZWc7Ci0JdTMyIHZhbHVlOwotfTsKLQotc3RhdGljIHUzMiAqZW1pdF9scmkodTMyICpiYXRj aCwgY29uc3Qgc3RydWN0IGxyaSAqbHJpLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JR0VNX0JV R19PTighY291bnQgfHwgY291bnQgPiA2Myk7Ci0KLQkqYmF0Y2grKyA9IE1JX0xPQURfUkVHSVNU RVJfSU1NKGNvdW50KTsKLQlkbyB7Ci0JCSpiYXRjaCsrID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQo bHJpLT5yZWcpOwotCQkqYmF0Y2grKyA9IGxyaS0+dmFsdWU7Ci0JfSB3aGlsZSAobHJpKyssIC0t Y291bnQpOwotCSpiYXRjaCsrID0gTUlfTk9PUDsKLQotCXJldHVybiBiYXRjaDsKLX0KLQotc3Rh dGljIHUzMiAqZ2VuOV9pbml0X2luZGlyZWN0Y3R4X2JiKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSwgdTMyICpiYXRjaCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGxyaSBscmlbXSA9 IHsKLQkJLyogV2FEaXNhYmxlR2F0aGVyQXRTZXRTaGFkZXJDb21tb25TbGljZTpza2wsYnh0LGti bCxnbGsgKi8KLQkJewotCQkJQ09NTU9OX1NMSUNFX0NISUNLRU4yLAotCQkJX19NQVNLRURfRklF TEQoR0VOOV9ESVNBQkxFX0dBVEhFUl9BVF9TRVRfU0hBREVSX0NPTU1PTl9TTElDRSwKLQkJCQkg ICAgICAgMCksCi0JCX0sCi0KLQkJLyogQlNwZWM6IDExMzkxICovCi0JCXsKLQkJCUZGX1NMSUNF X0NISUNLRU4sCi0JCQlfX01BU0tFRF9GSUVMRChGRl9TTElDRV9DSElDS0VOX0NMX1BST1ZPS0lO R19WRVJURVhfRklYLAotCQkJCSAgICAgICBGRl9TTElDRV9DSElDS0VOX0NMX1BST1ZPS0lOR19W RVJURVhfRklYKSwKLQkJfSwKLQotCQkvKiBCU3BlYzogMTEyOTkgKi8KLQkJewotCQkJXzNEX0NI SUNLRU4zLAotCQkJX19NQVNLRURfRklFTEQoXzNEX0NISUNLRU5fU0ZfUFJPVk9LSU5HX1ZFUlRF WF9GSVgsCi0JCQkJICAgICAgIF8zRF9DSElDS0VOX1NGX1BST1ZPS0lOR19WRVJURVhfRklYKSwK LQkJfQotCX07Ci0KLQkqYmF0Y2grKyA9IE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJfRElTQUJMRTsK LQotCS8qIFdhRmx1c2hDb2hlcmVudEwzQ2FjaGVMaW5lc0F0Q29udGV4dFN3aXRjaDpza2wsYnh0 LGdsayAqLwotCWJhdGNoID0gZ2VuOF9lbWl0X2ZsdXNoX2NvaGVyZW50bDNfd2EoZW5naW5lLCBi YXRjaCk7Ci0KLQkvKiBXYUNsZWFyU2xtU3BhY2VBdENvbnRleHRTd2l0Y2g6c2tsLGJ4dCxrYmws Z2xrLGNmbCAqLwotCWJhdGNoID0gZ2VuOF9lbWl0X3BpcGVfY29udHJvbChiYXRjaCwKLQkJCQkg ICAgICAgUElQRV9DT05UUk9MX0ZMVVNIX0wzIHwKLQkJCQkgICAgICAgUElQRV9DT05UUk9MX1NU T1JFX0RBVEFfSU5ERVggfAotCQkJCSAgICAgICBQSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAotCQkJ CSAgICAgICBQSVBFX0NPTlRST0xfUVdfV1JJVEUsCi0JCQkJICAgICAgIExSQ19QUEhXU1BfU0NS QVRDSF9BRERSKTsKLQotCWJhdGNoID0gZW1pdF9scmkoYmF0Y2gsIGxyaSwgQVJSQVlfU0laRShs cmkpKTsKLQotCS8qIFdhTWVkaWFQb29sU3RhdGVDbWRJbldBQkI6Ynh0LGdsayAqLwotCWlmIChI QVNfUE9PTEVEX0VVKGVuZ2luZS0+aTkxNSkpIHsKLQkJLyoKLQkJICogRVUgcG9vbCBjb25maWd1 cmF0aW9uIGlzIHNldHVwIGFsb25nIHdpdGggZ29sZGVuIGNvbnRleHQKLQkJICogZHVyaW5nIGNv bnRleHQgaW5pdGlhbGl6YXRpb24uIFRoaXMgdmFsdWUgZGVwZW5kcyBvbgotCQkgKiBkZXZpY2Ug dHlwZSAoMng2IG9yIDN4NikgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYmFzZWQKLQkJICogb24g d2hpY2ggc3Vic2xpY2UgaXMgZGlzYWJsZWQgZXNwZWNpYWxseSBmb3IgMng2Ci0JCSAqIGRldmlj ZXMsIGhvd2V2ZXIgaXQgaXMgc2FmZSB0byBsb2FkIGRlZmF1bHQKLQkJICogY29uZmlndXJhdGlv biBvZiAzeDYgZGV2aWNlIGluc3RlYWQgb2YgbWFza2luZyBvZmYKLQkJICogY29ycmVzcG9uZGlu ZyBiaXRzIGJlY2F1c2UgSFcgaWdub3JlcyBiaXRzIG9mIGEgZGlzYWJsZWQKLQkJICogc3Vic2xp Y2UgYW5kIGRyb3BzIGRvd24gdG8gYXBwcm9wcmlhdGUgY29uZmlnLiBQbGVhc2UKLQkJICogc2Vl IHJlbmRlcl9zdGF0ZV9zZXR1cCgpIGluIGk5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5jIGZvcgotCQkg KiBwb3NzaWJsZSBjb25maWd1cmF0aW9ucywgdG8gYXZvaWQgZHVwbGljYXRpb24gdGhleSBhcmUK LQkJICogbm90IHNob3duIGhlcmUgYWdhaW4uCi0JCSAqLwotCQkqYmF0Y2grKyA9IEdFTjlfTUVE SUFfUE9PTF9TVEFURTsKLQkJKmJhdGNoKysgPSBHRU45X01FRElBX1BPT0xfRU5BQkxFOwotCQkq YmF0Y2grKyA9IDB4MDA3NzcwMDA7Ci0JCSpiYXRjaCsrID0gMDsKLQkJKmJhdGNoKysgPSAwOwot CQkqYmF0Y2grKyA9IDA7Ci0JfQotCi0JKmJhdGNoKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJC X0VOQUJMRTsKLQotCS8qIFBhZCB0byBlbmQgb2YgY2FjaGVsaW5lICovCi0Jd2hpbGUgKCh1bnNp Z25lZCBsb25nKWJhdGNoICUgQ0FDSEVMSU5FX0JZVEVTKQotCQkqYmF0Y2grKyA9IE1JX05PT1A7 Ci0KLQlyZXR1cm4gYmF0Y2g7Ci19Ci0KLXN0YXRpYyB1MzIgKgotZ2VuMTBfaW5pdF9pbmRpcmVj dGN0eF9iYihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsIHUzMiAqYmF0Y2gpCi17Ci0J aW50IGk7Ci0KLQkvKgotCSAqIFdhUGlwZUNvbnRyb2xCZWZvcmUzRFN0YXRlU2FtcGxlUGF0dGVy bjogY25sCi0JICoKLQkgKiBFbnN1cmUgdGhlIGVuZ2luZSBpcyBpZGxlIHByaW9yIHRvIHByb2dy YW1taW5nIGEKLQkgKiAzRFNUQVRFX1NBTVBMRV9QQVRURVJOIGR1cmluZyBhIGNvbnRleHQgcmVz dG9yZS4KLQkgKi8KLQliYXRjaCA9IGdlbjhfZW1pdF9waXBlX2NvbnRyb2woYmF0Y2gsCi0JCQkJ ICAgICAgIFBJUEVfQ09OVFJPTF9DU19TVEFMTCwKLQkJCQkgICAgICAgMCk7Ci0JLyoKLQkgKiBX YVBpcGVDb250cm9sQmVmb3JlM0RTdGF0ZVNhbXBsZVBhdHRlcm4gc2F5cyB3ZSBuZWVkIDQgZHdv cmRzIGZvcgotCSAqIHRoZSBQSVBFX0NPTlRST0wgZm9sbG93ZWQgYnkgMTIgZHdvcmRzIG9mIDB4 MCwgc28gMTYgZHdvcmRzIGluCi0JICogdG90YWwuIEhvd2V2ZXIsIGEgUElQRV9DT05UUk9MIGlz IDYgZHdvcmRzIGxvbmcsIG5vdCA0LCB3aGljaCBpcwotCSAqIGNvbmZ1c2luZy4gU2luY2UgZ2Vu OF9lbWl0X3BpcGVfY29udHJvbCgpIGFscmVhZHkgYWR2YW5jZXMgdGhlCi0JICogYmF0Y2ggYnkg NiBkd29yZHMsIHdlIGFkdmFuY2UgdGhlIG90aGVyIDEwIGhlcmUsIGNvbXBsZXRpbmcgYQotCSAq IGNhY2hlbGluZS4gSXQncyBub3QgY2xlYXIgaWYgdGhlIHdvcmthcm91bmQgcmVxdWlyZXMgdGhp cyBwYWRkaW5nCi0JICogYmVmb3JlIG90aGVyIGNvbW1hbmRzLCBvciBpZiBpdCdzIGp1c3QgdGhl IHJlZ3VsYXIgcGFkZGluZyB3ZSB3b3VsZAotCSAqIGFscmVhZHkgaGF2ZSBmb3IgdGhlIHdvcmth cm91bmQgYmIsIHNvIGxlYXZlIGl0IGhlcmUgZm9yIG5vdy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBp IDwgMTA7IGkrKykKLQkJKmJhdGNoKysgPSBNSV9OT09QOwotCi0JLyogUGFkIHRvIGVuZCBvZiBj YWNoZWxpbmUgKi8KLQl3aGlsZSAoKHVuc2lnbmVkIGxvbmcpYmF0Y2ggJSBDQUNIRUxJTkVfQllU RVMpCi0JCSpiYXRjaCsrID0gTUlfTk9PUDsKLQotCXJldHVybiBiYXRjaDsKLX0KLQotI2RlZmlu ZSBDVFhfV0FfQkJfT0JKX1NJWkUgKFBBR0VfU0laRSkKLQotc3RhdGljIGludCBscmNfc2V0dXBf d2FfY3R4KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwotCWludCBlcnI7Ci0K LQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3NobWVtKGVuZ2luZS0+aTkxNSwgQ1RYX1dB X0JCX09CSl9TSVpFKTsKLQlpZiAoSVNfRVJSKG9iaikpCi0JCXJldHVybiBQVFJfRVJSKG9iaik7 Ci0KLQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZlbmdpbmUtPmd0LT5nZ3R0LT52bSwg TlVMTCk7Ci0JaWYgKElTX0VSUih2bWEpKSB7Ci0JCWVyciA9IFBUUl9FUlIodm1hKTsKLQkJZ290 byBlcnI7Ci0JfQotCi0JZXJyID0gaTkxNV9nZ3R0X3Bpbih2bWEsIE5VTEwsIDAsIFBJTl9ISUdI KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycjsKLQotCWVuZ2luZS0+d2FfY3R4LnZtYSA9IHZtYTsK LQlyZXR1cm4gMDsKLQotZXJyOgotCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQlyZXR1cm4g ZXJyOwotfQotCi1zdGF0aWMgdm9pZCBscmNfZGVzdHJveV93YV9jdHgoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqZW5naW5lKQotewotCWk5MTVfdm1hX3VucGluX2FuZF9yZWxlYXNlKCZlbmdpbmUt PndhX2N0eC52bWEsIDApOwotfQotCi10eXBlZGVmIHUzMiAqKCp3YV9iYl9mdW5jX3QpKHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwgdTMyICpiYXRjaCk7Ci0KLXN0YXRpYyBpbnQgaW50 ZWxfaW5pdF93b3JrYXJvdW5kX2JiKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlzdHJ1Y3QgaTkxNV9jdHhfd29ya2Fyb3VuZHMgKndhX2N0eCA9ICZlbmdpbmUtPndhX2N0eDsK LQlzdHJ1Y3QgaTkxNV93YV9jdHhfYmIgKndhX2JiWzJdID0geyAmd2FfY3R4LT5pbmRpcmVjdF9j dHgsCi0JCQkJCSAgICAmd2FfY3R4LT5wZXJfY3R4IH07Ci0Jd2FfYmJfZnVuY190IHdhX2JiX2Zu WzJdOwotCXZvaWQgKmJhdGNoLCAqYmF0Y2hfcHRyOwotCXVuc2lnbmVkIGludCBpOwotCWludCBy ZXQ7Ci0KLQlpZiAoZW5naW5lLT5jbGFzcyAhPSBSRU5ERVJfQ0xBU1MpCi0JCXJldHVybiAwOwot Ci0Jc3dpdGNoIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSkgewotCWNhc2UgMTI6Ci0JY2FzZSAx MToKLQkJcmV0dXJuIDA7Ci0JY2FzZSAxMDoKLQkJd2FfYmJfZm5bMF0gPSBnZW4xMF9pbml0X2lu ZGlyZWN0Y3R4X2JiOwotCQl3YV9iYl9mblsxXSA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgOToK LQkJd2FfYmJfZm5bMF0gPSBnZW45X2luaXRfaW5kaXJlY3RjdHhfYmI7Ci0JCXdhX2JiX2ZuWzFd ID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQl3YV9iYl9mblswXSA9IGdlbjhfaW5pdF9p bmRpcmVjdGN0eF9iYjsKLQkJd2FfYmJfZm5bMV0gPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0 OgotCQlNSVNTSU5HX0NBU0UoSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkpOwotCQlyZXR1cm4gMDsK LQl9Ci0KLQlyZXQgPSBscmNfc2V0dXBfd2FfY3R4KGVuZ2luZSk7Ci0JaWYgKHJldCkgewotCQlk cm1fZGJnKCZlbmdpbmUtPmk5MTUtPmRybSwKLQkJCSJGYWlsZWQgdG8gc2V0dXAgY29udGV4dCBX QSBwYWdlOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQliYXRjaCA9IGk5MTVf Z2VtX29iamVjdF9waW5fbWFwKHdhX2N0eC0+dm1hLT5vYmosIEk5MTVfTUFQX1dCKTsKLQotCS8q Ci0JICogRW1pdCB0aGUgdHdvIHdvcmthcm91bmQgYmF0Y2ggYnVmZmVycywgcmVjb3JkaW5nIHRo ZSBvZmZzZXQgZnJvbSB0aGUKLQkgKiBzdGFydCBvZiB0aGUgd29ya2Fyb3VuZCBiYXRjaCBidWZm ZXIgb2JqZWN0IGZvciBlYWNoIGFuZCB0aGVpcgotCSAqIHJlc3BlY3RpdmUgc2l6ZXMuCi0JICov Ci0JYmF0Y2hfcHRyID0gYmF0Y2g7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2FfYmJf Zm4pOyBpKyspIHsKLQkJd2FfYmJbaV0tPm9mZnNldCA9IGJhdGNoX3B0ciAtIGJhdGNoOwotCQlp ZiAoR0VNX0RFQlVHX1dBUk5fT04oIUlTX0FMSUdORUQod2FfYmJbaV0tPm9mZnNldCwKLQkJCQkJ CSAgQ0FDSEVMSU5FX0JZVEVTKSkpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJ fQotCQlpZiAod2FfYmJfZm5baV0pCi0JCQliYXRjaF9wdHIgPSB3YV9iYl9mbltpXShlbmdpbmUs IGJhdGNoX3B0cik7Ci0JCXdhX2JiW2ldLT5zaXplID0gYmF0Y2hfcHRyIC0gKGJhdGNoICsgd2Ff YmJbaV0tPm9mZnNldCk7Ci0JfQotCUdFTV9CVUdfT04oYmF0Y2hfcHRyIC0gYmF0Y2ggPiBDVFhf V0FfQkJfT0JKX1NJWkUpOwotCi0JX19pOTE1X2dlbV9vYmplY3RfZmx1c2hfbWFwKHdhX2N0eC0+ dm1hLT5vYmosIDAsIGJhdGNoX3B0ciAtIGJhdGNoKTsKLQlfX2k5MTVfZ2VtX29iamVjdF9yZWxl YXNlX21hcCh3YV9jdHgtPnZtYS0+b2JqKTsKLQlpZiAocmV0KQotCQlscmNfZGVzdHJveV93YV9j dHgoZW5naW5lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHJlc2V0X2NzYl9w b2ludGVycyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCiB7CiAJc3RydWN0IGludGVs X2VuZ2luZV9leGVjbGlzdHMgKiBjb25zdCBleGVjbGlzdHMgPSAmZW5naW5lLT5leGVjbGlzdHM7 CkBAIC00MTg1LDI1ICsyODY4LDYgQEAgc3RhdGljIHZvaWQgZXhlY2xpc3RzX3Jlc2V0X3ByZXBh cmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogCWVuZ2luZS0+ZXhlY2xpc3RzLnJl c2V0X2NjaWQgPSBhY3RpdmVfY2NpZChlbmdpbmUpOwogfQogCi1zdGF0aWMgdm9pZCBfX3Jlc2V0 X3N0b3BfcmluZyh1MzIgKnJlZ3MsIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSkKLXsKLQlpbnQgeDsKLQotCXggPSBscmNfcmluZ19taV9tb2RlKGVuZ2luZSk7Ci0JaWYgKHgg IT0gLTEpIHsKLQkJcmVnc1t4ICsgMV0gJj0gflNUT1BfUklORzsKLQkJcmVnc1t4ICsgMV0gfD0g U1RPUF9SSU5HIDw8IDE2OwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19leGVjbGlzdHNfcmVzZXRf cmVnX3N0YXRlKGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKLQkJCQkJY29uc3Qgc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXUzMiAqcmVncyA9IGNlLT5scmNfcmVn X3N0YXRlOwotCi0JX19yZXNldF9zdG9wX3JpbmcocmVncywgZW5naW5lKTsKLX0KLQogc3RhdGlj IHZvaWQgX19leGVjbGlzdHNfcmVzZXQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCBi b29sIHN0YWxsZWQpCiB7CiAJc3RydWN0IGludGVsX2VuZ2luZV9leGVjbGlzdHMgKiBjb25zdCBl eGVjbGlzdHMgPSAmZW5naW5lLT5leGVjbGlzdHM7CkBAIC00Mjg3LDkgKzI5NTEsOCBAQCBzdGF0 aWMgdm9pZCBfX2V4ZWNsaXN0c19yZXNldChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUs IGJvb2wgc3RhbGxlZCkKIG91dF9yZXBsYXk6CiAJRU5HSU5FX1RSQUNFKGVuZ2luZSwgInJlcGxh eSB7aGVhZDolMDR4LCB0YWlsOiUwNHh9XG4iLAogCQkgICAgIGhlYWQsIGNlLT5yaW5nLT50YWls KTsKLQlfX2V4ZWNsaXN0c19yZXNldF9yZWdfc3RhdGUoY2UsIGVuZ2luZSk7Ci0JX19leGVjbGlz dHNfdXBkYXRlX3JlZ19zdGF0ZShjZSwgZW5naW5lLCBoZWFkKTsKLQljZS0+bHJjLmRlc2MgfD0g Q1RYX0RFU0NfRk9SQ0VfUkVTVE9SRTsgLyogcGFyYW5vaWQ6IEdQVSB3YXMgcmVzZXQhICovCisJ bHJjX3Jlc2V0X3JlZ3MoY2UsIGVuZ2luZSk7CisJY2UtPmxyYy5scmNhID0gbHJjX3VwZGF0ZV9y ZWdzKGNlLCBlbmdpbmUsIGhlYWQpOwogCiB1bndpbmQ6CiAJLyogUHVzaCBiYWNrIGFueSBpbmNv bXBsZXRlIHJlcXVlc3RzIGZvciByZXBsYXkgYWZ0ZXIgdGhlIHJlc2V0LiAqLwpAQCAtNDQ4Nyw3 ICszMTUwLDcgQEAgc3RhdGljIHZvaWQgZXhlY2xpc3RzX3JlbGVhc2Uoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqZW5naW5lKQogCWV4ZWNsaXN0c19zaHV0ZG93bihlbmdpbmUpOwogCiAJaW50ZWxf ZW5naW5lX2NsZWFudXBfY29tbW9uKGVuZ2luZSk7Ci0JbHJjX2Rlc3Ryb3lfd2FfY3R4KGVuZ2lu ZSk7CisJbHJjX2Zpbmlfd2FfY3R4KGVuZ2luZSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00NTgx LDcgKzMyNDQsNyBAQCBpbnQgaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb25fc2V0dXAoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogCWlmIChlbmdpbmUtPmNsYXNzID09IFJFTkRFUl9D TEFTUykKIAkJcmNzX3N1Ym1pc3Npb25fb3ZlcnJpZGUoZW5naW5lKTsKIAotCWlmIChpbnRlbF9p bml0X3dvcmthcm91bmRfYmIoZW5naW5lKSkKKwlpZiAobHJjX2luaXRfd2FfY3R4KGVuZ2luZSkp CiAJCS8qCiAJCSAqIFdlIGNvbnRpbnVlIGV2ZW4gaWYgd2UgZmFpbCB0byBpbml0aWFsaXplIFdB IGJhdGNoCiAJCSAqIGJlY2F1c2Ugd2Ugb25seSBleHBlY3QgcmFyZSBnbGl0Y2hlcyBidXQgbm90 aGluZwpAQCAtNDYyMiwyMTggKzMyODUsNiBAQCBpbnQgaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Np b25fc2V0dXAoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogCXJldHVybiAwOwogfQog Ci1zdGF0aWMgdm9pZCBpbml0X2NvbW1vbl9yZWdfc3RhdGUodTMyICogY29uc3QgcmVncywKLQkJ CQkgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKLQkJCQkgIGNvbnN0IHN0 cnVjdCBpbnRlbF9yaW5nICpyaW5nLAotCQkJCSAgYm9vbCBpbmhpYml0KQotewotCXUzMiBjdGw7 Ci0KLQljdGwgPSBfTUFTS0VEX0JJVF9FTkFCTEUoQ1RYX0NUUkxfSU5ISUJJVF9TWU5fQ1RYX1NX SVRDSCk7Ci0JY3RsIHw9IF9NQVNLRURfQklUX0RJU0FCTEUoQ1RYX0NUUkxfRU5HSU5FX0NUWF9S RVNUT1JFX0lOSElCSVQpOwotCWlmIChpbmhpYml0KQotCQljdGwgfD0gQ1RYX0NUUkxfRU5HSU5F X0NUWF9SRVNUT1JFX0lOSElCSVQ7Ci0JaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpIDwgMTEp Ci0JCWN0bCB8PSBfTUFTS0VEX0JJVF9ESVNBQkxFKENUWF9DVFJMX0VOR0lORV9DVFhfU0FWRV9J TkhJQklUIHwKLQkJCQkJICAgQ1RYX0NUUkxfUlNfQ1RYX0VOQUJMRSk7Ci0JcmVnc1tDVFhfQ09O VEVYVF9DT05UUk9MXSA9IGN0bDsKLQotCXJlZ3NbQ1RYX1JJTkdfQ1RMXSA9IFJJTkdfQ1RMX1NJ WkUocmluZy0+c2l6ZSkgfCBSSU5HX1ZBTElEOwotCXJlZ3NbQ1RYX1RJTUVTVEFNUF0gPSAwOwot fQotCi1zdGF0aWMgdm9pZCBpbml0X3dhX2JiX3JlZ19zdGF0ZSh1MzIgKiBjb25zdCByZWdzLAot CQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0JY29uc3Qgc3Ry dWN0IGk5MTVfY3R4X3dvcmthcm91bmRzICogY29uc3Qgd2FfY3R4ID0gJmVuZ2luZS0+d2FfY3R4 OwotCi0JaWYgKHdhX2N0eC0+cGVyX2N0eC5zaXplKSB7Ci0JCWNvbnN0IHUzMiBnZ3R0X29mZnNl dCA9IGk5MTVfZ2d0dF9vZmZzZXQod2FfY3R4LT52bWEpOwotCi0JCUdFTV9CVUdfT04obHJjX3Jp bmdfd2FfYmJfcGVyX2N0eChlbmdpbmUpID09IC0xKTsKLQkJcmVnc1tscmNfcmluZ193YV9iYl9w ZXJfY3R4KGVuZ2luZSkgKyAxXSA9Ci0JCQkoZ2d0dF9vZmZzZXQgKyB3YV9jdHgtPnBlcl9jdHgu b2Zmc2V0KSB8IDB4MDE7Ci0JfQotCi0JaWYgKHdhX2N0eC0+aW5kaXJlY3RfY3R4LnNpemUpIHsK LQkJbHJjX3Jpbmdfc2V0dXBfaW5kaXJlY3RfY3R4KHJlZ3MsIGVuZ2luZSwKLQkJCQkJICAgIGk5 MTVfZ2d0dF9vZmZzZXQod2FfY3R4LT52bWEpICsKLQkJCQkJICAgIHdhX2N0eC0+aW5kaXJlY3Rf Y3R4Lm9mZnNldCwKLQkJCQkJICAgIHdhX2N0eC0+aW5kaXJlY3RfY3R4LnNpemUpOwotCX0KLX0K LQotc3RhdGljIHZvaWQgaW5pdF9wcGd0dF9yZWdfc3RhdGUodTMyICpyZWdzLCBjb25zdCBzdHJ1 Y3QgaTkxNV9wcGd0dCAqcHBndHQpCi17Ci0JaWYgKGk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZt KSkgewotCQkvKiA2NGIgUFBHVFQgKDQ4Yml0IGNhbm9uaWNhbCkKLQkJICogUERQMF9ERVNDUklQ VE9SIGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3MgdG8gUE1MNCBhbmQKLQkJICogb3RoZXIgUERQ IERlc2NyaXB0b3JzIGFyZSBpZ25vcmVkLgotCQkgKi8KLQkJQVNTSUdOX0NUWF9QTUw0KHBwZ3R0 LCByZWdzKTsKLQl9IGVsc2UgewotCQlBU1NJR05fQ1RYX1BEUChwcGd0dCwgcmVncywgMyk7Ci0J CUFTU0lHTl9DVFhfUERQKHBwZ3R0LCByZWdzLCAyKTsKLQkJQVNTSUdOX0NUWF9QRFAocHBndHQs IHJlZ3MsIDEpOwotCQlBU1NJR05fQ1RYX1BEUChwcGd0dCwgcmVncywgMCk7Ci0JfQotfQotCi1z dGF0aWMgc3RydWN0IGk5MTVfcHBndHQgKnZtX2FsaWFzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQotewotCWlmIChpOTE1X2lzX2dndHQodm0pKQotCQlyZXR1cm4gaTkxNV92bV90b19n Z3R0KHZtKS0+YWxpYXM7Ci0JZWxzZQotCQlyZXR1cm4gaTkxNV92bV90b19wcGd0dCh2bSk7Ci19 Ci0KLXN0YXRpYyB2b2lkIGV4ZWNsaXN0c19pbml0X3JlZ19zdGF0ZSh1MzIgKnJlZ3MsCi0JCQkJ ICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCi0JCQkJICAgICBjb25zdCBzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxf cmluZyAqcmluZywKLQkJCQkgICAgIGJvb2wgaW5oaWJpdCkKLXsKLQkvKgotCSAqIEEgY29udGV4 dCBpcyBhY3R1YWxseSBhIGJpZyBiYXRjaCBidWZmZXIgd2l0aCBzZXZlcmFsCi0JICogTUlfTE9B RF9SRUdJU1RFUl9JTU0gY29tbWFuZHMgZm9sbG93ZWQgYnkgKHJlZywgdmFsdWUpIHBhaXJzLiBU aGUKLQkgKiB2YWx1ZXMgd2UgYXJlIHNldHRpbmcgaGVyZSBhcmUgb25seSBmb3IgdGhlIGZpcnN0 IGNvbnRleHQgcmVzdG9yZToKLQkgKiBvbiBhIHN1YnNlcXVlbnQgc2F2ZSwgdGhlIEdQVSB3aWxs IHJlY3JlYXRlIHRoaXMgYmF0Y2hidWZmZXIgd2l0aCBuZXcKLQkgKiB2YWx1ZXMgKGluY2x1ZGlu ZyBhbGwgdGhlIG1pc3NpbmcgTUlfTE9BRF9SRUdJU1RFUl9JTU0gY29tbWFuZHMgdGhhdAotCSAq IHdlIGFyZSBub3QgaW5pdGlhbGl6aW5nIGhlcmUpLgotCSAqCi0JICogTXVzdCBrZWVwIGNvbnNp c3RlbnQgd2l0aCB2aXJ0dWFsX3VwZGF0ZV9yZWdpc3Rlcl9vZmZzZXRzKCkuCi0JICovCi0Jc2V0 X29mZnNldHMocmVncywgcmVnX29mZnNldHMoZW5naW5lKSwgZW5naW5lLCBpbmhpYml0KTsKLQot CWluaXRfY29tbW9uX3JlZ19zdGF0ZShyZWdzLCBlbmdpbmUsIHJpbmcsIGluaGliaXQpOwotCWlu aXRfcHBndHRfcmVnX3N0YXRlKHJlZ3MsIHZtX2FsaWFzKGNlLT52bSkpOwotCi0JaW5pdF93YV9i Yl9yZWdfc3RhdGUocmVncywgZW5naW5lKTsKLQotCV9fcmVzZXRfc3RvcF9yaW5nKHJlZ3MsIGVu Z2luZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBvcHVsYXRlX2xyX2NvbnRleHQoc3RydWN0IGludGVs X2NvbnRleHQgKmNlLAotCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmN0eF9vYmos Ci0JCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCSAgICBzdHJ1Y3QgaW50 ZWxfcmluZyAqcmluZykKLXsKLQlib29sIGluaGliaXQgPSB0cnVlOwotCXZvaWQgKnZhZGRyOwot Ci0JdmFkZHIgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChjdHhfb2JqLCBJOTE1X01BUF9XQik7 Ci0JaWYgKElTX0VSUih2YWRkcikpIHsKLQkJZHJtX2RiZygmZW5naW5lLT5pOTE1LT5kcm0sICJD b3VsZCBub3QgbWFwIG9iamVjdCBwYWdlcyFcbiIpOwotCQlyZXR1cm4gUFRSX0VSUih2YWRkcik7 Ci0JfQotCi0Jc2V0X3JlZHpvbmUodmFkZHIsIGVuZ2luZSk7Ci0KLQlpZiAoZW5naW5lLT5kZWZh dWx0X3N0YXRlKSB7Ci0JCXNobWVtX3JlYWQoZW5naW5lLT5kZWZhdWx0X3N0YXRlLCAwLAotCQkJ ICAgdmFkZHIsIGVuZ2luZS0+Y29udGV4dF9zaXplKTsKLQkJX19zZXRfYml0KENPTlRFWFRfVkFM SURfQklULCAmY2UtPmZsYWdzKTsKLQkJaW5oaWJpdCA9IGZhbHNlOwotCX0KLQotCS8qIENsZWFy IHRoZSBwcEhXU1AgKGluYy4gcGVyLWNvbnRleHQgY291bnRlcnMpICovCi0JbWVtc2V0KHZhZGRy LCAwLCBQQUdFX1NJWkUpOwotCi0JLyoKLQkgKiBUaGUgc2Vjb25kIHBhZ2Ugb2YgdGhlIGNvbnRl eHQgb2JqZWN0IGNvbnRhaW5zIHNvbWUgcmVnaXN0ZXJzIHdoaWNoCi0JICogbXVzdCBiZSBzZXQg dXAgcHJpb3IgdG8gdGhlIGZpcnN0IGV4ZWN1dGlvbi4KLQkgKi8KLQlleGVjbGlzdHNfaW5pdF9y ZWdfc3RhdGUodmFkZHIgKyBMUkNfU1RBVEVfT0ZGU0VULAotCQkJCSBjZSwgZW5naW5lLCByaW5n LCBpbmhpYml0KTsKLQotCV9faTkxNV9nZW1fb2JqZWN0X2ZsdXNoX21hcChjdHhfb2JqLCAwLCBl bmdpbmUtPmNvbnRleHRfc2l6ZSk7Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChjdHhfb2Jq KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpbnRlbF90aW1lbGluZSAqcGlubmVk X3RpbWVsaW5lKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKLXsKLQlzdHJ1Y3QgaW50ZWxfdGlt ZWxpbmUgKnRsID0gZmV0Y2hfYW5kX3plcm8oJmNlLT50aW1lbGluZSk7Ci0KLQlyZXR1cm4gaW50 ZWxfdGltZWxpbmVfY3JlYXRlX2Zyb21fZW5naW5lKGNlLT5lbmdpbmUsCi0JCQkJCQkgcGFnZV91 bm1hc2tfYml0cyh0bCkpOwotfQotCi1zdGF0aWMgaW50IF9fZXhlY2xpc3RzX2NvbnRleHRfYWxs b2Moc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAotCQkJCSAgICAgc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpjdHhfb2JqOwot CXN0cnVjdCBpbnRlbF9yaW5nICpyaW5nOwotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwotCXUzMiBj b250ZXh0X3NpemU7Ci0JaW50IHJldDsKLQotCUdFTV9CVUdfT04oY2UtPnN0YXRlKTsKLQljb250 ZXh0X3NpemUgPSByb3VuZF91cChlbmdpbmUtPmNvbnRleHRfc2l6ZSwgSTkxNV9HVFRfUEFHRV9T SVpFKTsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9ERUJVR19HRU0pKQotCQlj b250ZXh0X3NpemUgKz0gSTkxNV9HVFRfUEFHRV9TSVpFOyAvKiBmb3IgcmVkem9uZSAqLwotCi0J aWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID09IDEyKSB7Ci0JCWNlLT53YV9iYl9wYWdlID0g Y29udGV4dF9zaXplIC8gUEFHRV9TSVpFOwotCQljb250ZXh0X3NpemUgKz0gUEFHRV9TSVpFOwot CX0KLQotCWN0eF9vYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3NobWVtKGVuZ2luZS0+aTkx NSwgY29udGV4dF9zaXplKTsKLQlpZiAoSVNfRVJSKGN0eF9vYmopKQotCQlyZXR1cm4gUFRSX0VS UihjdHhfb2JqKTsKLQotCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKGN0eF9vYmosICZlbmdpbmUt Pmd0LT5nZ3R0LT52bSwgTlVMTCk7Ci0JaWYgKElTX0VSUih2bWEpKSB7Ci0JCXJldCA9IFBUUl9F UlIodm1hKTsKLQkJZ290byBlcnJvcl9kZXJlZl9vYmo7Ci0JfQotCi0JaWYgKCFwYWdlX21hc2tf Yml0cyhjZS0+dGltZWxpbmUpKSB7Ci0JCXN0cnVjdCBpbnRlbF90aW1lbGluZSAqdGw7Ci0KLQkJ LyoKLQkJICogVXNlIHRoZSBzdGF0aWMgZ2xvYmFsIEhXU1AgZm9yIHRoZSBrZXJuZWwgY29udGV4 dCwgYW5kCi0JCSAqIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNhY2hlbGluZSBmb3IgZXZlcnlv bmUgZWxzZS4KLQkJICovCi0JCWlmICh1bmxpa2VseShjZS0+dGltZWxpbmUpKQotCQkJdGwgPSBw aW5uZWRfdGltZWxpbmUoY2UpOwotCQllbHNlCi0JCQl0bCA9IGludGVsX3RpbWVsaW5lX2NyZWF0 ZShlbmdpbmUtPmd0KTsKLQkJaWYgKElTX0VSUih0bCkpIHsKLQkJCXJldCA9IFBUUl9FUlIodGwp OwotCQkJZ290byBlcnJvcl9kZXJlZl9vYmo7Ci0JCX0KLQotCQljZS0+dGltZWxpbmUgPSB0bDsK LQl9Ci0KLQlyaW5nID0gaW50ZWxfZW5naW5lX2NyZWF0ZV9yaW5nKGVuZ2luZSwgKHVuc2lnbmVk IGxvbmcpY2UtPnJpbmcpOwotCWlmIChJU19FUlIocmluZykpIHsKLQkJcmV0ID0gUFRSX0VSUihy aW5nKTsKLQkJZ290byBlcnJvcl9kZXJlZl9vYmo7Ci0JfQotCi0JcmV0ID0gcG9wdWxhdGVfbHJf Y29udGV4dChjZSwgY3R4X29iaiwgZW5naW5lLCByaW5nKTsKLQlpZiAocmV0KSB7Ci0JCWRybV9k YmcoJmVuZ2luZS0+aTkxNS0+ZHJtLAotCQkJIkZhaWxlZCB0byBwb3B1bGF0ZSBMUkM6ICVkXG4i LCByZXQpOwotCQlnb3RvIGVycm9yX3JpbmdfZnJlZTsKLQl9Ci0KLQljZS0+cmluZyA9IHJpbmc7 Ci0JY2UtPnN0YXRlID0gdm1hOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX3JpbmdfZnJlZToKLQlp bnRlbF9yaW5nX3B1dChyaW5nKTsKLWVycm9yX2RlcmVmX29iajoKLQlpOTE1X2dlbV9vYmplY3Rf cHV0KGN0eF9vYmopOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFk ICp2aXJ0dWFsX3F1ZXVlKHN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAqdmUpCiB7CiAJcmV0dXJuICZ2 ZS0+YmFzZS5leGVjbGlzdHMuZGVmYXVsdF9wcmlvbGlzdC5yZXF1ZXN0c1swXTsKQEAgLTQ4OTEs OCArMzM0Miw3IEBAIHN0YXRpYyB2b2lkIHJjdV92aXJ0dWFsX2NvbnRleHRfZGVzdHJveShzdHJ1 Y3Qgd29ya19zdHJ1Y3QgKndyaykKIAlHRU1fQlVHX09OKF9fdGFza2xldF9pc19zY2hlZHVsZWQo JnZlLT5iYXNlLmV4ZWNsaXN0cy50YXNrbGV0KSk7CiAJR0VNX0JVR19PTighbGlzdF9lbXB0eSh2 aXJ0dWFsX3F1ZXVlKHZlKSkpOwogCi0JaWYgKHZlLT5jb250ZXh0LnN0YXRlKQotCQlfX2V4ZWNs aXN0c19jb250ZXh0X2ZpbmkoJnZlLT5jb250ZXh0KTsKKwlscmNfZmluaSgmdmUtPmNvbnRleHQp OwogCWludGVsX2NvbnRleHRfZmluaSgmdmUtPmNvbnRleHQpOwogCiAJaW50ZWxfYnJlYWRjcnVt YnNfZnJlZSh2ZS0+YmFzZS5icmVhZGNydW1icyk7CkBAIC00OTUyLDEyICszNDAyLDIxIEBAIHN0 YXRpYyBpbnQgdmlydHVhbF9jb250ZXh0X2FsbG9jKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkK IAlyZXR1cm4gX19leGVjbGlzdHNfY29udGV4dF9hbGxvYyhjZSwgdmUtPnNpYmxpbmdzWzBdKTsK IH0KIAotc3RhdGljIGludCB2aXJ0dWFsX2NvbnRleHRfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0 ICpjZSwgdm9pZCAqdmFkZHIpCitzdGF0aWMgaW50IHZpcnR1YWxfY29udGV4dF9wcmVfcGluKHN0 cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwkJCQkgICAgIHN0cnVjdCBpOTE1X2dlbV93d19jdHgg Knd3LAorCQkJCSAgICAgdm9pZCAqKnZhZGRyKQogewogCXN0cnVjdCB2aXJ0dWFsX2VuZ2luZSAq dmUgPSBjb250YWluZXJfb2YoY2UsIHR5cGVvZigqdmUpLCBjb250ZXh0KTsKIAogCS8qIE5vdGU6 IHdlIG11c3QgdXNlIGEgcmVhbCBlbmdpbmUgY2xhc3MgZm9yIHNldHRpbmcgdXAgcmVnIHN0YXRl ICovCi0JcmV0dXJuIF9fZXhlY2xpc3RzX2NvbnRleHRfcGluKGNlLCB2ZS0+c2libGluZ3NbMF0s IHZhZGRyKTsKKwlyZXR1cm4gbHJjX3ByZV9waW4oY2UsIHZlLT5zaWJsaW5nc1swXSwgd3csIHZh ZGRyKTsKK30KKworc3RhdGljIGludCB2aXJ0dWFsX2NvbnRleHRfcGluKHN0cnVjdCBpbnRlbF9j b250ZXh0ICpjZSwgdm9pZCAqdmFkZHIpCit7CisJc3RydWN0IHZpcnR1YWxfZW5naW5lICp2ZSA9 IGNvbnRhaW5lcl9vZihjZSwgdHlwZW9mKCp2ZSksIGNvbnRleHQpOworCisJcmV0dXJuIGxyY19w aW4oY2UsIHZlLT5zaWJsaW5nc1swXSwgdmFkZHIpOwogfQogCiBzdGF0aWMgdm9pZCB2aXJ0dWFs X2NvbnRleHRfZW50ZXIoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQpAQCAtNDk4NSwxMCArMzQ0 NCwxMCBAQCBzdGF0aWMgdm9pZCB2aXJ0dWFsX2NvbnRleHRfZXhpdChzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqY2UpCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHRfb3BzIHZpcnR1YWxf Y29udGV4dF9vcHMgPSB7CiAJLmFsbG9jID0gdmlydHVhbF9jb250ZXh0X2FsbG9jLAogCi0JLnBy ZV9waW4gPSBleGVjbGlzdHNfY29udGV4dF9wcmVfcGluLAorCS5wcmVfcGluID0gdmlydHVhbF9j b250ZXh0X3ByZV9waW4sCiAJLnBpbiA9IHZpcnR1YWxfY29udGV4dF9waW4sCi0JLnVucGluID0g ZXhlY2xpc3RzX2NvbnRleHRfdW5waW4sCi0JLnBvc3RfdW5waW4gPSBleGVjbGlzdHNfY29udGV4 dF9wb3N0X3VucGluLAorCS51bnBpbiA9IGxyY191bnBpbiwKKwkucG9zdF91bnBpbiA9IGxyY19w b3N0X3VucGluLAogCiAJLmVudGVyID0gdmlydHVhbF9jb250ZXh0X2VudGVyLAogCS5leGl0ID0g dmlydHVhbF9jb250ZXh0X2V4aXQsCkBAIC01NDcwLDI4ICszOTI5LDYgQEAgdm9pZCBpbnRlbF9l eGVjbGlzdHNfc2hvd19yZXF1ZXN0cyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCiAJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5naW5lLT5hY3RpdmUubG9jaywgZmxhZ3MpOwogfQog Ci12b2lkIGludGVsX2xyX2NvbnRleHRfcmVzZXQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lLAotCQkJICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKLQkJCSAgICB1MzIgaGVhZCwK LQkJCSAgICBib29sIHNjcnViKQotewotCUdFTV9CVUdfT04oIWludGVsX2NvbnRleHRfaXNfcGlu bmVkKGNlKSk7Ci0KLQkvKgotCSAqIFdlIHdhbnQgYSBzaW1wbGUgY29udGV4dCArIHJpbmcgdG8g ZXhlY3V0ZSB0aGUgYnJlYWRjcnVtYiB1cGRhdGUuCi0JICogV2UgY2Fubm90IHJlbHkgb24gdGhl IGNvbnRleHQgYmVpbmcgaW50YWN0IGFjcm9zcyB0aGUgR1BVIGhhbmcsCi0JICogc28gY2xlYXIg aXQgYW5kIHJlYnVpbGQganVzdCB3aGF0IHdlIG5lZWQgZm9yIHRoZSBicmVhZGNydW1iLgotCSAq IEFsbCBwZW5kaW5nIHJlcXVlc3RzIGZvciB0aGlzIGNvbnRleHQgd2lsbCBiZSB6YXBwZWQsIGFu ZCBhbnkKLQkgKiBmdXR1cmUgcmVxdWVzdCB3aWxsIGJlIGFmdGVyIHVzZXJzcGFjZSBoYXMgaGFk IHRoZSBvcHBvcnR1bml0eQotCSAqIHRvIHJlY3JlYXRlIGl0cyBvd24gc3RhdGUuCi0JICovCi0J aWYgKHNjcnViKQotCQlyZXN0b3JlX2RlZmF1bHRfc3RhdGUoY2UsIGVuZ2luZSk7Ci0KLQkvKiBS ZXJ1biB0aGUgcmVxdWVzdDsgaXRzIHBheWxvYWQgaGFzIGJlZW4gbmV1dGVyZWQgKGlmIGd1aWx0 eSkuICovCi0JX19leGVjbGlzdHNfdXBkYXRlX3JlZ19zdGF0ZShjZSwgZW5naW5lLCBoZWFkKTsK LX0KLQogYm9vbAogaW50ZWxfZW5naW5lX2luX2V4ZWNsaXN0c19zdWJtaXNzaW9uX21vZGUoY29u c3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaCBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmgKaW5kZXggMmM5ZDcz NTRiNDJmLi4wYzY3NWJiZmYzNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0 L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaApAQCAtMjIsMjUgKzIyLDggQEAgZW51bSB7 CiAKIGludCBpbnRlbF9leGVjbGlzdHNfc3VibWlzc2lvbl9zZXR1cChzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpOwogCi0vKiBMb2dpY2FsIFJpbmcgQ29udGV4dHMgKi8KLS8qIEF0IHRo ZSBzdGFydCBvZiB0aGUgY29udGV4dCBpbWFnZSBpcyBpdHMgcGVyLXByb2Nlc3MgSFdTIHBhZ2Ug Ki8KLSNkZWZpbmUgTFJDX1BQSFdTUF9QTgkoMCkKLSNkZWZpbmUgTFJDX1BQSFdTUF9TWgkoMSkK LS8qIEFmdGVyIHRoZSBQUEhXU1Agd2UgaGF2ZSB0aGUgbG9naWNhbCBzdGF0ZSBmb3IgdGhlIGNv bnRleHQgKi8KLSNkZWZpbmUgTFJDX1NUQVRFX1BOCShMUkNfUFBIV1NQX1BOICsgTFJDX1BQSFdT UF9TWikKLSNkZWZpbmUgTFJDX1NUQVRFX09GRlNFVCAoTFJDX1NUQVRFX1BOICogUEFHRV9TSVpF KQotCi0vKiBTcGFjZSB3aXRoaW4gUFBIV1NQIHJlc2VydmVkIHRvIGJlIHVzZWQgYXMgc2NyYXRj aCAqLwotI2RlZmluZSBMUkNfUFBIV1NQX1NDUkFUQ0gJCTB4MzQKLSNkZWZpbmUgTFJDX1BQSFdT UF9TQ1JBVENIX0FERFIJCShMUkNfUFBIV1NQX1NDUkFUQ0ggKiBzaXplb2YodTMyKSkKLQogdm9p ZCBpbnRlbF9leGVjbGlzdHNfc2V0X2RlZmF1bHRfc3VibWlzc2lvbihzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpOwogCi12b2lkIGludGVsX2xyX2NvbnRleHRfcmVzZXQoc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lLAotCQkJICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwK LQkJCSAgICB1MzIgaGVhZCwKLQkJCSAgICBib29sIHNjcnViKTsKLQogdm9pZCBpbnRlbF9leGVj bGlzdHNfc2hvd19yZXF1ZXN0cyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCiAJCQkJ ICAgc3RydWN0IGRybV9wcmludGVyICptLAogCQkJCSAgIHZvaWQgKCpzaG93X3JlcXVlc3QpKHN0 cnVjdCBkcm1fcHJpbnRlciAqbSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0 L2ludGVsX2xyYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42MTBjNmQ1YTUxN2YKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmMuYwpAQCAtMCwwICsx LDE1NjEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKKy8qCisgKiBDb3B5cmln aHQgwqkgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpbmNsdWRlICJnZW44X2VuZ2lu ZV9jcy5oIgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9wZXJmLmgiCisj aW5jbHVkZSAiaW50ZWxfZW5naW5lLmgiCisjaW5jbHVkZSAiaW50ZWxfZ3B1X2NvbW1hbmRzLmgi CisjaW5jbHVkZSAiaW50ZWxfZ3QuaCIKKyNpbmNsdWRlICJpbnRlbF9scmMuaCIKKyNpbmNsdWRl ICJpbnRlbF9scmNfcmVnLmgiCisjaW5jbHVkZSAiaW50ZWxfcmluZy5oIgorI2luY2x1ZGUgInNo bWVtX3V0aWxzLmgiCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGR3b3JkX2luX3BhZ2Uo dm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gb2Zmc2V0X2luX3BhZ2UoYWRkcikgLyBzaXplb2YodTMy KTsKK30KKworc3RhdGljIHZvaWQgc2V0X29mZnNldHModTMyICpyZWdzLAorCQkJY29uc3QgdTgg KmRhdGEsCisJCQljb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCQlib29s IGNsb3NlKQorI2RlZmluZSBOT1AoeCkgKEJJVCg3KSB8ICh4KSkKKyNkZWZpbmUgTFJJKGNvdW50 LCBmbGFncykgKChmbGFncykgPDwgNiB8IChjb3VudCkgfCBCVUlMRF9CVUdfT05fWkVSTyhjb3Vu dCA+PSBCSVQoNikpKQorI2RlZmluZSBQT1NURUQgQklUKDApCisjZGVmaW5lIFJFRyh4KSAoKCh4 KSA+PiAyKSB8IEJVSUxEX0JVR19PTl9aRVJPKHggPj0gMHgyMDApKQorI2RlZmluZSBSRUcxNih4 KSBcCisJKCgoeCkgPj4gOSkgfCBCSVQoNykgfCBCVUlMRF9CVUdfT05fWkVSTyh4ID49IDB4MTAw MDApKSwgXAorCSgoKHgpID4+IDIpICYgMHg3ZikKKyNkZWZpbmUgRU5EIDAKK3sKKwljb25zdCB1 MzIgYmFzZSA9IGVuZ2luZS0+bW1pb19iYXNlOworCisJd2hpbGUgKCpkYXRhKSB7CisJCXU4IGNv dW50LCBmbGFnczsKKworCQlpZiAoKmRhdGEgJiBCSVQoNykpIHsgLyogc2tpcCAqLworCQkJY291 bnQgPSAqZGF0YSsrICYgfkJJVCg3KTsKKwkJCXJlZ3MgKz0gY291bnQ7CisJCQljb250aW51ZTsK KwkJfQorCisJCWNvdW50ID0gKmRhdGEgJiAweDNmOworCQlmbGFncyA9ICpkYXRhID4+IDY7CisJ CWRhdGErKzsKKworCQkqcmVncyA9IE1JX0xPQURfUkVHSVNURVJfSU1NKGNvdW50KTsKKwkJaWYg KGZsYWdzICYgUE9TVEVEKQorCQkJKnJlZ3MgfD0gTUlfTFJJX0ZPUkNFX1BPU1RFRDsKKwkJaWYg KElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDExKQorCQkJKnJlZ3MgfD0gTUlfTFJJX0xSTV9D U19NTUlPOworCQlyZWdzKys7CisKKwkJR0VNX0JVR19PTighY291bnQpOworCQlkbyB7CisJCQl1 MzIgb2Zmc2V0ID0gMDsKKwkJCXU4IHY7CisKKwkJCWRvIHsKKwkJCQl2ID0gKmRhdGErKzsKKwkJ CQlvZmZzZXQgPDw9IDc7CisJCQkJb2Zmc2V0IHw9IHYgJiB+QklUKDcpOworCQkJfSB3aGlsZSAo diAmIEJJVCg3KSk7CisKKwkJCXJlZ3NbMF0gPSBiYXNlICsgKG9mZnNldCA8PCAyKTsKKwkJCXJl Z3MgKz0gMjsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorCisJaWYgKGNsb3NlKSB7CisJCS8q IENsb3NlIHRoZSBiYXRjaDsgdXNlZCBtYWlubHkgYnkgbGl2ZV9scmNfbGF5b3V0KCkgKi8KKwkJ KnJlZ3MgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCQlpZiAoSU5URUxfR0VOKGVuZ2luZS0+aTkx NSkgPj0gMTApCisJCQkqcmVncyB8PSBCSVQoMCk7CisJfQorfQorCitzdGF0aWMgY29uc3QgdTgg Z2VuOF94Y3Nfb2Zmc2V0c1tdID0geworCU5PUCgxKSwKKwlMUkkoMTEsIDApLAorCVJFRzE2KDB4 MjQ0KSwKKwlSRUcoMHgwMzQpLAorCVJFRygweDAzMCksCisJUkVHKDB4MDM4KSwKKwlSRUcoMHgw M2MpLAorCVJFRygweDE2OCksCisJUkVHKDB4MTQwKSwKKwlSRUcoMHgxMTApLAorCVJFRygweDEx YyksCisJUkVHKDB4MTE0KSwKKwlSRUcoMHgxMTgpLAorCisJTk9QKDkpLAorCUxSSSg5LCAwKSwK KwlSRUcxNigweDNhOCksCisJUkVHMTYoMHgyOGMpLAorCVJFRzE2KDB4Mjg4KSwKKwlSRUcxNigw eDI4NCksCisJUkVHMTYoMHgyODApLAorCVJFRzE2KDB4MjdjKSwKKwlSRUcxNigweDI3OCksCisJ UkVHMTYoMHgyNzQpLAorCVJFRzE2KDB4MjcwKSwKKworCU5PUCgxMyksCisJTFJJKDIsIDApLAor CVJFRzE2KDB4MjAwKSwKKwlSRUcoMHgwMjgpLAorCisJRU5ECit9OworCitzdGF0aWMgY29uc3Qg dTggZ2VuOV94Y3Nfb2Zmc2V0c1tdID0geworCU5PUCgxKSwKKwlMUkkoMTQsIFBPU1RFRCksCisJ UkVHMTYoMHgyNDQpLAorCVJFRygweDAzNCksCisJUkVHKDB4MDMwKSwKKwlSRUcoMHgwMzgpLAor CVJFRygweDAzYyksCisJUkVHKDB4MTY4KSwKKwlSRUcoMHgxNDApLAorCVJFRygweDExMCksCisJ UkVHKDB4MTFjKSwKKwlSRUcoMHgxMTQpLAorCVJFRygweDExOCksCisJUkVHKDB4MWMwKSwKKwlS RUcoMHgxYzQpLAorCVJFRygweDFjOCksCisKKwlOT1AoMyksCisJTFJJKDksIFBPU1RFRCksCisJ UkVHMTYoMHgzYTgpLAorCVJFRzE2KDB4MjhjKSwKKwlSRUcxNigweDI4OCksCisJUkVHMTYoMHgy ODQpLAorCVJFRzE2KDB4MjgwKSwKKwlSRUcxNigweDI3YyksCisJUkVHMTYoMHgyNzgpLAorCVJF RzE2KDB4Mjc0KSwKKwlSRUcxNigweDI3MCksCisKKwlOT1AoMTMpLAorCUxSSSgxLCBQT1NURUQp LAorCVJFRzE2KDB4MjAwKSwKKworCU5PUCgxMyksCisJTFJJKDQ0LCBQT1NURUQpLAorCVJFRygw eDAyOCksCisJUkVHKDB4MDljKSwKKwlSRUcoMHgwYzApLAorCVJFRygweDE3OCksCisJUkVHKDB4 MTdjKSwKKwlSRUcxNigweDM1OCksCisJUkVHKDB4MTcwKSwKKwlSRUcoMHgxNTApLAorCVJFRygw eDE1NCksCisJUkVHKDB4MTU4KSwKKwlSRUcxNigweDQxYyksCisJUkVHMTYoMHg2MDApLAorCVJF RzE2KDB4NjA0KSwKKwlSRUcxNigweDYwOCksCisJUkVHMTYoMHg2MGMpLAorCVJFRzE2KDB4NjEw KSwKKwlSRUcxNigweDYxNCksCisJUkVHMTYoMHg2MTgpLAorCVJFRzE2KDB4NjFjKSwKKwlSRUcx NigweDYyMCksCisJUkVHMTYoMHg2MjQpLAorCVJFRzE2KDB4NjI4KSwKKwlSRUcxNigweDYyYyks CisJUkVHMTYoMHg2MzApLAorCVJFRzE2KDB4NjM0KSwKKwlSRUcxNigweDYzOCksCisJUkVHMTYo MHg2M2MpLAorCVJFRzE2KDB4NjQwKSwKKwlSRUcxNigweDY0NCksCisJUkVHMTYoMHg2NDgpLAor CVJFRzE2KDB4NjRjKSwKKwlSRUcxNigweDY1MCksCisJUkVHMTYoMHg2NTQpLAorCVJFRzE2KDB4 NjU4KSwKKwlSRUcxNigweDY1YyksCisJUkVHMTYoMHg2NjApLAorCVJFRzE2KDB4NjY0KSwKKwlS RUcxNigweDY2OCksCisJUkVHMTYoMHg2NmMpLAorCVJFRzE2KDB4NjcwKSwKKwlSRUcxNigweDY3 NCksCisJUkVHMTYoMHg2NzgpLAorCVJFRzE2KDB4NjdjKSwKKwlSRUcoMHgwNjgpLAorCisJRU5E Cit9OworCitzdGF0aWMgY29uc3QgdTggZ2VuMTJfeGNzX29mZnNldHNbXSA9IHsKKwlOT1AoMSks CisJTFJJKDEzLCBQT1NURUQpLAorCVJFRzE2KDB4MjQ0KSwKKwlSRUcoMHgwMzQpLAorCVJFRygw eDAzMCksCisJUkVHKDB4MDM4KSwKKwlSRUcoMHgwM2MpLAorCVJFRygweDE2OCksCisJUkVHKDB4 MTQwKSwKKwlSRUcoMHgxMTApLAorCVJFRygweDFjMCksCisJUkVHKDB4MWM0KSwKKwlSRUcoMHgx YzgpLAorCVJFRygweDE4MCksCisJUkVHMTYoMHgyYjQpLAorCisJTk9QKDUpLAorCUxSSSg5LCBQ T1NURUQpLAorCVJFRzE2KDB4M2E4KSwKKwlSRUcxNigweDI4YyksCisJUkVHMTYoMHgyODgpLAor CVJFRzE2KDB4Mjg0KSwKKwlSRUcxNigweDI4MCksCisJUkVHMTYoMHgyN2MpLAorCVJFRzE2KDB4 Mjc4KSwKKwlSRUcxNigweDI3NCksCisJUkVHMTYoMHgyNzApLAorCisJRU5ECit9OworCitzdGF0 aWMgY29uc3QgdTggZ2VuOF9yY3Nfb2Zmc2V0c1tdID0geworCU5PUCgxKSwKKwlMUkkoMTQsIFBP U1RFRCksCisJUkVHMTYoMHgyNDQpLAorCVJFRygweDAzNCksCisJUkVHKDB4MDMwKSwKKwlSRUco MHgwMzgpLAorCVJFRygweDAzYyksCisJUkVHKDB4MTY4KSwKKwlSRUcoMHgxNDApLAorCVJFRygw eDExMCksCisJUkVHKDB4MTFjKSwKKwlSRUcoMHgxMTQpLAorCVJFRygweDExOCksCisJUkVHKDB4 MWMwKSwKKwlSRUcoMHgxYzQpLAorCVJFRygweDFjOCksCisKKwlOT1AoMyksCisJTFJJKDksIFBP U1RFRCksCisJUkVHMTYoMHgzYTgpLAorCVJFRzE2KDB4MjhjKSwKKwlSRUcxNigweDI4OCksCisJ UkVHMTYoMHgyODQpLAorCVJFRzE2KDB4MjgwKSwKKwlSRUcxNigweDI3YyksCisJUkVHMTYoMHgy NzgpLAorCVJFRzE2KDB4Mjc0KSwKKwlSRUcxNigweDI3MCksCisKKwlOT1AoMTMpLAorCUxSSSgx LCAwKSwKKwlSRUcoMHgwYzgpLAorCisJRU5ECit9OworCitzdGF0aWMgY29uc3QgdTggZ2VuOV9y Y3Nfb2Zmc2V0c1tdID0geworCU5PUCgxKSwKKwlMUkkoMTQsIFBPU1RFRCksCisJUkVHMTYoMHgy NDQpLAorCVJFRygweDM0KSwKKwlSRUcoMHgzMCksCisJUkVHKDB4MzgpLAorCVJFRygweDNjKSwK KwlSRUcoMHgxNjgpLAorCVJFRygweDE0MCksCisJUkVHKDB4MTEwKSwKKwlSRUcoMHgxMWMpLAor CVJFRygweDExNCksCisJUkVHKDB4MTE4KSwKKwlSRUcoMHgxYzApLAorCVJFRygweDFjNCksCisJ UkVHKDB4MWM4KSwKKworCU5PUCgzKSwKKwlMUkkoOSwgUE9TVEVEKSwKKwlSRUcxNigweDNhOCks CisJUkVHMTYoMHgyOGMpLAorCVJFRzE2KDB4Mjg4KSwKKwlSRUcxNigweDI4NCksCisJUkVHMTYo MHgyODApLAorCVJFRzE2KDB4MjdjKSwKKwlSRUcxNigweDI3OCksCisJUkVHMTYoMHgyNzQpLAor CVJFRzE2KDB4MjcwKSwKKworCU5PUCgxMyksCisJTFJJKDEsIDApLAorCVJFRygweGM4KSwKKwor CU5PUCgxMyksCisJTFJJKDQ0LCBQT1NURUQpLAorCVJFRygweDI4KSwKKwlSRUcoMHg5YyksCisJ UkVHKDB4YzApLAorCVJFRygweDE3OCksCisJUkVHKDB4MTdjKSwKKwlSRUcxNigweDM1OCksCisJ UkVHKDB4MTcwKSwKKwlSRUcoMHgxNTApLAorCVJFRygweDE1NCksCisJUkVHKDB4MTU4KSwKKwlS RUcxNigweDQxYyksCisJUkVHMTYoMHg2MDApLAorCVJFRzE2KDB4NjA0KSwKKwlSRUcxNigweDYw OCksCisJUkVHMTYoMHg2MGMpLAorCVJFRzE2KDB4NjEwKSwKKwlSRUcxNigweDYxNCksCisJUkVH MTYoMHg2MTgpLAorCVJFRzE2KDB4NjFjKSwKKwlSRUcxNigweDYyMCksCisJUkVHMTYoMHg2MjQp LAorCVJFRzE2KDB4NjI4KSwKKwlSRUcxNigweDYyYyksCisJUkVHMTYoMHg2MzApLAorCVJFRzE2 KDB4NjM0KSwKKwlSRUcxNigweDYzOCksCisJUkVHMTYoMHg2M2MpLAorCVJFRzE2KDB4NjQwKSwK KwlSRUcxNigweDY0NCksCisJUkVHMTYoMHg2NDgpLAorCVJFRzE2KDB4NjRjKSwKKwlSRUcxNigw eDY1MCksCisJUkVHMTYoMHg2NTQpLAorCVJFRzE2KDB4NjU4KSwKKwlSRUcxNigweDY1YyksCisJ UkVHMTYoMHg2NjApLAorCVJFRzE2KDB4NjY0KSwKKwlSRUcxNigweDY2OCksCisJUkVHMTYoMHg2 NmMpLAorCVJFRzE2KDB4NjcwKSwKKwlSRUcxNigweDY3NCksCisJUkVHMTYoMHg2NzgpLAorCVJF RzE2KDB4NjdjKSwKKwlSRUcoMHg2OCksCisKKwlFTkQKK307CisKK3N0YXRpYyBjb25zdCB1OCBn ZW4xMV9yY3Nfb2Zmc2V0c1tdID0geworCU5PUCgxKSwKKwlMUkkoMTUsIFBPU1RFRCksCisJUkVH MTYoMHgyNDQpLAorCVJFRygweDAzNCksCisJUkVHKDB4MDMwKSwKKwlSRUcoMHgwMzgpLAorCVJF RygweDAzYyksCisJUkVHKDB4MTY4KSwKKwlSRUcoMHgxNDApLAorCVJFRygweDExMCksCisJUkVH KDB4MTFjKSwKKwlSRUcoMHgxMTQpLAorCVJFRygweDExOCksCisJUkVHKDB4MWMwKSwKKwlSRUco MHgxYzQpLAorCVJFRygweDFjOCksCisJUkVHKDB4MTgwKSwKKworCU5PUCgxKSwKKwlMUkkoOSwg UE9TVEVEKSwKKwlSRUcxNigweDNhOCksCisJUkVHMTYoMHgyOGMpLAorCVJFRzE2KDB4Mjg4KSwK KwlSRUcxNigweDI4NCksCisJUkVHMTYoMHgyODApLAorCVJFRzE2KDB4MjdjKSwKKwlSRUcxNigw eDI3OCksCisJUkVHMTYoMHgyNzQpLAorCVJFRzE2KDB4MjcwKSwKKworCUxSSSgxLCBQT1NURUQp LAorCVJFRygweDFiMCksCisKKwlOT1AoMTApLAorCUxSSSgxLCAwKSwKKwlSRUcoMHgwYzgpLAor CisJRU5ECit9OworCitzdGF0aWMgY29uc3QgdTggZ2VuMTJfcmNzX29mZnNldHNbXSA9IHsKKwlO T1AoMSksCisJTFJJKDEzLCBQT1NURUQpLAorCVJFRzE2KDB4MjQ0KSwKKwlSRUcoMHgwMzQpLAor CVJFRygweDAzMCksCisJUkVHKDB4MDM4KSwKKwlSRUcoMHgwM2MpLAorCVJFRygweDE2OCksCisJ UkVHKDB4MTQwKSwKKwlSRUcoMHgxMTApLAorCVJFRygweDFjMCksCisJUkVHKDB4MWM0KSwKKwlS RUcoMHgxYzgpLAorCVJFRygweDE4MCksCisJUkVHMTYoMHgyYjQpLAorCisJTk9QKDUpLAorCUxS SSg5LCBQT1NURUQpLAorCVJFRzE2KDB4M2E4KSwKKwlSRUcxNigweDI4YyksCisJUkVHMTYoMHgy ODgpLAorCVJFRzE2KDB4Mjg0KSwKKwlSRUcxNigweDI4MCksCisJUkVHMTYoMHgyN2MpLAorCVJF RzE2KDB4Mjc4KSwKKwlSRUcxNigweDI3NCksCisJUkVHMTYoMHgyNzApLAorCisJTFJJKDMsIFBP U1RFRCksCisJUkVHKDB4MWIwKSwKKwlSRUcxNigweDVhOCksCisJUkVHMTYoMHg1YWMpLAorCisJ Tk9QKDYpLAorCUxSSSgxLCAwKSwKKwlSRUcoMHgwYzgpLAorCU5PUCgzICsgOSArIDEpLAorCisJ TFJJKDUxLCBQT1NURUQpLAorCVJFRzE2KDB4NTg4KSwKKwlSRUcxNigweDU4OCksCisJUkVHMTYo MHg1ODgpLAorCVJFRzE2KDB4NTg4KSwKKwlSRUcxNigweDU4OCksCisJUkVHMTYoMHg1ODgpLAor CVJFRygweDAyOCksCisJUkVHKDB4MDljKSwKKwlSRUcoMHgwYzApLAorCVJFRygweDE3OCksCisJ UkVHKDB4MTdjKSwKKwlSRUcxNigweDM1OCksCisJUkVHKDB4MTcwKSwKKwlSRUcoMHgxNTApLAor CVJFRygweDE1NCksCisJUkVHKDB4MTU4KSwKKwlSRUcxNigweDQxYyksCisJUkVHMTYoMHg2MDAp LAorCVJFRzE2KDB4NjA0KSwKKwlSRUcxNigweDYwOCksCisJUkVHMTYoMHg2MGMpLAorCVJFRzE2 KDB4NjEwKSwKKwlSRUcxNigweDYxNCksCisJUkVHMTYoMHg2MTgpLAorCVJFRzE2KDB4NjFjKSwK KwlSRUcxNigweDYyMCksCisJUkVHMTYoMHg2MjQpLAorCVJFRzE2KDB4NjI4KSwKKwlSRUcxNigw eDYyYyksCisJUkVHMTYoMHg2MzApLAorCVJFRzE2KDB4NjM0KSwKKwlSRUcxNigweDYzOCksCisJ UkVHMTYoMHg2M2MpLAorCVJFRzE2KDB4NjQwKSwKKwlSRUcxNigweDY0NCksCisJUkVHMTYoMHg2 NDgpLAorCVJFRzE2KDB4NjRjKSwKKwlSRUcxNigweDY1MCksCisJUkVHMTYoMHg2NTQpLAorCVJF RzE2KDB4NjU4KSwKKwlSRUcxNigweDY1YyksCisJUkVHMTYoMHg2NjApLAorCVJFRzE2KDB4NjY0 KSwKKwlSRUcxNigweDY2OCksCisJUkVHMTYoMHg2NmMpLAorCVJFRzE2KDB4NjcwKSwKKwlSRUcx NigweDY3NCksCisJUkVHMTYoMHg2NzgpLAorCVJFRzE2KDB4NjdjKSwKKwlSRUcoMHgwNjgpLAor CVJFRygweDA4NCksCisJTk9QKDEpLAorCisJRU5ECit9OworCisjdW5kZWYgRU5ECisjdW5kZWYg UkVHMTYKKyN1bmRlZiBSRUcKKyN1bmRlZiBMUkkKKyN1bmRlZiBOT1AKKworc3RhdGljIGNvbnN0 IHU4ICpyZWdfb2Zmc2V0cyhjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7 CisJLyoKKwkgKiBUaGUgZ2VuMTIrIGxpc3RzIG9ubHkgaGF2ZSB0aGUgcmVnaXN0ZXJzIHdlIHBy b2dyYW0gaW4gdGhlIGJhc2ljCisJICogZGVmYXVsdCBzdGF0ZS4gV2UgcmVseSBvbiB0aGUgY29u dGV4dCBpbWFnZSB1c2luZyByZWxhdGl2ZQorCSAqIGFkZHJlc3NpbmcgdG8gYXV0b21hdGljIGZp eHVwIHRoZSByZWdpc3RlciBzdGF0ZSBiZXR3ZWVuIHRoZQorCSAqIHBoeXNpY2FsIGVuZ2luZXMg Zm9yIHZpcnR1YWwgZW5naW5lLgorCSAqLworCUdFTV9CVUdfT04oSU5URUxfR0VOKGVuZ2luZS0+ aTkxNSkgPj0gMTIgJiYKKwkJICAgIWludGVsX2VuZ2luZV9oYXNfcmVsYXRpdmVfbW1pbyhlbmdp bmUpKTsKKworCWlmIChlbmdpbmUtPmNsYXNzID09IFJFTkRFUl9DTEFTUykgeworCQlpZiAoSU5U RUxfR0VOKGVuZ2luZS0+aTkxNSkgPj0gMTIpCisJCQlyZXR1cm4gZ2VuMTJfcmNzX29mZnNldHM7 CisJCWVsc2UgaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDExKQorCQkJcmV0dXJuIGdl bjExX3Jjc19vZmZzZXRzOworCQllbHNlIGlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSA5 KQorCQkJcmV0dXJuIGdlbjlfcmNzX29mZnNldHM7CisJCWVsc2UKKwkJCXJldHVybiBnZW44X3Jj c19vZmZzZXRzOworCX0gZWxzZSB7CisJCWlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSAx MikKKwkJCXJldHVybiBnZW4xMl94Y3Nfb2Zmc2V0czsKKwkJZWxzZSBpZiAoSU5URUxfR0VOKGVu Z2luZS0+aTkxNSkgPj0gOSkKKwkJCXJldHVybiBnZW45X3hjc19vZmZzZXRzOworCQllbHNlCisJ CQlyZXR1cm4gZ2VuOF94Y3Nfb2Zmc2V0czsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbHJjX3Jpbmdf bWlfbW9kZShjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJaWYgKElO VEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDEyKQorCQlyZXR1cm4gMHg2MDsKKwllbHNlIGlmIChJ TlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSA5KQorCQlyZXR1cm4gMHg1NDsKKwllbHNlIGlmIChl bmdpbmUtPmNsYXNzID09IFJFTkRFUl9DTEFTUykKKwkJcmV0dXJuIDB4NTg7CisJZWxzZQorCQly ZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbHJjX3JpbmdfZ3ByMChjb25zdCBzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49 IDEyKQorCQlyZXR1cm4gMHg3NDsKKwllbHNlIGlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+ PSA5KQorCQlyZXR1cm4gMHg2ODsKKwllbHNlIGlmIChlbmdpbmUtPmNsYXNzID09IFJFTkRFUl9D TEFTUykKKwkJcmV0dXJuIDB4ZDg7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBp bnQgbHJjX3Jpbmdfd2FfYmJfcGVyX2N0eChjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpCit7CisJaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID49IDEyKQorCQlyZXR1cm4g MHgxMjsKKwllbHNlIGlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA+PSA5IHx8IGVuZ2luZS0+ Y2xhc3MgPT0gUkVOREVSX0NMQVNTKQorCQlyZXR1cm4gMHgxODsKKwllbHNlCisJCXJldHVybiAt MTsKK30KKworc3RhdGljIGludCBscmNfcmluZ19pbmRpcmVjdF9wdHIoY29uc3Qgc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCWludCB4OworCisJeCA9IGxyY19yaW5nX3dhX2Ji X3Blcl9jdHgoZW5naW5lKTsKKwlpZiAoeCA8IDApCisJCXJldHVybiB4OworCisJcmV0dXJuIHgg KyAyOworfQorCitzdGF0aWMgaW50IGxyY19yaW5nX2luZGlyZWN0X29mZnNldChjb25zdCBzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJaW50IHg7CisKKwl4ID0gbHJjX3Jpbmdf aW5kaXJlY3RfcHRyKGVuZ2luZSk7CisJaWYgKHggPCAwKQorCQlyZXR1cm4geDsKKworCXJldHVy biB4ICsgMjsKK30KKworc3RhdGljIGludCBscmNfcmluZ19jbWRfYnVmX2NjdGwoY29uc3Qgc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCWlmIChlbmdpbmUtPmNsYXNzICE9IFJF TkRFUl9DTEFTUykKKwkJcmV0dXJuIC0xOworCisJaWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUp ID49IDEyKQorCQlyZXR1cm4gMHhiNjsKKwllbHNlIGlmIChJTlRFTF9HRU4oZW5naW5lLT5pOTE1 KSA+PSAxMSkKKwkJcmV0dXJuIDB4YWE7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK3N0YXRp YyB1MzIKK2xyY19yaW5nX2luZGlyZWN0X29mZnNldF9kZWZhdWx0KGNvbnN0IHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzd2l0Y2ggKElOVEVMX0dFTihlbmdpbmUtPmk5MTUp KSB7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpKTsK KwkJZmFsbHRocm91Z2g7CisJY2FzZSAxMjoKKwkJcmV0dXJuIEdFTjEyX0NUWF9SQ1NfSU5ESVJF Q1RfQ1RYX09GRlNFVF9ERUZBVUxUOworCWNhc2UgMTE6CisJCXJldHVybiBHRU4xMV9DVFhfUkNT X0lORElSRUNUX0NUWF9PRkZTRVRfREVGQVVMVDsKKwljYXNlIDEwOgorCQlyZXR1cm4gR0VOMTBf Q1RYX1JDU19JTkRJUkVDVF9DVFhfT0ZGU0VUX0RFRkFVTFQ7CisJY2FzZSA5OgorCQlyZXR1cm4g R0VOOV9DVFhfUkNTX0lORElSRUNUX0NUWF9PRkZTRVRfREVGQVVMVDsKKwljYXNlIDg6CisJCXJl dHVybiBHRU44X0NUWF9SQ1NfSU5ESVJFQ1RfQ1RYX09GRlNFVF9ERUZBVUxUOworCX0KK30KKwor c3RhdGljIHZvaWQKK2xyY19zZXR1cF9pbmRpcmVjdF9jdHgodTMyICpyZWdzLAorCQkgICAgICAg Y29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAorCQkgICAgICAgdTMyIGN0eF9i Yl9nZ3R0X2FkZHIsCisJCSAgICAgICB1MzIgc2l6ZSkKK3sKKwlHRU1fQlVHX09OKCFzaXplKTsK KwlHRU1fQlVHX09OKCFJU19BTElHTkVEKHNpemUsIENBQ0hFTElORV9CWVRFUykpOworCUdFTV9C VUdfT04obHJjX3JpbmdfaW5kaXJlY3RfcHRyKGVuZ2luZSkgPT0gLTEpOworCXJlZ3NbbHJjX3Jp bmdfaW5kaXJlY3RfcHRyKGVuZ2luZSkgKyAxXSA9CisJCWN0eF9iYl9nZ3R0X2FkZHIgfCAoc2l6 ZSAvIENBQ0hFTElORV9CWVRFUyk7CisKKwlHRU1fQlVHX09OKGxyY19yaW5nX2luZGlyZWN0X29m ZnNldChlbmdpbmUpID09IC0xKTsKKwlyZWdzW2xyY19yaW5nX2luZGlyZWN0X29mZnNldChlbmdp bmUpICsgMV0gPQorCQlscmNfcmluZ19pbmRpcmVjdF9vZmZzZXRfZGVmYXVsdChlbmdpbmUpIDw8 IDY7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY29tbW9uX3JlZ3ModTMyICogY29uc3QgcmVncywK KwkJCSAgICAgY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAorCQkJICAgICBjb25zdCBz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCQkgICAgIGJvb2wgaW5oaWJpdCkKK3sK Kwl1MzIgY3RsOworCisJY3RsID0gX01BU0tFRF9CSVRfRU5BQkxFKENUWF9DVFJMX0lOSElCSVRf U1lOX0NUWF9TV0lUQ0gpOworCWN0bCB8PSBfTUFTS0VEX0JJVF9ESVNBQkxFKENUWF9DVFJMX0VO R0lORV9DVFhfUkVTVE9SRV9JTkhJQklUKTsKKwlpZiAoaW5oaWJpdCkKKwkJY3RsIHw9IENUWF9D VFJMX0VOR0lORV9DVFhfUkVTVE9SRV9JTkhJQklUOworCWlmIChJTlRFTF9HRU4oZW5naW5lLT5p OTE1KSA8IDExKQorCQljdGwgfD0gX01BU0tFRF9CSVRfRElTQUJMRShDVFhfQ1RSTF9FTkdJTkVf Q1RYX1NBVkVfSU5ISUJJVCB8CisJCQkJCSAgIENUWF9DVFJMX1JTX0NUWF9FTkFCTEUpOworCXJl Z3NbQ1RYX0NPTlRFWFRfQ09OVFJPTF0gPSBjdGw7CisKKwlyZWdzW0NUWF9USU1FU1RBTVBdID0g Y2UtPnJ1bnRpbWUubGFzdDsKK30KKworc3RhdGljIHZvaWQgaW5pdF93YV9iYl9yZWdzKHUzMiAq IGNvbnN0IHJlZ3MsCisJCQkgICAgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l KQoreworCWNvbnN0IHN0cnVjdCBpOTE1X2N0eF93b3JrYXJvdW5kcyAqIGNvbnN0IHdhX2N0eCA9 ICZlbmdpbmUtPndhX2N0eDsKKworCWlmICh3YV9jdHgtPnBlcl9jdHguc2l6ZSkgeworCQljb25z dCB1MzIgZ2d0dF9vZmZzZXQgPSBpOTE1X2dndHRfb2Zmc2V0KHdhX2N0eC0+dm1hKTsKKworCQlH RU1fQlVHX09OKGxyY19yaW5nX3dhX2JiX3Blcl9jdHgoZW5naW5lKSA9PSAtMSk7CisJCXJlZ3Nb bHJjX3Jpbmdfd2FfYmJfcGVyX2N0eChlbmdpbmUpICsgMV0gPQorCQkJKGdndHRfb2Zmc2V0ICsg d2FfY3R4LT5wZXJfY3R4Lm9mZnNldCkgfCAweDAxOworCX0KKworCWlmICh3YV9jdHgtPmluZGly ZWN0X2N0eC5zaXplKSB7CisJCWxyY19zZXR1cF9pbmRpcmVjdF9jdHgocmVncywgZW5naW5lLAor CQkJCSAgICAgICBpOTE1X2dndHRfb2Zmc2V0KHdhX2N0eC0+dm1hKSArCisJCQkJICAgICAgIHdh X2N0eC0+aW5kaXJlY3RfY3R4Lm9mZnNldCwKKwkJCQkgICAgICAgd2FfY3R4LT5pbmRpcmVjdF9j dHguc2l6ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X3BwZ3R0X3JlZ3ModTMyICpyZWdz LCBjb25zdCBzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQpCit7CisJaWYgKGk5MTVfdm1faXNfNGx2 bCgmcHBndHQtPnZtKSkgeworCQkvKiA2NGIgUFBHVFQgKDQ4Yml0IGNhbm9uaWNhbCkKKwkJICog UERQMF9ERVNDUklQVE9SIGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3MgdG8gUE1MNCBhbmQKKwkJ ICogb3RoZXIgUERQIERlc2NyaXB0b3JzIGFyZSBpZ25vcmVkLgorCQkgKi8KKwkJQVNTSUdOX0NU WF9QTUw0KHBwZ3R0LCByZWdzKTsKKwl9IGVsc2UgeworCQlBU1NJR05fQ1RYX1BEUChwcGd0dCwg cmVncywgMyk7CisJCUFTU0lHTl9DVFhfUERQKHBwZ3R0LCByZWdzLCAyKTsKKwkJQVNTSUdOX0NU WF9QRFAocHBndHQsIHJlZ3MsIDEpOworCQlBU1NJR05fQ1RYX1BEUChwcGd0dCwgcmVncywgMCk7 CisJfQorfQorCitzdGF0aWMgc3RydWN0IGk5MTVfcHBndHQgKnZtX2FsaWFzKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCWlmIChpOTE1X2lzX2dndHQodm0pKQorCQlyZXR1cm4g aTkxNV92bV90b19nZ3R0KHZtKS0+YWxpYXM7CisJZWxzZQorCQlyZXR1cm4gaTkxNV92bV90b19w cGd0dCh2bSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmVzZXRfc3RvcF9yaW5nKHUzMiAqcmVncywg Y29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCWludCB4OworCisJeCA9 IGxyY19yaW5nX21pX21vZGUoZW5naW5lKTsKKwlpZiAoeCAhPSAtMSkgeworCQlyZWdzW3ggKyAx XSAmPSB+U1RPUF9SSU5HOworCQlyZWdzW3ggKyAxXSB8PSBTVE9QX1JJTkcgPDwgMTY7CisJfQor fQorCitzdGF0aWMgdm9pZCBfX2xyY19pbml0X3JlZ3ModTMyICpyZWdzLAorCQkJICAgIGNvbnN0 IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUsCisJCQkgICAgYm9vbCBpbmhpYml0KQoreworCS8qCisJICogQSBjb250 ZXh0IGlzIGFjdHVhbGx5IGEgYmlnIGJhdGNoIGJ1ZmZlciB3aXRoIHNldmVyYWwKKwkgKiBNSV9M T0FEX1JFR0lTVEVSX0lNTSBjb21tYW5kcyBmb2xsb3dlZCBieSAocmVnLCB2YWx1ZSkgcGFpcnMu IFRoZQorCSAqIHZhbHVlcyB3ZSBhcmUgc2V0dGluZyBoZXJlIGFyZSBvbmx5IGZvciB0aGUgZmly c3QgY29udGV4dCByZXN0b3JlOgorCSAqIG9uIGEgc3Vic2VxdWVudCBzYXZlLCB0aGUgR1BVIHdp bGwgcmVjcmVhdGUgdGhpcyBiYXRjaGJ1ZmZlciB3aXRoIG5ldworCSAqIHZhbHVlcyAoaW5jbHVk aW5nIGFsbCB0aGUgbWlzc2luZyBNSV9MT0FEX1JFR0lTVEVSX0lNTSBjb21tYW5kcyB0aGF0CisJ ICogd2UgYXJlIG5vdCBpbml0aWFsaXppbmcgaGVyZSkuCisJICoKKwkgKiBNdXN0IGtlZXAgY29u c2lzdGVudCB3aXRoIHZpcnR1YWxfdXBkYXRlX3JlZ2lzdGVyX29mZnNldHMoKS4KKwkgKi8KKwor CWlmIChpbmhpYml0KQorCQltZW1zZXQocmVncywgMCwgZW5naW5lLT5jb250ZXh0X3NpemUgLSBQ QUdFX1NJWkUpOworCisJc2V0X29mZnNldHMocmVncywgcmVnX29mZnNldHMoZW5naW5lKSwgZW5n aW5lLCBpbmhpYml0KTsKKworCWluaXRfY29tbW9uX3JlZ3MocmVncywgY2UsIGVuZ2luZSwgaW5o aWJpdCk7CisJaW5pdF9wcGd0dF9yZWdzKHJlZ3MsIHZtX2FsaWFzKGNlLT52bSkpOworCisJaW5p dF93YV9iYl9yZWdzKHJlZ3MsIGVuZ2luZSk7CisKKwlfX3Jlc2V0X3N0b3BfcmluZyhyZWdzLCBl bmdpbmUpOworfQorCit2b2lkIGxyY19pbml0X3JlZ3MoY29uc3Qgc3RydWN0IGludGVsX2NvbnRl eHQgKmNlLAorCQkgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCSAg IGJvb2wgaW5oaWJpdCkKK3sKKwlfX2xyY19pbml0X3JlZ3MoY2UtPmxyY19yZWdfc3RhdGUsIGNl LCBlbmdpbmUsIGluaGliaXQpOworfQorCit2b2lkIGxyY19yZXNldF9yZWdzKGNvbnN0IHN0cnVj dCBpbnRlbF9jb250ZXh0ICpjZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSkKK3sKKwlfX3Jlc2V0X3N0b3BfcmluZyhjZS0+bHJjX3JlZ19zdGF0ZSwgZW5naW5l KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9yZWR6b25lKHZvaWQgKnZhZGRyLCBjb25zdCBzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19E Uk1fSTkxNV9ERUJVR19HRU0pKQorCQlyZXR1cm47CisKKwl2YWRkciArPSBlbmdpbmUtPmNvbnRl eHRfc2l6ZTsKKworCW1lbXNldCh2YWRkciwgQ09OVEVYVF9SRURaT05FLCBJOTE1X0dUVF9QQUdF X1NJWkUpOworfQorCitzdGF0aWMgdm9pZAorY2hlY2tfcmVkem9uZShjb25zdCB2b2lkICp2YWRk ciwgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCWlmICghSVNfRU5B QkxFRChDT05GSUdfRFJNX0k5MTVfREVCVUdfR0VNKSkKKwkJcmV0dXJuOworCisJdmFkZHIgKz0g ZW5naW5lLT5jb250ZXh0X3NpemU7CisKKwlpZiAobWVtY2hyX2ludih2YWRkciwgQ09OVEVYVF9S RURaT05FLCBJOTE1X0dUVF9QQUdFX1NJWkUpKQorCQlkcm1fZXJyX29uY2UoJmVuZ2luZS0+aTkx NS0+ZHJtLAorCQkJICAgICAiJXMgY29udGV4dCByZWR6b25lIG92ZXJ3cml0dGVuIVxuIiwKKwkJ CSAgICAgZW5naW5lLT5uYW1lKTsKK30KKwordm9pZCBscmNfaW5pdF9zdGF0ZShzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqY2UsCisJCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJ CSAgICB2b2lkICpzdGF0ZSkKK3sKKwlib29sIGluaGliaXQgPSB0cnVlOworCisJc2V0X3JlZHpv bmUoc3RhdGUsIGVuZ2luZSk7CisKKwlpZiAoZW5naW5lLT5kZWZhdWx0X3N0YXRlKSB7CisJCXNo bWVtX3JlYWQoZW5naW5lLT5kZWZhdWx0X3N0YXRlLCAwLAorCQkJICAgc3RhdGUsIGVuZ2luZS0+ Y29udGV4dF9zaXplKTsKKwkJX19zZXRfYml0KENPTlRFWFRfVkFMSURfQklULCAmY2UtPmZsYWdz KTsKKwkJaW5oaWJpdCA9IGZhbHNlOworCX0KKworCS8qIENsZWFyIHRoZSBwcEhXU1AgKGluYy4g cGVyLWNvbnRleHQgY291bnRlcnMpICovCisJbWVtc2V0KHN0YXRlLCAwLCBQQUdFX1NJWkUpOwor CisJLyoKKwkgKiBUaGUgc2Vjb25kIHBhZ2Ugb2YgdGhlIGNvbnRleHQgb2JqZWN0IGNvbnRhaW5z IHNvbWUgcmVnaXN0ZXJzIHdoaWNoCisJICogbXVzdCBiZSBzZXQgdXAgcHJpb3IgdG8gdGhlIGZp cnN0IGV4ZWN1dGlvbi4KKwkgKi8KKwlfX2xyY19pbml0X3JlZ3Moc3RhdGUgKyBMUkNfU1RBVEVf T0ZGU0VULCBjZSwgZW5naW5lLCBpbmhpYml0KTsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X3Zt YSAqCitfX2xyY19hbGxvY19zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHN0cnVjdCBp bnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXUzMiBjb250ZXh0X3NpemU7CisKKwljb250 ZXh0X3NpemUgPSByb3VuZF91cChlbmdpbmUtPmNvbnRleHRfc2l6ZSwgSTkxNV9HVFRfUEFHRV9T SVpFKTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9ERUJVR19HRU0pKQorCQlj b250ZXh0X3NpemUgKz0gSTkxNV9HVFRfUEFHRV9TSVpFOyAvKiBmb3IgcmVkem9uZSAqLworCisJ aWYgKElOVEVMX0dFTihlbmdpbmUtPmk5MTUpID09IDEyKSB7CisJCWNlLT53YV9iYl9wYWdlID0g Y29udGV4dF9zaXplIC8gUEFHRV9TSVpFOworCQljb250ZXh0X3NpemUgKz0gUEFHRV9TSVpFOwor CX0KKworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc2htZW0oZW5naW5lLT5pOTE1LCBj b250ZXh0X3NpemUpOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJuIEVSUl9DQVNUKG9iaik7 CisKKwl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZlbmdpbmUtPmd0LT5nZ3R0LT52bSwg TlVMTCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsK KwkJcmV0dXJuIHZtYTsKKwl9CisKKwlyZXR1cm4gdm1hOworfQorCitzdGF0aWMgc3RydWN0IGlu dGVsX3RpbWVsaW5lICoKK3Bpbm5lZF90aW1lbGluZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Us IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfdGltZWxp bmUgKnRsID0gZmV0Y2hfYW5kX3plcm8oJmNlLT50aW1lbGluZSk7CisKKwlyZXR1cm4gaW50ZWxf dGltZWxpbmVfY3JlYXRlX2Zyb21fZW5naW5lKGVuZ2luZSwgcGFnZV91bm1hc2tfYml0cyh0bCkp OworfQorCitpbnQgbHJjX2FsbG9jKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwgc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBpbnRlbF9yaW5nICpyaW5nOworCXN0 cnVjdCBpOTE1X3ZtYSAqdm1hOworCWludCBlcnI7CisKKwlHRU1fQlVHX09OKGNlLT5zdGF0ZSk7 CisKKwl2bWEgPSBfX2xyY19hbGxvY19zdGF0ZShjZSwgZW5naW5lKTsKKwlpZiAoSVNfRVJSKHZt YSkpCisJCXJldHVybiBQVFJfRVJSKHZtYSk7CisKKwlyaW5nID0gaW50ZWxfZW5naW5lX2NyZWF0 ZV9yaW5nKGVuZ2luZSwgKHVuc2lnbmVkIGxvbmcpY2UtPnJpbmcpOworCWlmIChJU19FUlIocmlu ZykpIHsKKwkJZXJyID0gUFRSX0VSUihyaW5nKTsKKwkJZ290byBlcnJfdm1hOworCX0KKworCWlm ICghcGFnZV9tYXNrX2JpdHMoY2UtPnRpbWVsaW5lKSkgeworCQlzdHJ1Y3QgaW50ZWxfdGltZWxp bmUgKnRsOworCisJCS8qCisJCSAqIFVzZSB0aGUgc3RhdGljIGdsb2JhbCBIV1NQIGZvciB0aGUg a2VybmVsIGNvbnRleHQsIGFuZAorCQkgKiBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjYWNoZWxp bmUgZm9yIGV2ZXJ5b25lIGVsc2UuCisJCSAqLworCQlpZiAodW5saWtlbHkoY2UtPnRpbWVsaW5l KSkKKwkJCXRsID0gcGlubmVkX3RpbWVsaW5lKGNlLCBlbmdpbmUpOworCQllbHNlCisJCQl0bCA9 IGludGVsX3RpbWVsaW5lX2NyZWF0ZShlbmdpbmUtPmd0KTsKKwkJaWYgKElTX0VSUih0bCkpIHsK KwkJCWVyciA9IFBUUl9FUlIodGwpOworCQkJZ290byBlcnJfcmluZzsKKwkJfQorCisJCWNlLT50 aW1lbGluZSA9IHRsOworCX0KKworCWNlLT5yaW5nID0gcmluZzsKKwljZS0+c3RhdGUgPSB2bWE7 CisKKwlyZXR1cm4gMDsKKworZXJyX3Jpbmc6CisJaW50ZWxfcmluZ19wdXQocmluZyk7CitlcnJf dm1hOgorCWk5MTVfdm1hX3B1dCh2bWEpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbHJjX3Jl c2V0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKK3sKKwlDRV9UUkFDRShjZSwgInJlc2V0XG4i KTsKKwlHRU1fQlVHX09OKCFpbnRlbF9jb250ZXh0X2lzX3Bpbm5lZChjZSkpOworCisJaW50ZWxf cmluZ19yZXNldChjZS0+cmluZywgY2UtPnJpbmctPmVtaXQpOworCisJLyogU2NydWIgYXdheSB0 aGUgZ2FyYmFnZSAqLworCWxyY19pbml0X3JlZ3MoY2UsIGNlLT5lbmdpbmUsIHRydWUpOworCWNl LT5scmMubHJjYSA9IGxyY191cGRhdGVfcmVncyhjZSwgY2UtPmVuZ2luZSwgY2UtPnJpbmctPnRh aWwpOworfQorCitpbnQKK2xyY19wcmVfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwkg ICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAorCSAgICBzdHJ1Y3QgaTkxNV9nZW1f d3dfY3R4ICp3dywKKwkgICAgdm9pZCAqKnZhZGRyKQoreworCUdFTV9CVUdfT04oIWNlLT5zdGF0 ZSk7CisJR0VNX0JVR19PTighaTkxNV92bWFfaXNfcGlubmVkKGNlLT5zdGF0ZSkpOworCisJKnZh ZGRyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAoY2UtPnN0YXRlLT5vYmosCisJCQkJCSBpOTE1 X2NvaGVyZW50X21hcF90eXBlKGNlLT5lbmdpbmUtPmk5MTUpIHwKKwkJCQkJIEk5MTVfTUFQX09W RVJSSURFKTsKKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oKnZhZGRyKTsKK30KKworaW50Cits cmNfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz ICplbmdpbmUsCisJdm9pZCAqdmFkZHIpCit7CisJY2UtPmxyY19yZWdfc3RhdGUgPSB2YWRkciAr IExSQ19TVEFURV9PRkZTRVQ7CisJY2UtPmxyYy5scmNhID0gbHJjX3VwZGF0ZV9yZWdzKGNlLCBl bmdpbmUsIGNlLT5yaW5nLT50YWlsKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBscmNfdW5waW4o c3RydWN0IGludGVsX2NvbnRleHQgKmNlKQoreworCWNoZWNrX3JlZHpvbmUoKHZvaWQgKiljZS0+ bHJjX3JlZ19zdGF0ZSAtIExSQ19TVEFURV9PRkZTRVQsCisJCSAgICAgIGNlLT5lbmdpbmUpOwor fQorCit2b2lkIGxyY19wb3N0X3VucGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKK3sKKwlp OTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKGNlLT5zdGF0ZS0+b2JqKTsKK30KKwordm9pZCBscmNf ZmluaShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCit7CisJaWYgKCFjZS0+c3RhdGUpCisJCXJl dHVybjsKKworCWludGVsX3JpbmdfcHV0KGZldGNoX2FuZF96ZXJvKCZjZS0+cmluZykpOworCWk5 MTVfdm1hX3B1dChmZXRjaF9hbmRfemVybygmY2UtPnN0YXRlKSk7Cit9CisKK3ZvaWQgbHJjX2Rl c3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmNlID0g Y29udGFpbmVyX29mKGtyZWYsIHR5cGVvZigqY2UpLCByZWYpOworCisJR0VNX0JVR19PTighaTkx NV9hY3RpdmVfaXNfaWRsZSgmY2UtPmFjdGl2ZSkpOworCUdFTV9CVUdfT04oaW50ZWxfY29udGV4 dF9pc19waW5uZWQoY2UpKTsKKworCWxyY19maW5pKGNlKTsKKworCWludGVsX2NvbnRleHRfZmlu aShjZSk7CisJaW50ZWxfY29udGV4dF9mcmVlKGNlKTsKK30KKworc3RhdGljIHUzMiAqCitnZW4x Ml9lbWl0X3RpbWVzdGFtcF93YShjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHUzMiAq Y3MpCit7CisJKmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX01FTV9HRU44IHwKKwkJTUlfU1JNX0xS TV9HTE9CQUxfR1RUIHwKKwkJTUlfTFJJX0xSTV9DU19NTUlPOworCSpjcysrID0gaTkxNV9tbWlv X3JlZ19vZmZzZXQoR0VOOF9SSU5HX0NTX0dQUigwLCAwKSk7CisJKmNzKysgPSBpOTE1X2dndHRf b2Zmc2V0KGNlLT5zdGF0ZSkgKyBMUkNfU1RBVEVfT0ZGU0VUICsKKwkJQ1RYX1RJTUVTVEFNUCAq IHNpemVvZih1MzIpOworCSpjcysrID0gMDsKKworCSpjcysrID0gTUlfTE9BRF9SRUdJU1RFUl9S RUcgfAorCQlNSV9MUlJfU09VUkNFX0NTX01NSU8gfAorCQlNSV9MUklfTFJNX0NTX01NSU87CisJ KmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldChHRU44X1JJTkdfQ1NfR1BSKDAsIDApKTsKKwkq Y3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ1RYX1RJTUVTVEFNUCgwKSk7CisKKwkq Y3MrKyA9IE1JX0xPQURfUkVHSVNURVJfUkVHIHwKKwkJTUlfTFJSX1NPVVJDRV9DU19NTUlPIHwK KwkJTUlfTFJJX0xSTV9DU19NTUlPOworCSpjcysrID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQoR0VO OF9SSU5HX0NTX0dQUigwLCAwKSk7CisJKmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldChSSU5H X0NUWF9USU1FU1RBTVAoMCkpOworCisJcmV0dXJuIGNzOworfQorCitzdGF0aWMgdTMyICoKK2dl bjEyX2VtaXRfcmVzdG9yZV9zY3JhdGNoKGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwg dTMyICpjcykKK3sKKwlHRU1fQlVHX09OKGxyY19yaW5nX2dwcjAoY2UtPmVuZ2luZSkgPT0gLTEp OworCisJKmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX01FTV9HRU44IHwKKwkJTUlfU1JNX0xSTV9H TE9CQUxfR1RUIHwKKwkJTUlfTFJJX0xSTV9DU19NTUlPOworCSpjcysrID0gaTkxNV9tbWlvX3Jl Z19vZmZzZXQoR0VOOF9SSU5HX0NTX0dQUigwLCAwKSk7CisJKmNzKysgPSBpOTE1X2dndHRfb2Zm c2V0KGNlLT5zdGF0ZSkgKyBMUkNfU1RBVEVfT0ZGU0VUICsKKwkJKGxyY19yaW5nX2dwcjAoY2Ut PmVuZ2luZSkgKyAxKSAqIHNpemVvZih1MzIpOworCSpjcysrID0gMDsKKworCXJldHVybiBjczsK K30KKworc3RhdGljIHUzMiAqCitnZW4xMl9lbWl0X2NtZF9idWZfd2EoY29uc3Qgc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQoreworCUdFTV9CVUdfT04obHJjX3JpbmdfY21kX2J1 Zl9jY3RsKGNlLT5lbmdpbmUpID09IC0xKTsKKworCSpjcysrID0gTUlfTE9BRF9SRUdJU1RFUl9N RU1fR0VOOCB8CisJCU1JX1NSTV9MUk1fR0xPQkFMX0dUVCB8CisJCU1JX0xSSV9MUk1fQ1NfTU1J TzsKKwkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KEdFTjhfUklOR19DU19HUFIoMCwgMCkp OworCSpjcysrID0gaTkxNV9nZ3R0X29mZnNldChjZS0+c3RhdGUpICsgTFJDX1NUQVRFX09GRlNF VCArCisJCShscmNfcmluZ19jbWRfYnVmX2NjdGwoY2UtPmVuZ2luZSkgKyAxKSAqIHNpemVvZih1 MzIpOworCSpjcysrID0gMDsKKworCSpjcysrID0gTUlfTE9BRF9SRUdJU1RFUl9SRUcgfAorCQlN SV9MUlJfU09VUkNFX0NTX01NSU8gfAorCQlNSV9MUklfTFJNX0NTX01NSU87CisJKmNzKysgPSBp OTE1X21taW9fcmVnX29mZnNldChHRU44X1JJTkdfQ1NfR1BSKDAsIDApKTsKKwkqY3MrKyA9IGk5 MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ01EX0JVRl9DQ1RMKDApKTsKKworCXJldHVybiBjczsK K30KKworc3RhdGljIHUzMiAqCitnZW4xMl9lbWl0X2luZGlyZWN0X2N0eF9yY3MoY29uc3Qgc3Ry dWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQoreworCWNzID0gZ2VuMTJfZW1pdF90aW1l c3RhbXBfd2EoY2UsIGNzKTsKKwljcyA9IGdlbjEyX2VtaXRfY21kX2J1Zl93YShjZSwgY3MpOwor CWNzID0gZ2VuMTJfZW1pdF9yZXN0b3JlX3NjcmF0Y2goY2UsIGNzKTsKKworCXJldHVybiBjczsK K30KKworc3RhdGljIHUzMiAqCitnZW4xMl9lbWl0X2luZGlyZWN0X2N0eF94Y3MoY29uc3Qgc3Ry dWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgKmNzKQoreworCWNzID0gZ2VuMTJfZW1pdF90aW1l c3RhbXBfd2EoY2UsIGNzKTsKKwljcyA9IGdlbjEyX2VtaXRfcmVzdG9yZV9zY3JhdGNoKGNlLCBj cyk7CisKKwlyZXR1cm4gY3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNvbnRleHRfd2FfYmJf b2Zmc2V0KGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKK3sKKwlyZXR1cm4gUEFHRV9T SVpFICogY2UtPndhX2JiX3BhZ2U7Cit9CisKK3N0YXRpYyB1MzIgKmNvbnRleHRfaW5kaXJlY3Rf YmIoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQoreworCXZvaWQgKnB0cjsKKworCUdF TV9CVUdfT04oIWNlLT53YV9iYl9wYWdlKTsKKworCXB0ciA9IGNlLT5scmNfcmVnX3N0YXRlOwor CXB0ciAtPSBMUkNfU1RBVEVfT0ZGU0VUOyAvKiBiYWNrIHRvIHN0YXJ0IG9mIGNvbnRleHQgaW1h Z2UgKi8KKwlwdHIgKz0gY29udGV4dF93YV9iYl9vZmZzZXQoY2UpOworCisJcmV0dXJuIHB0cjsK K30KKworc3RhdGljIHZvaWQKK3NldHVwX2luZGlyZWN0X2N0eF9iYihjb25zdCBzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqY2UsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSwKKwkJICAgICAgdTMyICooKmVtaXQpKGNvbnN0IHN0cnVjdCBpbnRlbF9jb250ZXh0ICos IHUzMiAqKSkKK3sKKwl1MzIgKiBjb25zdCBzdGFydCA9IGNvbnRleHRfaW5kaXJlY3RfYmIoY2Up OworCXUzMiAqY3M7CisKKwljcyA9IGVtaXQoY2UsIHN0YXJ0KTsKKwlHRU1fQlVHX09OKGNzIC0g c3RhcnQgPiBJOTE1X0dUVF9QQUdFX1NJWkUgLyBzaXplb2YoKmNzKSk7CisJd2hpbGUgKCh1bnNp Z25lZCBsb25nKWNzICUgQ0FDSEVMSU5FX0JZVEVTKQorCQkqY3MrKyA9IE1JX05PT1A7CisKKwls cmNfc2V0dXBfaW5kaXJlY3RfY3R4KGNlLT5scmNfcmVnX3N0YXRlLCBlbmdpbmUsCisJCQkgICAg ICAgaTkxNV9nZ3R0X29mZnNldChjZS0+c3RhdGUpICsKKwkJCSAgICAgICBjb250ZXh0X3dhX2Ji X29mZnNldChjZSksCisJCQkgICAgICAgKGNzIC0gc3RhcnQpICogc2l6ZW9mKCpjcykpOworfQor CisvKgorICogVGhlIGNvbnRleHQgZGVzY3JpcHRvciBlbmNvZGVzIHZhcmlvdXMgYXR0cmlidXRl cyBvZiBhIGNvbnRleHQsCisgKiBpbmNsdWRpbmcgaXRzIEdUVCBhZGRyZXNzIGFuZCBzb21lIGZs YWdzLiBCZWNhdXNlIGl0J3MgZmFpcmx5CisgKiBleHBlbnNpdmUgdG8gY2FsY3VsYXRlLCB3ZSds bCBqdXN0IGRvIGl0IG9uY2UgYW5kIGNhY2hlIHRoZSByZXN1bHQsCisgKiB3aGljaCByZW1haW5z IHZhbGlkIHVudGlsIHRoZSBjb250ZXh0IGlzIHVucGlubmVkLgorICoKKyAqIFRoaXMgaXMgd2hh dCBhIGRlc2NyaXB0b3IgbG9va3MgbGlrZSwgZnJvbSBMU0IgdG8gTVNCOjoKKyAqCisgKiAgICAg IGJpdHMgIDAtMTE6ICAgIGZsYWdzLCBHRU44X0NUWF8qIChjYWNoZWQgaW4gY3R4LT5kZXNjX3Rl bXBsYXRlKQorICogICAgICBiaXRzIDEyLTMxOiAgICBMUkNBLCBHVFQgYWRkcmVzcyBvZiAodGhl IEhXU1Agb2YpIHRoaXMgY29udGV4dAorICogICAgICBiaXRzIDMyLTUyOiAgICBjdHggSUQsIGEg Z2xvYmFsbHkgdW5pcXVlIHRhZyAoaGlnaGVzdCBiaXQgdXNlZCBieSBHdUMpCisgKiAgICAgIGJp dHMgNTMtNTQ6ICAgIG1ieiwgcmVzZXJ2ZWQgZm9yIHVzZSBieSBoYXJkd2FyZQorICogICAgICBi aXRzIDU1LTYzOiAgICBncm91cCBJRCwgY3VycmVudGx5IHVudXNlZCBhbmQgc2V0IHRvIDAKKyAq CisgKiBTdGFydGluZyBmcm9tIEdlbjExLCB0aGUgdXBwZXIgZHdvcmQgb2YgdGhlIGRlc2NyaXB0 b3IgaGFzIGEgbmV3IGZvcm1hdDoKKyAqCisgKiAgICAgIGJpdHMgMzItMzY6ICAgIHJlc2VydmVk CisgKiAgICAgIGJpdHMgMzctNDc6ICAgIFNXIGNvbnRleHQgSUQKKyAqICAgICAgYml0cyA0ODo1 MzogICAgZW5naW5lIGluc3RhbmNlCisgKiAgICAgIGJpdCA1NDogICAgICAgIG1ieiwgcmVzZXJ2 ZWQgZm9yIHVzZSBieSBoYXJkd2FyZQorICogICAgICBiaXRzIDU1LTYwOiAgICBTVyBjb3VudGVy CisgKiAgICAgIGJpdHMgNjEtNjM6ICAgIGVuZ2luZSBjbGFzcworICoKKyAqIGVuZ2luZSBpbmZv LCBTVyBjb250ZXh0IElEIGFuZCBTVyBjb3VudGVyIG5lZWQgdG8gZm9ybSBhIHVuaXF1ZSBudW1i ZXIKKyAqIChDb250ZXh0IElEKSBwZXIgbHJjLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBscmNf ZGVzY3JpcHRvcihjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCit7CisJdTMyIGRlc2M7 CisKKwlkZXNjID0gSU5URUxfTEVHQUNZXzMyQl9DT05URVhUOworCWlmIChpOTE1X3ZtX2lzXzRs dmwoY2UtPnZtKSkKKwkJZGVzYyA9IElOVEVMX0xFR0FDWV82NEJfQ09OVEVYVDsKKwlkZXNjIDw8 PSBHRU44X0NUWF9BRERSRVNTSU5HX01PREVfU0hJRlQ7CisKKwlkZXNjIHw9IEdFTjhfQ1RYX1ZB TElEIHwgR0VOOF9DVFhfUFJJVklMRUdFOworCWlmIChJU19HRU4oY2UtPnZtLT5pOTE1LCA4KSkK KwkJZGVzYyB8PSBHRU44X0NUWF9MM0xMQ19DT0hFUkVOVDsKKworCXJldHVybiBpOTE1X2dndHRf b2Zmc2V0KGNlLT5zdGF0ZSkgfCBkZXNjOworfQorCit1MzIgbHJjX3VwZGF0ZV9yZWdzKGNvbnN0 IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSwKKwkJICAgIHUzMiBoZWFkKQoreworCXN0cnVjdCBpbnRlbF9yaW5nICpy aW5nID0gY2UtPnJpbmc7CisJdTMyICpyZWdzID0gY2UtPmxyY19yZWdfc3RhdGU7CisKKwlHRU1f QlVHX09OKCFpbnRlbF9yaW5nX29mZnNldF92YWxpZChyaW5nLCBoZWFkKSk7CisJR0VNX0JVR19P TighaW50ZWxfcmluZ19vZmZzZXRfdmFsaWQocmluZywgcmluZy0+dGFpbCkpOworCisJcmVnc1tD VFhfUklOR19TVEFSVF0gPSBpOTE1X2dndHRfb2Zmc2V0KHJpbmctPnZtYSk7CisJcmVnc1tDVFhf UklOR19IRUFEXSA9IGhlYWQ7CisJcmVnc1tDVFhfUklOR19UQUlMXSA9IHJpbmctPnRhaWw7CisJ cmVnc1tDVFhfUklOR19DVExdID0gUklOR19DVExfU0laRShyaW5nLT5zaXplKSB8IFJJTkdfVkFM SUQ7CisKKwkvKiBSUENTICovCisJaWYgKGVuZ2luZS0+Y2xhc3MgPT0gUkVOREVSX0NMQVNTKSB7 CisJCXJlZ3NbQ1RYX1JfUFdSX0NMS19TVEFURV0gPQorCQkJaW50ZWxfc3NldV9tYWtlX3JwY3Mo ZW5naW5lLT5ndCwgJmNlLT5zc2V1KTsKKworCQlpOTE1X29hX2luaXRfcmVnX3N0YXRlKGNlLCBl bmdpbmUpOworCX0KKworCWlmIChjZS0+d2FfYmJfcGFnZSkgeworCQl1MzIgKigqZm4pKGNvbnN0 IHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwgdTMyICpjcyk7CisKKwkJZm4gPSBnZW4xMl9lbWl0 X2luZGlyZWN0X2N0eF94Y3M7CisJCWlmIChjZS0+ZW5naW5lLT5jbGFzcyA9PSBSRU5ERVJfQ0xB U1MpCisJCQlmbiA9IGdlbjEyX2VtaXRfaW5kaXJlY3RfY3R4X3JjczsKKworCQkvKiBNdXR1YWxs eSBleGNsdXNpdmUgd3J0IHRvIGdsb2JhbCBpbmRpcmVjdCBiYiAqLworCQlHRU1fQlVHX09OKGVu Z2luZS0+d2FfY3R4LmluZGlyZWN0X2N0eC5zaXplKTsKKwkJc2V0dXBfaW5kaXJlY3RfY3R4X2Ji KGNlLCBlbmdpbmUsIGZuKTsKKwl9CisKKwlyZXR1cm4gbHJjX2Rlc2NyaXB0b3IoY2UpIHwgQ1RY X0RFU0NfRk9SQ0VfUkVTVE9SRTsKK30KKwordm9pZCBscmNfdXBkYXRlX29mZnNldHMoc3RydWN0 IGludGVsX2NvbnRleHQgKmNlLAorCQkJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQor eworCXNldF9vZmZzZXRzKGNlLT5scmNfcmVnX3N0YXRlLCByZWdfb2Zmc2V0cyhlbmdpbmUpLCBl bmdpbmUsIGZhbHNlKTsKK30KKwordm9pZCBscmNfY2hlY2tfcmVncyhjb25zdCBzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqY2UsCisJCSAgICBjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUsCisJCSAgICBjb25zdCBjaGFyICp3aGVuKQoreworCWNvbnN0IHN0cnVjdCBpbnRlbF9yaW5n ICpyaW5nID0gY2UtPnJpbmc7CisJdTMyICpyZWdzID0gY2UtPmxyY19yZWdfc3RhdGU7CisJYm9v bCB2YWxpZCA9IHRydWU7CisJaW50IHg7CisKKwlpZiAocmVnc1tDVFhfUklOR19TVEFSVF0gIT0g aTkxNV9nZ3R0X29mZnNldChyaW5nLT52bWEpKSB7CisJCXByX2VycigiJXM6IGNvbnRleHQgc3Vi bWl0dGVkIHdpdGggaW5jb3JyZWN0IFJJTkdfU1RBUlQgWyUwOHhdLCBleHBlY3RlZCAlMDh4XG4i LAorCQkgICAgICAgZW5naW5lLT5uYW1lLAorCQkgICAgICAgcmVnc1tDVFhfUklOR19TVEFSVF0s CisJCSAgICAgICBpOTE1X2dndHRfb2Zmc2V0KHJpbmctPnZtYSkpOworCQlyZWdzW0NUWF9SSU5H X1NUQVJUXSA9IGk5MTVfZ2d0dF9vZmZzZXQocmluZy0+dm1hKTsKKwkJdmFsaWQgPSBmYWxzZTsK Kwl9CisKKwlpZiAoKHJlZ3NbQ1RYX1JJTkdfQ1RMXSAmIH4oUklOR19XQUlUIHwgUklOR19XQUlU X1NFTUFQSE9SRSkpICE9CisJICAgIChSSU5HX0NUTF9TSVpFKHJpbmctPnNpemUpIHwgUklOR19W QUxJRCkpIHsKKwkJcHJfZXJyKCIlczogY29udGV4dCBzdWJtaXR0ZWQgd2l0aCBpbmNvcnJlY3Qg UklOR19DVEwgWyUwOHhdLCBleHBlY3RlZCAlMDh4XG4iLAorCQkgICAgICAgZW5naW5lLT5uYW1l LAorCQkgICAgICAgcmVnc1tDVFhfUklOR19DVExdLAorCQkgICAgICAgKHUzMikoUklOR19DVExf U0laRShyaW5nLT5zaXplKSB8IFJJTkdfVkFMSUQpKTsKKwkJcmVnc1tDVFhfUklOR19DVExdID0g UklOR19DVExfU0laRShyaW5nLT5zaXplKSB8IFJJTkdfVkFMSUQ7CisJCXZhbGlkID0gZmFsc2U7 CisJfQorCisJeCA9IGxyY19yaW5nX21pX21vZGUoZW5naW5lKTsKKwlpZiAoeCAhPSAtMSAmJiBy ZWdzW3ggKyAxXSAmIChyZWdzW3ggKyAxXSA+PiAxNikgJiBTVE9QX1JJTkcpIHsKKwkJcHJfZXJy KCIlczogY29udGV4dCBzdWJtaXR0ZWQgd2l0aCBTVE9QX1JJTkcgWyUwOHhdIGluIFJJTkdfTUlf TU9ERVxuIiwKKwkJICAgICAgIGVuZ2luZS0+bmFtZSwgcmVnc1t4ICsgMV0pOworCQlyZWdzW3gg KyAxXSAmPSB+U1RPUF9SSU5HOworCQlyZWdzW3ggKyAxXSB8PSBTVE9QX1JJTkcgPDwgMTY7CisJ CXZhbGlkID0gZmFsc2U7CisJfQorCisJV0FSTl9PTkNFKCF2YWxpZCwgIkludmFsaWQgbHJjIHN0 YXRlIGZvdW5kICVzIHN1Ym1pc3Npb25cbiIsIHdoZW4pOworfQorCisvKgorICogSW4gdGhpcyBX QSB3ZSBuZWVkIHRvIHNldCBHRU44X0wzU1FDUkVHNFsyMToyMV0gYW5kIHJlc2V0IGl0IGFmdGVy CisgKiBQSVBFX0NPTlRST0wgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBm bHVzaCB0byBoYXBwZW4gY29ycmVjdGx5CisgKiBidXQgdGhlcmUgaXMgYSBzbGlnaHQgY29tcGxp Y2F0aW9uIGFzIHRoaXMgaXMgYXBwbGllZCBpbiBXQSBiYXRjaCB3aGVyZSB0aGUKKyAqIHZhbHVl cyBhcmUgb25seSBpbml0aWFsaXplZCBvbmNlIHNvIHdlIGNhbm5vdCB0YWtlIHJlZ2lzdGVyIHZh bHVlIGF0IHRoZQorICogYmVnaW5uaW5nIGFuZCByZXVzZSBpdCBmdXJ0aGVyOyBoZW5jZSB3ZSBz YXZlIGl0cyB2YWx1ZSB0byBtZW1vcnksIHVwbG9hZCBhCisgKiBjb25zdGFudCB2YWx1ZSB3aXRo IGJpdDIxIHNldCBhbmQgdGhlbiB3ZSByZXN0b3JlIGl0IGJhY2sgd2l0aCB0aGUgc2F2ZWQgdmFs dWUuCisgKiBUbyBzaW1wbGlmeSB0aGUgV0EsIGEgY29uc3RhbnQgdmFsdWUgaXMgZm9ybWVkIGJ5 IHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlCisgKiBvZiB0aGlzIHJlZ2lzdGVyLiBUaGlzIHNob3Vs ZG4ndCBiZSBhIHByb2JsZW0gYmVjYXVzZSB3ZSBhcmUgb25seSBtb2RpZnlpbmcKKyAqIGl0IGZv ciBhIHNob3J0IHBlcmlvZCBhbmQgdGhpcyBiYXRjaCBpbiBub24tcHJlbXB0aWJsZS4gV2UgY2Fu IG9mY291cnNlCisgKiB1c2UgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIHRoZSBh Y3R1YWwgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyCisgKiBhdCB0aGF0IHRpbWUgYW5kIHNldCBvdXIg Yml0IG9mIGludGVyZXN0IGJ1dCBpdCBtYWtlcyB0aGUgV0EgY29tcGxpY2F0ZWQuCisgKgorICog VGhpcyBXQSBpcyBhbHNvIHJlcXVpcmVkIGZvciBHZW45IHNvIGV4dHJhY3RpbmcgYXMgYSBmdW5j dGlvbiBhdm9pZHMKKyAqIGNvZGUgZHVwbGljYXRpb24uCisgKi8KK3N0YXRpYyB1MzIgKgorZ2Vu OF9lbWl0X2ZsdXNoX2NvaGVyZW50bDNfd2Eoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l LCB1MzIgKmJhdGNoKQoreworCS8qIE5CIG5vIG9uZSBlbHNlIGlzIGFsbG93ZWQgdG8gc2NyaWJi bGUgb3ZlciBzY3JhdGNoICsgMjU2ISAqLworCSpiYXRjaCsrID0gTUlfU1RPUkVfUkVHSVNURVJf TUVNX0dFTjggfCBNSV9TUk1fTFJNX0dMT0JBTF9HVFQ7CisJKmJhdGNoKysgPSBpOTE1X21taW9f cmVnX29mZnNldChHRU44X0wzU1FDUkVHNCk7CisJKmJhdGNoKysgPSBpbnRlbF9ndF9zY3JhdGNo X29mZnNldChlbmdpbmUtPmd0LAorCQkJCQkgICBJTlRFTF9HVF9TQ1JBVENIX0ZJRUxEX0NPSEVS RU5UTDNfV0EpOworCSpiYXRjaCsrID0gMDsKKworCSpiYXRjaCsrID0gTUlfTE9BRF9SRUdJU1RF Ul9JTU0oMSk7CisJKmJhdGNoKysgPSBpOTE1X21taW9fcmVnX29mZnNldChHRU44X0wzU1FDUkVH NCk7CisJKmJhdGNoKysgPSAweDQwNDAwMDAwIHwgR0VOOF9MUVNDX0ZMVVNIX0NPSEVSRU5UX0xJ TkVTOworCisJYmF0Y2ggPSBnZW44X2VtaXRfcGlwZV9jb250cm9sKGJhdGNoLAorCQkJCSAgICAg ICBQSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAorCQkJCSAgICAgICBQSVBFX0NPTlRST0xfRENfRkxV U0hfRU5BQkxFLAorCQkJCSAgICAgICAwKTsKKworCSpiYXRjaCsrID0gTUlfTE9BRF9SRUdJU1RF Ul9NRU1fR0VOOCB8IE1JX1NSTV9MUk1fR0xPQkFMX0dUVDsKKwkqYmF0Y2grKyA9IGk5MTVfbW1p b19yZWdfb2Zmc2V0KEdFTjhfTDNTUUNSRUc0KTsKKwkqYmF0Y2grKyA9IGludGVsX2d0X3NjcmF0 Y2hfb2Zmc2V0KGVuZ2luZS0+Z3QsCisJCQkJCSAgIElOVEVMX0dUX1NDUkFUQ0hfRklFTERfQ09I RVJFTlRMM19XQSk7CisJKmJhdGNoKysgPSAwOworCisJcmV0dXJuIGJhdGNoOworfQorCisvKgor ICogVHlwaWNhbGx5IHdlIG9ubHkgaGF2ZSBvbmUgaW5kaXJlY3RfY3R4IGFuZCBwZXJfY3R4IGJh dGNoIGJ1ZmZlciB3aGljaCBhcmUKKyAqIGluaXRpYWxpemVkIGF0IHRoZSBiZWdpbm5pbmcgYW5k IHNoYXJlZCBhY3Jvc3MgYWxsIGNvbnRleHRzIGJ1dCB0aGlzIGZpZWxkCisgKiBoZWxwcyB1cyB0 byBoYXZlIG11bHRpcGxlIGJhdGNoZXMgYXQgZGlmZmVyZW50IG9mZnNldHMgYW5kIHNlbGVjdCB0 aGVtIGJhc2VkCisgKiBvbiBhIGNyaXRlcmlhLiBBdCB0aGUgbW9tZW50IHRoaXMgYmF0Y2ggYWx3 YXlzIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UKKyAqIGFuZCBhdCB0aGlzIHBv aW50IHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgd2FfY3R4IGJhdGNoIGJ1ZmZlcnMuCisgKgorICog VGhlIG51bWJlciBvZiBXQSBhcHBsaWVkIGFyZSBub3Qga25vd24gYXQgdGhlIGJlZ2lubmluZzsg d2UgdXNlIHRoaXMgZmllbGQKKyAqIHRvIHJldHVybiB0aGUgbm8gb2YgRFdPUkRTIHdyaXR0ZW4u CisgKgorICogSXQgaXMgdG8gYmUgbm90ZWQgdGhhdCB0aGlzIGJhdGNoIGRvZXMgbm90IGNvbnRh aW4gTUlfQkFUQ0hfQlVGRkVSX0VORAorICogc28gaXQgYWRkcyBOT09QcyBhcyBwYWRkaW5nIHRv IG1ha2UgaXQgY2FjaGVsaW5lIGFsaWduZWQuCisgKiBNSV9CQVRDSF9CVUZGRVJfRU5EIHdpbGwg YmUgYWRkZWQgdG8gcGVyY3R4IGJhdGNoIGFuZCBib3RoIG9mIHRoZW0gdG9nZXRoZXIKKyAqIG1h a2VzIGEgY29tcGxldGUgYmF0Y2ggYnVmZmVyLgorICovCitzdGF0aWMgdTMyICpnZW44X2luaXRf aW5kaXJlY3RjdHhfYmIoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCB1MzIgKmJhdGNo KQoreworCS8qIFdhRGlzYWJsZUN0eFJlc3RvcmVBcmJpdHJhdGlvbjpiZHcsY2h2ICovCisJKmJh dGNoKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0RJU0FCTEU7CisKKwkvKiBXYUZsdXNoQ29o ZXJlbnRMM0NhY2hlTGluZXNBdENvbnRleHRTd2l0Y2g6YmR3ICovCisJaWYgKElTX0JST0FEV0VM TChlbmdpbmUtPmk5MTUpKQorCQliYXRjaCA9IGdlbjhfZW1pdF9mbHVzaF9jb2hlcmVudGwzX3dh KGVuZ2luZSwgYmF0Y2gpOworCisJLyogV2FDbGVhclNsbVNwYWNlQXRDb250ZXh0U3dpdGNoOmJk dyxjaHYgKi8KKwkvKiBBY3R1YWwgc2NyYXRjaCBsb2NhdGlvbiBpcyBhdCAxMjggYnl0ZXMgb2Zm c2V0ICovCisJYmF0Y2ggPSBnZW44X2VtaXRfcGlwZV9jb250cm9sKGJhdGNoLAorCQkJCSAgICAg ICBQSVBFX0NPTlRST0xfRkxVU0hfTDMgfAorCQkJCSAgICAgICBQSVBFX0NPTlRST0xfU1RPUkVf REFUQV9JTkRFWCB8CisJCQkJICAgICAgIFBJUEVfQ09OVFJPTF9DU19TVEFMTCB8CisJCQkJICAg ICAgIFBJUEVfQ09OVFJPTF9RV19XUklURSwKKwkJCQkgICAgICAgTFJDX1BQSFdTUF9TQ1JBVENI X0FERFIpOworCisJKmJhdGNoKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0VOQUJMRTsKKwor CS8qIFBhZCB0byBlbmQgb2YgY2FjaGVsaW5lICovCisJd2hpbGUgKCh1bnNpZ25lZCBsb25nKWJh dGNoICUgQ0FDSEVMSU5FX0JZVEVTKQorCQkqYmF0Y2grKyA9IE1JX05PT1A7CisKKwkvKgorCSAq IE1JX0JBVENIX0JVRkZFUl9FTkQgaXMgbm90IHJlcXVpcmVkIGluIEluZGlyZWN0IGN0eCBCQiBi ZWNhdXNlCisJICogZXhlY3V0aW9uIGRlcGVuZHMgb24gdGhlIGxlbmd0aCBzcGVjaWZpZWQgaW4g dGVybXMgb2YgY2FjaGUgbGluZXMKKwkgKiBpbiB0aGUgcmVnaXN0ZXIgQ1RYX1JDU19JTkRJUkVD VF9DVFgKKwkgKi8KKworCXJldHVybiBiYXRjaDsKK30KKworc3RydWN0IGxyaSB7CisJaTkxNV9y ZWdfdCByZWc7CisJdTMyIHZhbHVlOworfTsKKworc3RhdGljIHUzMiAqZW1pdF9scmkodTMyICpi YXRjaCwgY29uc3Qgc3RydWN0IGxyaSAqbHJpLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJR0VN X0JVR19PTighY291bnQgfHwgY291bnQgPiA2Myk7CisKKwkqYmF0Y2grKyA9IE1JX0xPQURfUkVH SVNURVJfSU1NKGNvdW50KTsKKwlkbyB7CisJCSpiYXRjaCsrID0gaTkxNV9tbWlvX3JlZ19vZmZz ZXQobHJpLT5yZWcpOworCQkqYmF0Y2grKyA9IGxyaS0+dmFsdWU7CisJfSB3aGlsZSAobHJpKyss IC0tY291bnQpOworCSpiYXRjaCsrID0gTUlfTk9PUDsKKworCXJldHVybiBiYXRjaDsKK30KKwor c3RhdGljIHUzMiAqZ2VuOV9pbml0X2luZGlyZWN0Y3R4X2JiKHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZSwgdTMyICpiYXRjaCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGxyaSBscmlb XSA9IHsKKwkJLyogV2FEaXNhYmxlR2F0aGVyQXRTZXRTaGFkZXJDb21tb25TbGljZTpza2wsYnh0 LGtibCxnbGsgKi8KKwkJeworCQkJQ09NTU9OX1NMSUNFX0NISUNLRU4yLAorCQkJX19NQVNLRURf RklFTEQoR0VOOV9ESVNBQkxFX0dBVEhFUl9BVF9TRVRfU0hBREVSX0NPTU1PTl9TTElDRSwKKwkJ CQkgICAgICAgMCksCisJCX0sCisKKwkJLyogQlNwZWM6IDExMzkxICovCisJCXsKKwkJCUZGX1NM SUNFX0NISUNLRU4sCisJCQlfX01BU0tFRF9GSUVMRChGRl9TTElDRV9DSElDS0VOX0NMX1BST1ZP S0lOR19WRVJURVhfRklYLAorCQkJCSAgICAgICBGRl9TTElDRV9DSElDS0VOX0NMX1BST1ZPS0lO R19WRVJURVhfRklYKSwKKwkJfSwKKworCQkvKiBCU3BlYzogMTEyOTkgKi8KKwkJeworCQkJXzNE X0NISUNLRU4zLAorCQkJX19NQVNLRURfRklFTEQoXzNEX0NISUNLRU5fU0ZfUFJPVk9LSU5HX1ZF UlRFWF9GSVgsCisJCQkJICAgICAgIF8zRF9DSElDS0VOX1NGX1BST1ZPS0lOR19WRVJURVhfRklY KSwKKwkJfQorCX07CisKKwkqYmF0Y2grKyA9IE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJfRElTQUJM RTsKKworCS8qIFdhRmx1c2hDb2hlcmVudEwzQ2FjaGVMaW5lc0F0Q29udGV4dFN3aXRjaDpza2ws Ynh0LGdsayAqLworCWJhdGNoID0gZ2VuOF9lbWl0X2ZsdXNoX2NvaGVyZW50bDNfd2EoZW5naW5l LCBiYXRjaCk7CisKKwkvKiBXYUNsZWFyU2xtU3BhY2VBdENvbnRleHRTd2l0Y2g6c2tsLGJ4dCxr YmwsZ2xrLGNmbCAqLworCWJhdGNoID0gZ2VuOF9lbWl0X3BpcGVfY29udHJvbChiYXRjaCwKKwkJ CQkgICAgICAgUElQRV9DT05UUk9MX0ZMVVNIX0wzIHwKKwkJCQkgICAgICAgUElQRV9DT05UUk9M X1NUT1JFX0RBVEFfSU5ERVggfAorCQkJCSAgICAgICBQSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAor CQkJCSAgICAgICBQSVBFX0NPTlRST0xfUVdfV1JJVEUsCisJCQkJICAgICAgIExSQ19QUEhXU1Bf U0NSQVRDSF9BRERSKTsKKworCWJhdGNoID0gZW1pdF9scmkoYmF0Y2gsIGxyaSwgQVJSQVlfU0la RShscmkpKTsKKworCS8qIFdhTWVkaWFQb29sU3RhdGVDbWRJbldBQkI6Ynh0LGdsayAqLworCWlm IChIQVNfUE9PTEVEX0VVKGVuZ2luZS0+aTkxNSkpIHsKKwkJLyoKKwkJICogRVUgcG9vbCBjb25m aWd1cmF0aW9uIGlzIHNldHVwIGFsb25nIHdpdGggZ29sZGVuIGNvbnRleHQKKwkJICogZHVyaW5n IGNvbnRleHQgaW5pdGlhbGl6YXRpb24uIFRoaXMgdmFsdWUgZGVwZW5kcyBvbgorCQkgKiBkZXZp Y2UgdHlwZSAoMng2IG9yIDN4NikgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYmFzZWQKKwkJICog b24gd2hpY2ggc3Vic2xpY2UgaXMgZGlzYWJsZWQgZXNwZWNpYWxseSBmb3IgMng2CisJCSAqIGRl dmljZXMsIGhvd2V2ZXIgaXQgaXMgc2FmZSB0byBsb2FkIGRlZmF1bHQKKwkJICogY29uZmlndXJh dGlvbiBvZiAzeDYgZGV2aWNlIGluc3RlYWQgb2YgbWFza2luZyBvZmYKKwkJICogY29ycmVzcG9u ZGluZyBiaXRzIGJlY2F1c2UgSFcgaWdub3JlcyBiaXRzIG9mIGEgZGlzYWJsZWQKKwkJICogc3Vi c2xpY2UgYW5kIGRyb3BzIGRvd24gdG8gYXBwcm9wcmlhdGUgY29uZmlnLiBQbGVhc2UKKwkJICog c2VlIHJlbmRlcl9zdGF0ZV9zZXR1cCgpIGluIGk5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5jIGZvcgor CQkgKiBwb3NzaWJsZSBjb25maWd1cmF0aW9ucywgdG8gYXZvaWQgZHVwbGljYXRpb24gdGhleSBh cmUKKwkJICogbm90IHNob3duIGhlcmUgYWdhaW4uCisJCSAqLworCQkqYmF0Y2grKyA9IEdFTjlf TUVESUFfUE9PTF9TVEFURTsKKwkJKmJhdGNoKysgPSBHRU45X01FRElBX1BPT0xfRU5BQkxFOwor CQkqYmF0Y2grKyA9IDB4MDA3NzcwMDA7CisJCSpiYXRjaCsrID0gMDsKKwkJKmJhdGNoKysgPSAw OworCQkqYmF0Y2grKyA9IDA7CisJfQorCisJKmJhdGNoKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlf QVJCX0VOQUJMRTsKKworCS8qIFBhZCB0byBlbmQgb2YgY2FjaGVsaW5lICovCisJd2hpbGUgKCh1 bnNpZ25lZCBsb25nKWJhdGNoICUgQ0FDSEVMSU5FX0JZVEVTKQorCQkqYmF0Y2grKyA9IE1JX05P T1A7CisKKwlyZXR1cm4gYmF0Y2g7Cit9CisKK3N0YXRpYyB1MzIgKgorZ2VuMTBfaW5pdF9pbmRp cmVjdGN0eF9iYihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsIHUzMiAqYmF0Y2gpCit7 CisJaW50IGk7CisKKwkvKgorCSAqIFdhUGlwZUNvbnRyb2xCZWZvcmUzRFN0YXRlU2FtcGxlUGF0 dGVybjogY25sCisJICoKKwkgKiBFbnN1cmUgdGhlIGVuZ2luZSBpcyBpZGxlIHByaW9yIHRvIHBy b2dyYW1taW5nIGEKKwkgKiAzRFNUQVRFX1NBTVBMRV9QQVRURVJOIGR1cmluZyBhIGNvbnRleHQg cmVzdG9yZS4KKwkgKi8KKwliYXRjaCA9IGdlbjhfZW1pdF9waXBlX2NvbnRyb2woYmF0Y2gsCisJ CQkJICAgICAgIFBJUEVfQ09OVFJPTF9DU19TVEFMTCwKKwkJCQkgICAgICAgMCk7CisJLyoKKwkg KiBXYVBpcGVDb250cm9sQmVmb3JlM0RTdGF0ZVNhbXBsZVBhdHRlcm4gc2F5cyB3ZSBuZWVkIDQg ZHdvcmRzIGZvcgorCSAqIHRoZSBQSVBFX0NPTlRST0wgZm9sbG93ZWQgYnkgMTIgZHdvcmRzIG9m IDB4MCwgc28gMTYgZHdvcmRzIGluCisJICogdG90YWwuIEhvd2V2ZXIsIGEgUElQRV9DT05UUk9M IGlzIDYgZHdvcmRzIGxvbmcsIG5vdCA0LCB3aGljaCBpcworCSAqIGNvbmZ1c2luZy4gU2luY2Ug Z2VuOF9lbWl0X3BpcGVfY29udHJvbCgpIGFscmVhZHkgYWR2YW5jZXMgdGhlCisJICogYmF0Y2gg YnkgNiBkd29yZHMsIHdlIGFkdmFuY2UgdGhlIG90aGVyIDEwIGhlcmUsIGNvbXBsZXRpbmcgYQor CSAqIGNhY2hlbGluZS4gSXQncyBub3QgY2xlYXIgaWYgdGhlIHdvcmthcm91bmQgcmVxdWlyZXMg dGhpcyBwYWRkaW5nCisJICogYmVmb3JlIG90aGVyIGNvbW1hbmRzLCBvciBpZiBpdCdzIGp1c3Qg dGhlIHJlZ3VsYXIgcGFkZGluZyB3ZSB3b3VsZAorCSAqIGFscmVhZHkgaGF2ZSBmb3IgdGhlIHdv cmthcm91bmQgYmIsIHNvIGxlYXZlIGl0IGhlcmUgZm9yIG5vdy4KKwkgKi8KKwlmb3IgKGkgPSAw OyBpIDwgMTA7IGkrKykKKwkJKmJhdGNoKysgPSBNSV9OT09QOworCisJLyogUGFkIHRvIGVuZCBv ZiBjYWNoZWxpbmUgKi8KKwl3aGlsZSAoKHVuc2lnbmVkIGxvbmcpYmF0Y2ggJSBDQUNIRUxJTkVf QllURVMpCisJCSpiYXRjaCsrID0gTUlfTk9PUDsKKworCXJldHVybiBiYXRjaDsKK30KKworI2Rl ZmluZSBDVFhfV0FfQkJfU0laRSAoUEFHRV9TSVpFKQorCitzdGF0aWMgaW50IGxyY19zZXR1cF93 YV9jdHgoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50IGVycjsKKwor CW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc2htZW0oZW5naW5lLT5pOTE1LCBDVFhfV0Ff QkJfU0laRSk7CisJaWYgKElTX0VSUihvYmopKQorCQlyZXR1cm4gUFRSX0VSUihvYmopOworCisJ dm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmZW5naW5lLT5ndC0+Z2d0dC0+dm0sIE5VTEwp OworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQVFJfRVJSKHZtYSk7CisJCWdvdG8gZXJy OworCX0KKworCWVyciA9IGk5MTVfZ2d0dF9waW4odm1hLCBOVUxMLCAwLCBQSU5fSElHSCk7CisJ aWYgKGVycikKKwkJZ290byBlcnI7CisKKwllbmdpbmUtPndhX2N0eC52bWEgPSB2bWE7CisJcmV0 dXJuIDA7CisKK2VycjoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJcmV0dXJuIGVycjsK K30KKwordm9pZCBscmNfZmluaV93YV9jdHgoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l KQoreworCWk5MTVfdm1hX3VucGluX2FuZF9yZWxlYXNlKCZlbmdpbmUtPndhX2N0eC52bWEsIDAp OworfQorCit0eXBlZGVmIHUzMiAqKCp3YV9iYl9mdW5jX3QpKHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZSwgdTMyICpiYXRjaCk7CisKK2ludCBscmNfaW5pdF93YV9jdHgoc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBpOTE1X2N0eF93b3JrYXJvdW5kcyAq d2FfY3R4ID0gJmVuZ2luZS0+d2FfY3R4OworCXN0cnVjdCBpOTE1X3dhX2N0eF9iYiAqd2FfYmJb XSA9IHsKKwkJJndhX2N0eC0+aW5kaXJlY3RfY3R4LCAmd2FfY3R4LT5wZXJfY3R4CisJfTsKKwl3 YV9iYl9mdW5jX3Qgd2FfYmJfZm5bQVJSQVlfU0laRSh3YV9iYildOworCXZvaWQgKmJhdGNoLCAq YmF0Y2hfcHRyOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlpZiAoZW5naW5lLT5j bGFzcyAhPSBSRU5ERVJfQ0xBU1MpCisJCXJldHVybiAwOworCisJc3dpdGNoIChJTlRFTF9HRU4o ZW5naW5lLT5pOTE1KSkgeworCWNhc2UgMTI6CisJY2FzZSAxMToKKwkJcmV0dXJuIDA7CisJY2Fz ZSAxMDoKKwkJd2FfYmJfZm5bMF0gPSBnZW4xMF9pbml0X2luZGlyZWN0Y3R4X2JiOworCQl3YV9i Yl9mblsxXSA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgOToKKwkJd2FfYmJfZm5bMF0gPSBnZW45 X2luaXRfaW5kaXJlY3RjdHhfYmI7CisJCXdhX2JiX2ZuWzFdID0gTlVMTDsKKwkJYnJlYWs7CisJ Y2FzZSA4OgorCQl3YV9iYl9mblswXSA9IGdlbjhfaW5pdF9pbmRpcmVjdGN0eF9iYjsKKwkJd2Ff YmJfZm5bMV0gPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlNSVNTSU5HX0NBU0UoSU5U RUxfR0VOKGVuZ2luZS0+aTkxNSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBscmNfc2V0 dXBfd2FfY3R4KGVuZ2luZSk7CisJaWYgKHJldCkgeworCQlkcm1fZGJnKCZlbmdpbmUtPmk5MTUt PmRybSwKKwkJCSJGYWlsZWQgdG8gc2V0dXAgY29udGV4dCBXQSBwYWdlOiAlZFxuIiwgcmV0KTsK KwkJcmV0dXJuIHJldDsKKwl9CisKKwliYXRjaCA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHdh X2N0eC0+dm1hLT5vYmosIEk5MTVfTUFQX1dCKTsKKworCS8qCisJICogRW1pdCB0aGUgdHdvIHdv cmthcm91bmQgYmF0Y2ggYnVmZmVycywgcmVjb3JkaW5nIHRoZSBvZmZzZXQgZnJvbSB0aGUKKwkg KiBzdGFydCBvZiB0aGUgd29ya2Fyb3VuZCBiYXRjaCBidWZmZXIgb2JqZWN0IGZvciBlYWNoIGFu ZCB0aGVpcgorCSAqIHJlc3BlY3RpdmUgc2l6ZXMuCisJICovCisJYmF0Y2hfcHRyID0gYmF0Y2g7 CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2FfYmJfZm4pOyBpKyspIHsKKwkJd2FfYmJb aV0tPm9mZnNldCA9IGJhdGNoX3B0ciAtIGJhdGNoOworCQlpZiAoR0VNX0RFQlVHX1dBUk5fT04o IUlTX0FMSUdORUQod2FfYmJbaV0tPm9mZnNldCwKKwkJCQkJCSAgQ0FDSEVMSU5FX0JZVEVTKSkp IHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAod2FfYmJfZm5baV0p CisJCQliYXRjaF9wdHIgPSB3YV9iYl9mbltpXShlbmdpbmUsIGJhdGNoX3B0cik7CisJCXdhX2Ji W2ldLT5zaXplID0gYmF0Y2hfcHRyIC0gKGJhdGNoICsgd2FfYmJbaV0tPm9mZnNldCk7CisJfQor CUdFTV9CVUdfT04oYmF0Y2hfcHRyIC0gYmF0Y2ggPiBDVFhfV0FfQkJfU0laRSk7CisKKwlfX2k5 MTVfZ2VtX29iamVjdF9mbHVzaF9tYXAod2FfY3R4LT52bWEtPm9iaiwgMCwgYmF0Y2hfcHRyIC0g YmF0Y2gpOworCV9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbWFwKHdhX2N0eC0+dm1hLT5vYmop OworCWlmIChyZXQpCisJCWxyY19maW5pX3dhX2N0eChlbmdpbmUpOworCisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIHZvaWQgc3RfdXBkYXRlX3J1bnRpbWVfdW5kZXJmbG93KHN0cnVjdCBpbnRl bF9jb250ZXh0ICpjZSwgczMyIGR0KQoreworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1 X1NFTEZURVNUKQorCWNlLT5ydW50aW1lLm51bV91bmRlcmZsb3crKzsKKwljZS0+cnVudGltZS5t YXhfdW5kZXJmbG93ID0gbWF4X3QodTMyLCBjZS0+cnVudGltZS5tYXhfdW5kZXJmbG93LCAtZHQp OworI2VuZGlmCit9CisKK3ZvaWQgbHJjX3VwZGF0ZV9ydW50aW1lKHN0cnVjdCBpbnRlbF9jb250 ZXh0ICpjZSkKK3sKKwl1MzIgb2xkOworCXMzMiBkdDsKKworCWlmIChpbnRlbF9jb250ZXh0X2lz X2JhcnJpZXIoY2UpKQorCQlyZXR1cm47CisKKwlvbGQgPSBjZS0+cnVudGltZS5sYXN0OworCWNl LT5ydW50aW1lLmxhc3QgPSBscmNfZ2V0X3J1bnRpbWUoY2UpOworCWR0ID0gY2UtPnJ1bnRpbWUu bGFzdCAtIG9sZDsKKworCWlmICh1bmxpa2VseShkdCA8IDApKSB7CisJCUNFX1RSQUNFKGNlLCAi cnVudGltZSB1bmRlcmZsb3c6IGxhc3Q9JXUsIG5ldz0ldSwgZGVsdGE9JWRcbiIsCisJCQkgb2xk LCBjZS0+cnVudGltZS5sYXN0LCBkdCk7CisJCXN0X3VwZGF0ZV9ydW50aW1lX3VuZGVyZmxvdyhj ZSwgZHQpOworCQlyZXR1cm47CisJfQorCisJZXdtYV9ydW50aW1lX2FkZCgmY2UtPnJ1bnRpbWUu YXZnLCBkdCk7CisJY2UtPnJ1bnRpbWUudG90YWwgKz0gZHQ7Cit9CisKKyNpZiBJU19FTkFCTEVE KENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVCkKKyNpbmNsdWRlICJzZWxmdGVzdF9scmMuYyIKKyNl bmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjLmggYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9scmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMDAuLjRlMDA2ODUzZTgxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2xyYy5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBNSVQgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRl bCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX19JTlRFTF9MUkNfSF9fCisjZGVmaW5lIF9f SU5URUxfTFJDX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImlu dGVsX2NvbnRleHQuaCIKKyNpbmNsdWRlICJpbnRlbF9scmNfcmVnLmgiCisKK3N0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0Oworc3RydWN0IGludGVsX2VuZ2luZV9jczsKK3N0cnVjdCBpbnRlbF9y aW5nOworCisvKiBBdCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQgaW1hZ2UgaXMgaXRzIHBlci1w cm9jZXNzIEhXUyBwYWdlICovCisjZGVmaW5lIExSQ19QUEhXU1BfUE4JKDApCisjZGVmaW5lIExS Q19QUEhXU1BfU1oJKDEpCisvKiBBZnRlciB0aGUgUFBIV1NQIHdlIGhhdmUgdGhlIGxvZ2ljYWwg c3RhdGUgZm9yIHRoZSBjb250ZXh0ICovCisjZGVmaW5lIExSQ19TVEFURV9QTgkoTFJDX1BQSFdT UF9QTiArIExSQ19QUEhXU1BfU1opCisjZGVmaW5lIExSQ19TVEFURV9PRkZTRVQgKExSQ19TVEFU RV9QTiAqIFBBR0VfU0laRSkKKworLyogU3BhY2Ugd2l0aGluIFBQSFdTUCByZXNlcnZlZCB0byBi ZSB1c2VkIGFzIHNjcmF0Y2ggKi8KKyNkZWZpbmUgTFJDX1BQSFdTUF9TQ1JBVENICQkweDM0Cisj ZGVmaW5lIExSQ19QUEhXU1BfU0NSQVRDSF9BRERSCQkoTFJDX1BQSFdTUF9TQ1JBVENIICogc2l6 ZW9mKHUzMikpCisKK2ludCBscmNfaW5pdF93YV9jdHgoc3RydWN0IGludGVsX2VuZ2luZV9jcyAq ZW5naW5lKTsKK3ZvaWQgbHJjX2Zpbmlfd2FfY3R4KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSk7CisKK2ludCBscmNfYWxsb2Moc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAorCSAgICAg IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSk7Cit2b2lkIGxyY19yZXNldChzdHJ1Y3Qg aW50ZWxfY29udGV4dCAqY2UpOwordm9pZCBscmNfZmluaShzdHJ1Y3QgaW50ZWxfY29udGV4dCAq Y2UpOwordm9pZCBscmNfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZik7CisKK2ludAorbHJjX3By ZV9waW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlLAorCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUsCisJICAgIHN0cnVjdCBpOTE1X2dlbV93d19jdHggKnd3LAorCSAgICB2b2lk ICoqdmFkZHIpOworaW50CitscmNfcGluKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwKKwlzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJdm9pZCAqdmFkZHIpOwordm9pZCBscmNfdW5w aW4oc3RydWN0IGludGVsX2NvbnRleHQgKmNlKTsKK3ZvaWQgbHJjX3Bvc3RfdW5waW4oc3RydWN0 IGludGVsX2NvbnRleHQgKmNlKTsKKwordm9pZCBscmNfaW5pdF9zdGF0ZShzdHJ1Y3QgaW50ZWxf Y29udGV4dCAqY2UsCisJCSAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCSAg ICB2b2lkICpzdGF0ZSk7CisKK3ZvaWQgbHJjX2luaXRfcmVncyhjb25zdCBzdHJ1Y3QgaW50ZWxf Y29udGV4dCAqY2UsCisJCSAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwK KwkJICAgYm9vbCBjbGVhcik7Cit2b2lkIGxyY19yZXNldF9yZWdzKGNvbnN0IHN0cnVjdCBpbnRl bF9jb250ZXh0ICpjZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSk7CisKK3UzMiBscmNfdXBkYXRlX3JlZ3MoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNl LAorCQkgICAgY29uc3Qgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAorCQkgICAgdTMy IGhlYWQpOwordm9pZCBscmNfdXBkYXRlX29mZnNldHMoc3RydWN0IGludGVsX2NvbnRleHQgKmNl LAorCQkJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKTsKKwordm9pZCBscmNfY2hlY2tf cmVncyhjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsCisJCSAgICBjb25zdCBzdHJ1Y3Qg aW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCSAgICBjb25zdCBjaGFyICp3aGVuKTsKKwordm9p ZCBscmNfdXBkYXRlX3J1bnRpbWUoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKTsKK3N0YXRpYyBp bmxpbmUgdTMyIGxyY19nZXRfcnVudGltZShjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Up Cit7CisJLyoKKwkgKiBXZSBjYW4gdXNlIGVpdGhlciBwcEhXU1BbMTZdIHdoaWNoIGlzIHJlY29y ZGVkIGJlZm9yZSB0aGUgY29udGV4dAorCSAqIHN3aXRjaCAoYW5kIHNvIGV4Y2x1ZGVzIHRoZSBj b3N0IG9mIGNvbnRleHQgc3dpdGNoZXMpIG9yIHVzZSB0aGUKKwkgKiB2YWx1ZSBmcm9tIHRoZSBj b250ZXh0IGltYWdlIGl0c2VsZiwgd2hpY2ggaXMgc2F2ZWQvcmVzdG9yZWQgZWFybGllcgorCSAq IGFuZCBzbyBpbmNsdWRlcyB0aGUgY29zdCBvZiB0aGUgc2F2ZS4KKwkgKi8KKwlyZXR1cm4gUkVB RF9PTkNFKGNlLT5scmNfcmVnX3N0YXRlW0NUWF9USU1FU1RBTVBdKTsKK30KKworI2VuZGlmIC8q IF9fSU5URUxfTFJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv aW50ZWxfbHJjX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfbHJjX3JlZy5o CmluZGV4IGIyZTAzY2UzNTU5OS4uNjVmZTc2NzM4MzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9scmNfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv Z3QvaW50ZWxfbHJjX3JlZy5oCkBAIC05LDYgKzksOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlw ZXMuaD4KIAorI2RlZmluZSBDVFhfREVTQ19GT1JDRV9SRVNUT1JFIEJJVF9VTEwoMikKKwogLyog R0VOOCB0byBHRU4xMiBSZWcgU3RhdGUgQ29udGV4dCAqLwogI2RlZmluZSBDVFhfQ09OVEVYVF9D T05UUk9MCQkoMHgwMiArIDEpCiAjZGVmaW5lIENUWF9SSU5HX0hFQUQJCQkoMHgwNCArIDEpCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9zZWxmdGVzdF9leGVjbGlzdHMuYyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3NlbGZ0ZXN0X2V4ZWNsaXN0cy5jCmluZGV4IDk1ZDQx YzAxZDBlMC4uMzRjMmJiODMxM2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n dC9zZWxmdGVzdF9leGVjbGlzdHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9zZWxm dGVzdF9leGVjbGlzdHMuYwpAQCAtMjQ5LDcgKzI0OSw3IEBAIHN0YXRpYyBpbnQgbGl2ZV91bmxp dGVfcmVzdG9yZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0LCBpbnQgcHJpbykKIAkJfQogCQlHRU1fQlVH X09OKCFjZVsxXS0+cmluZy0+c2l6ZSk7CiAJCWludGVsX3JpbmdfcmVzZXQoY2VbMV0tPnJpbmcs IGNlWzFdLT5yaW5nLT5zaXplIC8gMik7Ci0JCV9fZXhlY2xpc3RzX3VwZGF0ZV9yZWdfc3RhdGUo Y2VbMV0sIGVuZ2luZSwgY2VbMV0tPnJpbmctPmhlYWQpOworCQlscmNfdXBkYXRlX3JlZ3MoY2Vb MV0sIGVuZ2luZSwgY2VbMV0tPnJpbmctPmhlYWQpOwogCiAJCXJxWzBdID0gaWd0X3NwaW5uZXJf Y3JlYXRlX3JlcXVlc3QoJnNwaW4sIGNlWzBdLCBNSV9BUkJfQ0hFQ0spOwogCQlpZiAoSVNfRVJS KHJxWzBdKSkgewpAQCAtNDcwNSwxNzc3ICs0NzA1LDMgQEAgaW50IGludGVsX2V4ZWNsaXN0c19s aXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIAogCXJldHVybiBp bnRlbF9ndF9saXZlX3N1YnRlc3RzKHRlc3RzLCAmaTkxNS0+Z3QpOwogfQotCi1zdGF0aWMgaW50 IGVtaXRfc2VtYXBob3JlX3NpZ25hbChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHZvaWQgKnNs b3QpCi17Ci0JY29uc3QgdTMyIG9mZnNldCA9Ci0JCWk5MTVfZ2d0dF9vZmZzZXQoY2UtPmVuZ2lu ZS0+c3RhdHVzX3BhZ2Uudm1hKSArCi0JCW9mZnNldF9pbl9wYWdlKHNsb3QpOwotCXN0cnVjdCBp OTE1X3JlcXVlc3QgKnJxOwotCXUzMiAqY3M7Ci0KLQlycSA9IGludGVsX2NvbnRleHRfY3JlYXRl X3JlcXVlc3QoY2UpOwotCWlmIChJU19FUlIocnEpKQotCQlyZXR1cm4gUFRSX0VSUihycSk7Ci0K LQljcyA9IGludGVsX3JpbmdfYmVnaW4ocnEsIDQpOwotCWlmIChJU19FUlIoY3MpKSB7Ci0JCWk5 MTVfcmVxdWVzdF9hZGQocnEpOwotCQlyZXR1cm4gUFRSX0VSUihjcyk7Ci0JfQotCi0JKmNzKysg PSBNSV9TVE9SRV9EV09SRF9JTU1fR0VONCB8IE1JX1VTRV9HR1RUOwotCSpjcysrID0gb2Zmc2V0 OwotCSpjcysrID0gMDsKLQkqY3MrKyA9IDE7Ci0KLQlpbnRlbF9yaW5nX2FkdmFuY2UocnEsIGNz KTsKLQotCXJxLT5zY2hlZC5hdHRyLnByaW9yaXR5ID0gSTkxNV9QUklPUklUWV9CQVJSSUVSOwot CWk5MTVfcmVxdWVzdF9hZGQocnEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbnRl eHRfZmx1c2goc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCBsb25nIHRpbWVvdXQpCi17Ci0Jc3Ry dWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0Jc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7Ci0JaW50IGVy ciA9IDA7Ci0KLQlycSA9IGludGVsX2VuZ2luZV9jcmVhdGVfa2VybmVsX3JlcXVlc3QoY2UtPmVu Z2luZSk7Ci0JaWYgKElTX0VSUihycSkpCi0JCXJldHVybiBQVFJfRVJSKHJxKTsKLQotCWZlbmNl ID0gaTkxNV9hY3RpdmVfZmVuY2VfZ2V0KCZjZS0+dGltZWxpbmUtPmxhc3RfcmVxdWVzdCk7Ci0J aWYgKGZlbmNlKSB7Ci0JCWk5MTVfcmVxdWVzdF9hd2FpdF9kbWFfZmVuY2UocnEsIGZlbmNlKTsK LQkJZG1hX2ZlbmNlX3B1dChmZW5jZSk7Ci0JfQotCi0JcnEgPSBpOTE1X3JlcXVlc3RfZ2V0KHJx KTsKLQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQlpZiAoaTkxNV9yZXF1ZXN0X3dhaXQocnEsIDAs IHRpbWVvdXQpIDwgMCkKLQkJZXJyID0gLUVUSU1FOwotCWk5MTVfcmVxdWVzdF9wdXQocnEpOwot Ci0Jcm1iKCk7IC8qIFdlIGtub3cgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbiwgbWFrZSBzdXJlIGFs bCBzdGF0ZSBpcyB0b28hICovCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBsaXZlX2xy Y19sYXlvdXQodm9pZCAqYXJnKQotewotCXN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7Ci0Jc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOwotCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwot CXUzMiAqbHJjOwotCWludCBlcnI7Ci0KLQkvKgotCSAqIENoZWNrIHRoZSByZWdpc3RlcnMgb2Zm c2V0cyB3ZSB1c2UgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHJlZyBzdGF0ZQotCSAqIG1hdGNoIHRo ZSBsYXlvdXQgc2F2ZWQgYnkgSFcuCi0JICovCi0KLQlscmMgPSBrbWFsbG9jKFBBR0VfU0laRSwg R0ZQX0tFUk5FTCk7Ci0JaWYgKCFscmMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gMDsK LQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBndCwgaWQpIHsKLQkJdTMyICpodzsKLQkJaW50IGR3 OwotCi0JCWlmICghZW5naW5lLT5kZWZhdWx0X3N0YXRlKQotCQkJY29udGludWU7Ci0KLQkJaHcg PSBzaG1lbV9waW5fbWFwKGVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSk7Ci0JCWlmIChJU19FUlIoaHcp KSB7Ci0JCQllcnIgPSBQVFJfRVJSKGh3KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWh3ICs9IExSQ19T VEFURV9PRkZTRVQgLyBzaXplb2YoKmh3KTsKLQotCQlleGVjbGlzdHNfaW5pdF9yZWdfc3RhdGUo bWVtc2V0KGxyYywgUE9JU09OX0lOVVNFLCBQQUdFX1NJWkUpLAotCQkJCQkgZW5naW5lLT5rZXJu ZWxfY29udGV4dCwKLQkJCQkJIGVuZ2luZSwKLQkJCQkJIGVuZ2luZS0+a2VybmVsX2NvbnRleHQt PnJpbmcsCi0JCQkJCSB0cnVlKTsKLQotCQlkdyA9IDA7Ci0JCWRvIHsKLQkJCXUzMiBscmkgPSBo d1tkd107Ci0KLQkJCWlmIChscmkgPT0gMCkgewotCQkJCWR3Kys7Ci0JCQkJY29udGludWU7Ci0J CQl9Ci0KLQkJCWlmIChscmNbZHddID09IDApIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IHNraXBwZWQg aW5zdHJ1Y3Rpb24gJXggYXQgZHdvcmQgJWRcbiIsCi0JCQkJCSBlbmdpbmUtPm5hbWUsIGxyaSwg ZHcpOwotCQkJCWR3Kys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICgobHJpICYgR0VO TUFTSygzMSwgMjMpKSAhPSBNSV9JTlNUUigweDIyLCAwKSkgewotCQkJCXByX2VycigiJXM6IEV4 cGVjdGVkIExSSSBjb21tYW5kIGF0IGR3b3JkICVkLCBmb3VuZCAlMDh4XG4iLAotCQkJCSAgICAg ICBlbmdpbmUtPm5hbWUsIGR3LCBscmkpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7 Ci0JCQl9Ci0KLQkJCWlmIChscmNbZHddICE9IGxyaSkgewotCQkJCXByX2VycigiJXM6IExSSSBj b21tYW5kIG1pc21hdGNoIGF0IGR3b3JkICVkLCBleHBlY3RlZCAlMDh4IGZvdW5kICUwOHhcbiIs Ci0JCQkJICAgICAgIGVuZ2luZS0+bmFtZSwgZHcsIGxyaSwgbHJjW2R3XSk7Ci0JCQkJZXJyID0g LUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbHJpICY9IDB4N2Y7Ci0JCQlscmkrKzsK LQkJCWR3Kys7Ci0KLQkJCXdoaWxlIChscmkpIHsKLQkJCQlpZiAoaHdbZHddICE9IGxyY1tkd10p IHsKLQkJCQkJcHJfZXJyKCIlczogRGlmZmVyZW50IHJlZ2lzdGVycyBmb3VuZCBhdCBkd29yZCAl ZCwgZXhwZWN0ZWQgJXgsIGZvdW5kICV4XG4iLAotCQkJCQkgICAgICAgZW5naW5lLT5uYW1lLCBk dywgaHdbZHddLCBscmNbZHddKTsKLQkJCQkJZXJyID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0J CQkJfQotCi0JCQkJLyoKLQkJCQkgKiBTa2lwIG92ZXIgdGhlIGFjdHVhbCByZWdpc3RlciB2YWx1 ZSBhcyB3ZQotCQkJCSAqIGV4cGVjdCB0aGF0IHRvIGRpZmZlci4KLQkJCQkgKi8KLQkJCQlkdyAr PSAyOwotCQkJCWxyaSAtPSAyOwotCQkJfQotCQl9IHdoaWxlICgobHJjW2R3XSAmIH5CSVQoMCkp ICE9IE1JX0JBVENIX0JVRkZFUl9FTkQpOwotCi0JCWlmIChlcnIpIHsKLQkJCXByX2luZm8oIiVz OiBIVyByZWdpc3RlciBpbWFnZTpcbiIsIGVuZ2luZS0+bmFtZSk7Ci0JCQlpZ3RfaGV4ZHVtcCho dywgUEFHRV9TSVpFKTsKLQotCQkJcHJfaW5mbygiJXM6IFNXIHJlZ2lzdGVyIGltYWdlOlxuIiwg ZW5naW5lLT5uYW1lKTsKLQkJCWlndF9oZXhkdW1wKGxyYywgUEFHRV9TSVpFKTsKLQkJfQotCi0J CXNobWVtX3VucGluX21hcChlbmdpbmUtPmRlZmF1bHRfc3RhdGUsIGh3KTsKLQkJaWYgKGVycikK LQkJCWJyZWFrOwotCX0KLQotCWtmcmVlKGxyYyk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGlj IGludCBmaW5kX29mZnNldChjb25zdCB1MzIgKmxyaSwgdTMyIG9mZnNldCkKLXsKLQlpbnQgaTsK LQotCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUgLyBzaXplb2YodTMyKTsgaSsrKQotCQlpZiAo bHJpW2ldID09IG9mZnNldCkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC0xOwotfQotCi1zdGF0 aWMgaW50IGxpdmVfbHJjX2ZpeGVkKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0 ID0gYXJnOwotCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQllbnVtIGludGVsX2Vu Z2luZV9pZCBpZDsKLQlpbnQgZXJyID0gMDsKLQotCS8qCi0JICogQ2hlY2sgdGhlIGFzc3VtZWQg cmVnaXN0ZXIgb2Zmc2V0cyBtYXRjaCB0aGUgYWN0dWFsIGxvY2F0aW9ucyBpbgotCSAqIHRoZSBj b250ZXh0IGltYWdlLgotCSAqLwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgZ3QsIGlkKSB7 Ci0JCWNvbnN0IHN0cnVjdCB7Ci0JCQl1MzIgcmVnOwotCQkJdTMyIG9mZnNldDsKLQkJCWNvbnN0 IGNoYXIgKm5hbWU7Ci0JCX0gdGJsW10gPSB7Ci0JCQl7Ci0JCQkJaTkxNV9tbWlvX3JlZ19vZmZz ZXQoUklOR19TVEFSVChlbmdpbmUtPm1taW9fYmFzZSkpLAotCQkJCUNUWF9SSU5HX1NUQVJUIC0g MSwKLQkJCQkiUklOR19TVEFSVCIKLQkJCX0sCi0JCQl7Ci0JCQkJaTkxNV9tbWlvX3JlZ19vZmZz ZXQoUklOR19DVEwoZW5naW5lLT5tbWlvX2Jhc2UpKSwKLQkJCQlDVFhfUklOR19DVEwgLSAxLAot CQkJCSJSSU5HX0NUTCIKLQkJCX0sCi0JCQl7Ci0JCQkJaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklO R19IRUFEKGVuZ2luZS0+bW1pb19iYXNlKSksCi0JCQkJQ1RYX1JJTkdfSEVBRCAtIDEsCi0JCQkJ IlJJTkdfSEVBRCIKLQkJCX0sCi0JCQl7Ci0JCQkJaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19U QUlMKGVuZ2luZS0+bW1pb19iYXNlKSksCi0JCQkJQ1RYX1JJTkdfVEFJTCAtIDEsCi0JCQkJIlJJ TkdfVEFJTCIKLQkJCX0sCi0JCQl7Ci0JCQkJaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19NSV9N T0RFKGVuZ2luZS0+bW1pb19iYXNlKSksCi0JCQkJbHJjX3JpbmdfbWlfbW9kZShlbmdpbmUpLAot CQkJCSJSSU5HX01JX01PREUiCi0JCQl9LAotCQkJewotCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0 KFJJTkdfQkJTVEFURShlbmdpbmUtPm1taW9fYmFzZSkpLAotCQkJCUNUWF9CQl9TVEFURSAtIDEs Ci0JCQkJIkJCX1NUQVRFIgotCQkJfSwKLQkJCXsKLQkJCQlpOTE1X21taW9fcmVnX29mZnNldChS SU5HX0JCX1BFUl9DVFhfUFRSKGVuZ2luZS0+bW1pb19iYXNlKSksCi0JCQkJbHJjX3Jpbmdfd2Ff YmJfcGVyX2N0eChlbmdpbmUpLAotCQkJCSJSSU5HX0JCX1BFUl9DVFhfUFRSIgotCQkJfSwKLQkJ CXsKLQkJCQlpOTE1X21taW9fcmVnX29mZnNldChSSU5HX0lORElSRUNUX0NUWChlbmdpbmUtPm1t aW9fYmFzZSkpLAotCQkJCWxyY19yaW5nX2luZGlyZWN0X3B0cihlbmdpbmUpLAotCQkJCSJSSU5H X0lORElSRUNUX0NUWF9QVFIiCi0JCQl9LAotCQkJewotCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0 KFJJTkdfSU5ESVJFQ1RfQ1RYX09GRlNFVChlbmdpbmUtPm1taW9fYmFzZSkpLAotCQkJCWxyY19y aW5nX2luZGlyZWN0X29mZnNldChlbmdpbmUpLAotCQkJCSJSSU5HX0lORElSRUNUX0NUWF9PRkZT RVQiCi0JCQl9LAotCQkJewotCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ1RYX1RJTUVT VEFNUChlbmdpbmUtPm1taW9fYmFzZSkpLAotCQkJCUNUWF9USU1FU1RBTVAgLSAxLAotCQkJCSJS SU5HX0NUWF9USU1FU1RBTVAiCi0JCQl9LAotCQkJewotCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0 KEdFTjhfUklOR19DU19HUFIoZW5naW5lLT5tbWlvX2Jhc2UsIDApKSwKLQkJCQlscmNfcmluZ19n cHIwKGVuZ2luZSksCi0JCQkJIlJJTkdfQ1NfR1BSMCIKLQkJCX0sCi0JCQl7Ci0JCQkJaTkxNV9t bWlvX3JlZ19vZmZzZXQoUklOR19DTURfQlVGX0NDVEwoZW5naW5lLT5tbWlvX2Jhc2UpKSwKLQkJ CQlscmNfcmluZ19jbWRfYnVmX2NjdGwoZW5naW5lKSwKLQkJCQkiUklOR19DTURfQlVGX0NDVEwi Ci0JCQl9LAotCQkJeyB9LAotCQl9LCAqdDsKLQkJdTMyICpodzsKLQotCQlpZiAoIWVuZ2luZS0+ ZGVmYXVsdF9zdGF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWh3ID0gc2htZW1fcGluX21hcChlbmdp bmUtPmRlZmF1bHRfc3RhdGUpOwotCQlpZiAoSVNfRVJSKGh3KSkgewotCQkJZXJyID0gUFRSX0VS Uihodyk7Ci0JCQlicmVhazsKLQkJfQotCQlodyArPSBMUkNfU1RBVEVfT0ZGU0VUIC8gc2l6ZW9m KCpodyk7Ci0KLQkJZm9yICh0ID0gdGJsOyB0LT5uYW1lOyB0KyspIHsKLQkJCWludCBkdyA9IGZp bmRfb2Zmc2V0KGh3LCB0LT5yZWcpOwotCi0JCQlpZiAoZHcgIT0gdC0+b2Zmc2V0KSB7Ci0JCQkJ cHJfZXJyKCIlczogT2Zmc2V0IGZvciAlcyBbMHgleF0gbWlzbWF0Y2gsIGZvdW5kICV4LCBleHBl Y3RlZCAleFxuIiwKLQkJCQkgICAgICAgZW5naW5lLT5uYW1lLAotCQkJCSAgICAgICB0LT5uYW1l LAotCQkJCSAgICAgICB0LT5yZWcsCi0JCQkJICAgICAgIGR3LAotCQkJCSAgICAgICB0LT5vZmZz ZXQpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQotCQlzaG1lbV91bnBpbl9tYXAo ZW5naW5lLT5kZWZhdWx0X3N0YXRlLCBodyk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3Rh dGljIGludCBfX2xpdmVfbHJjX3N0YXRlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwK LQkJCSAgICBzdHJ1Y3QgaTkxNV92bWEgKnNjcmF0Y2gpCi17Ci0Jc3RydWN0IGludGVsX2NvbnRl eHQgKmNlOwotCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOwotCXN0cnVjdCBpOTE1X2dlbV93d19j dHggd3c7Ci0JZW51bSB7Ci0JCVJJTkdfU1RBUlRfSURYID0gMCwKLQkJUklOR19UQUlMX0lEWCwK LQkJTUFYX0lEWAotCX07Ci0JdTMyIGV4cGVjdGVkW01BWF9JRFhdOwotCXUzMiAqY3M7Ci0JaW50 IGVycjsKLQlpbnQgbjsKLQotCWNlID0gaW50ZWxfY29udGV4dF9jcmVhdGUoZW5naW5lKTsKLQlp ZiAoSVNfRVJSKGNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2UpOwotCi0JaTkxNV9nZW1fd3dfY3R4 X2luaXQoJnd3LCBmYWxzZSk7Ci1yZXRyeToKLQllcnIgPSBpOTE1X2dlbV9vYmplY3RfbG9jayhz Y3JhdGNoLT5vYmosICZ3dyk7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IGludGVsX2NvbnRleHRfcGlu X3d3KGNlLCAmd3cpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dDsKLQotCXJxID0gaTkxNV9y ZXF1ZXN0X2NyZWF0ZShjZSk7Ci0JaWYgKElTX0VSUihycSkpIHsKLQkJZXJyID0gUFRSX0VSUihy cSk7Ci0JCWdvdG8gZXJyX3VucGluOwotCX0KLQotCWNzID0gaW50ZWxfcmluZ19iZWdpbihycSwg NCAqIE1BWF9JRFgpOwotCWlmIChJU19FUlIoY3MpKSB7Ci0JCWVyciA9IFBUUl9FUlIoY3MpOwot CQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQkJZ290byBlcnJfdW5waW47Ci0JfQotCi0JKmNzKysg PSBNSV9TVE9SRV9SRUdJU1RFUl9NRU1fR0VOOCB8IE1JX1VTRV9HR1RUOwotCSpjcysrID0gaTkx NV9tbWlvX3JlZ19vZmZzZXQoUklOR19TVEFSVChlbmdpbmUtPm1taW9fYmFzZSkpOwotCSpjcysr ID0gaTkxNV9nZ3R0X29mZnNldChzY3JhdGNoKSArIFJJTkdfU1RBUlRfSURYICogc2l6ZW9mKHUz Mik7Ci0JKmNzKysgPSAwOwotCi0JZXhwZWN0ZWRbUklOR19TVEFSVF9JRFhdID0gaTkxNV9nZ3R0 X29mZnNldChjZS0+cmluZy0+dm1hKTsKLQotCSpjcysrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVN X0dFTjggfCBNSV9VU0VfR0dUVDsKLQkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdf VEFJTChlbmdpbmUtPm1taW9fYmFzZSkpOwotCSpjcysrID0gaTkxNV9nZ3R0X29mZnNldChzY3Jh dGNoKSArIFJJTkdfVEFJTF9JRFggKiBzaXplb2YodTMyKTsKLQkqY3MrKyA9IDA7Ci0KLQllcnIg PSBpOTE1X3JlcXVlc3RfYXdhaXRfb2JqZWN0KHJxLCBzY3JhdGNoLT5vYmosIHRydWUpOwotCWlm ICghZXJyKQotCQllcnIgPSBpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZShzY3JhdGNoLCBycSwgRVhF Q19PQkpFQ1RfV1JJVEUpOwotCi0JaTkxNV9yZXF1ZXN0X2dldChycSk7Ci0JaTkxNV9yZXF1ZXN0 X2FkZChycSk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcnE7Ci0KLQlpbnRlbF9lbmdpbmVfZmx1 c2hfc3VibWlzc2lvbihlbmdpbmUpOwotCWV4cGVjdGVkW1JJTkdfVEFJTF9JRFhdID0gY2UtPnJp bmctPnRhaWw7Ci0KLQlpZiAoaTkxNV9yZXF1ZXN0X3dhaXQocnEsIDAsIEhaIC8gNSkgPCAwKSB7 Ci0JCWVyciA9IC1FVElNRTsKLQkJZ290byBlcnJfcnE7Ci0JfQotCi0JY3MgPSBpOTE1X2dlbV9v YmplY3RfcGluX21hcChzY3JhdGNoLT5vYmosIEk5MTVfTUFQX1dCKTsKLQlpZiAoSVNfRVJSKGNz KSkgewotCQllcnIgPSBQVFJfRVJSKGNzKTsKLQkJZ290byBlcnJfcnE7Ci0JfQotCi0JZm9yIChu ID0gMDsgbiA8IE1BWF9JRFg7IG4rKykgewotCQlpZiAoY3Nbbl0gIT0gZXhwZWN0ZWRbbl0pIHsK LQkJCXByX2VycigiJXM6IFN0b3JlZCByZWdpc3RlclslZF0gdmFsdWVbMHgleF0gZGlkIG5vdCBt YXRjaCBleHBlY3RlZFsweCV4XVxuIiwKLQkJCSAgICAgICBlbmdpbmUtPm5hbWUsIG4sIGNzW25d LCBleHBlY3RlZFtuXSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0K LQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKHNjcmF0Y2gtPm9iaik7Ci0KLWVycl9ycToKLQlp OTE1X3JlcXVlc3RfcHV0KHJxKTsKLWVycl91bnBpbjoKLQlpbnRlbF9jb250ZXh0X3VucGluKGNl KTsKLWVycl9wdXQ6Ci0JaWYgKGVyciA9PSAtRURFQURMSykgewotCQllcnIgPSBpOTE1X2dlbV93 d19jdHhfYmFja29mZigmd3cpOwotCQlpZiAoIWVycikKLQkJCWdvdG8gcmV0cnk7Ci0JfQotCWk5 MTVfZ2VtX3d3X2N0eF9maW5pKCZ3dyk7Ci0JaW50ZWxfY29udGV4dF9wdXQoY2UpOwotCXJldHVy biBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbGl2ZV9scmNfc3RhdGUodm9pZCAqYXJnKQotewotCXN0 cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l OwotCXN0cnVjdCBpOTE1X3ZtYSAqc2NyYXRjaDsKLQllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsK LQlpbnQgZXJyID0gMDsKLQotCS8qCi0JICogQ2hlY2sgdGhlIGxpdmUgcmVnaXN0ZXIgc3RhdGUg bWF0Y2hlcyB3aGF0IHdlIGV4cGVjdCBmb3IgdGhpcwotCSAqIGludGVsX2NvbnRleHQuCi0JICov Ci0KLQlzY3JhdGNoID0gY3JlYXRlX3NjcmF0Y2goZ3QpOwotCWlmIChJU19FUlIoc2NyYXRjaCkp Ci0JCXJldHVybiBQVFJfRVJSKHNjcmF0Y2gpOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwg Z3QsIGlkKSB7Ci0JCWVyciA9IF9fbGl2ZV9scmNfc3RhdGUoZW5naW5lLCBzY3JhdGNoKTsKLQkJ aWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkxNSkp Ci0JCWVyciA9IC1FSU87Ci0KLQlpOTE1X3ZtYV91bnBpbl9hbmRfcmVsZWFzZSgmc2NyYXRjaCwg MCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBncHJfbWFrZV9kaXJ0eShzdHJ1Y3Qg aW50ZWxfY29udGV4dCAqY2UpCi17Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0JdTMyICpj czsKLQlpbnQgbjsKLQotCXJxID0gaW50ZWxfY29udGV4dF9jcmVhdGVfcmVxdWVzdChjZSk7Ci0J aWYgKElTX0VSUihycSkpCi0JCXJldHVybiBQVFJfRVJSKHJxKTsKLQotCWNzID0gaW50ZWxfcmlu Z19iZWdpbihycSwgMiAqIE5VTV9HUFJfRFcgKyAyKTsKLQlpZiAoSVNfRVJSKGNzKSkgewotCQlp OTE1X3JlcXVlc3RfYWRkKHJxKTsKLQkJcmV0dXJuIFBUUl9FUlIoY3MpOwotCX0KLQotCSpjcysr ID0gTUlfTE9BRF9SRUdJU1RFUl9JTU0oTlVNX0dQUl9EVyk7Ci0JZm9yIChuID0gMDsgbiA8IE5V TV9HUFJfRFc7IG4rKykgewotCQkqY3MrKyA9IENTX0dQUihjZS0+ZW5naW5lLCBuKTsKLQkJKmNz KysgPSBTVEFDS19NQUdJQzsKLQl9Ci0JKmNzKysgPSBNSV9OT09QOwotCi0JaW50ZWxfcmluZ19h ZHZhbmNlKHJxLCBjcyk7Ci0KLQlycS0+c2NoZWQuYXR0ci5wcmlvcml0eSA9IEk5MTVfUFJJT1JJ VFlfQkFSUklFUjsKLQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQotCXJldHVybiAwOwotfQotCi1z dGF0aWMgc3RydWN0IGk5MTVfcmVxdWVzdCAqCi1fX2dwcl9yZWFkKHN0cnVjdCBpbnRlbF9jb250 ZXh0ICpjZSwgc3RydWN0IGk5MTVfdm1hICpzY3JhdGNoLCB1MzIgKnNsb3QpCi17Ci0JY29uc3Qg dTMyIG9mZnNldCA9Ci0JCWk5MTVfZ2d0dF9vZmZzZXQoY2UtPmVuZ2luZS0+c3RhdHVzX3BhZ2Uu dm1hKSArCi0JCW9mZnNldF9pbl9wYWdlKHNsb3QpOwotCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJx OwotCXUzMiAqY3M7Ci0JaW50IGVycjsKLQlpbnQgbjsKLQotCXJxID0gaW50ZWxfY29udGV4dF9j cmVhdGVfcmVxdWVzdChjZSk7Ci0JaWYgKElTX0VSUihycSkpCi0JCXJldHVybiBycTsKLQotCWNz ID0gaW50ZWxfcmluZ19iZWdpbihycSwgNiArIDQgKiBOVU1fR1BSX0RXKTsKLQlpZiAoSVNfRVJS KGNzKSkgewotCQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQkJcmV0dXJuIEVSUl9DQVNUKGNzKTsK LQl9Ci0KLQkqY3MrKyA9IE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJfRU5BQkxFOwotCSpjcysrID0g TUlfTk9PUDsKLQotCSpjcysrID0gTUlfU0VNQVBIT1JFX1dBSVQgfAotCQlNSV9TRU1BUEhPUkVf R0xPQkFMX0dUVCB8Ci0JCU1JX1NFTUFQSE9SRV9QT0xMIHwKLQkJTUlfU0VNQVBIT1JFX1NBRF9O RVFfU0REOwotCSpjcysrID0gMDsKLQkqY3MrKyA9IG9mZnNldDsKLQkqY3MrKyA9IDA7Ci0KLQlm b3IgKG4gPSAwOyBuIDwgTlVNX0dQUl9EVzsgbisrKSB7Ci0JCSpjcysrID0gTUlfU1RPUkVfUkVH SVNURVJfTUVNX0dFTjggfCBNSV9VU0VfR0dUVDsKLQkJKmNzKysgPSBDU19HUFIoY2UtPmVuZ2lu ZSwgbik7Ci0JCSpjcysrID0gaTkxNV9nZ3R0X29mZnNldChzY3JhdGNoKSArIG4gKiBzaXplb2Yo dTMyKTsKLQkJKmNzKysgPSAwOwotCX0KLQotCWk5MTVfdm1hX2xvY2soc2NyYXRjaCk7Ci0JZXJy ID0gaTkxNV9yZXF1ZXN0X2F3YWl0X29iamVjdChycSwgc2NyYXRjaC0+b2JqLCB0cnVlKTsKLQlp ZiAoIWVycikKLQkJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUoc2NyYXRjaCwgcnEsIEVY RUNfT0JKRUNUX1dSSVRFKTsKLQlpOTE1X3ZtYV91bmxvY2soc2NyYXRjaCk7Ci0KLQlpOTE1X3Jl cXVlc3RfZ2V0KHJxKTsKLQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQlpZiAoZXJyKSB7Ci0JCWk5 MTVfcmVxdWVzdF9wdXQocnEpOwotCQlycSA9IEVSUl9QVFIoZXJyKTsKLQl9Ci0KLQlyZXR1cm4g cnE7Ci19Ci0KLXN0YXRpYyBpbnQgX19saXZlX2xyY19ncHIoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lLAotCQkJICBzdHJ1Y3QgaTkxNV92bWEgKnNjcmF0Y2gsCi0JCQkgIGJvb2wgcHJl ZW1wdCkKLXsKLQl1MzIgKnNsb3QgPSBtZW1zZXQzMihlbmdpbmUtPnN0YXR1c19wYWdlLmFkZHIg KyAxMDAwLCAwLCA0KTsKLQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7Ci0Jc3RydWN0IGk5MTVf cmVxdWVzdCAqcnE7Ci0JdTMyICpjczsKLQlpbnQgZXJyOwotCWludCBuOwotCi0JaWYgKElOVEVM X0dFTihlbmdpbmUtPmk5MTUpIDwgOSAmJiBlbmdpbmUtPmNsYXNzICE9IFJFTkRFUl9DTEFTUykK LQkJcmV0dXJuIDA7IC8qIEdQUiBvbmx5IG9uIHJjczAgZm9yIGdlbjggKi8KLQotCWVyciA9IGdw cl9tYWtlX2RpcnR5KGVuZ2luZS0+a2VybmVsX2NvbnRleHQpOwotCWlmIChlcnIpCi0JCXJldHVy biBlcnI7Ci0KLQljZSA9IGludGVsX2NvbnRleHRfY3JlYXRlKGVuZ2luZSk7Ci0JaWYgKElTX0VS UihjZSkpCi0JCXJldHVybiBQVFJfRVJSKGNlKTsKLQotCXJxID0gX19ncHJfcmVhZChjZSwgc2Ny YXRjaCwgc2xvdCk7Ci0JaWYgKElTX0VSUihycSkpIHsKLQkJZXJyID0gUFRSX0VSUihycSk7Ci0J CWdvdG8gZXJyX3B1dDsKLQl9Ci0KLQllcnIgPSB3YWl0X2Zvcl9zdWJtaXQoZW5naW5lLCBycSwg SFogLyAyKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9ycTsKLQotCWlmIChwcmVlbXB0KSB7Ci0J CWVyciA9IGdwcl9tYWtlX2RpcnR5KGVuZ2luZS0+a2VybmVsX2NvbnRleHQpOwotCQlpZiAoZXJy KQotCQkJZ290byBlcnJfcnE7Ci0KLQkJZXJyID0gZW1pdF9zZW1hcGhvcmVfc2lnbmFsKGVuZ2lu ZS0+a2VybmVsX2NvbnRleHQsIHNsb3QpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfcnE7Ci0J fSBlbHNlIHsKLQkJc2xvdFswXSA9IDE7Ci0JCXdtYigpOwotCX0KLQotCWlmIChpOTE1X3JlcXVl c3Rfd2FpdChycSwgMCwgSFogLyA1KSA8IDApIHsKLQkJZXJyID0gLUVUSU1FOwotCQlnb3RvIGVy cl9ycTsKLQl9Ci0KLQljcyA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHNjcmF0Y2gtPm9iaiwg STkxNV9NQVBfV0IpOwotCWlmIChJU19FUlIoY3MpKSB7Ci0JCWVyciA9IFBUUl9FUlIoY3MpOwot CQlnb3RvIGVycl9ycTsKLQl9Ci0KLQlmb3IgKG4gPSAwOyBuIDwgTlVNX0dQUl9EVzsgbisrKSB7 Ci0JCWlmIChjc1tuXSkgewotCQkJcHJfZXJyKCIlczogR1BSWyVkXS4lcyB3YXMgbm90IHplcm8s IGZvdW5kIDB4JTA4eCFcbiIsCi0JCQkgICAgICAgZW5naW5lLT5uYW1lLAotCQkJICAgICAgIG4g LyAyLCBuICYgMSA/ICJ1ZHciIDogImxkdyIsCi0JCQkgICAgICAgY3Nbbl0pOwotCQkJZXJyID0g LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaTkxNV9nZW1fb2JqZWN0X3VucGluX21h cChzY3JhdGNoLT5vYmopOwotCi1lcnJfcnE6Ci0JbWVtc2V0MzIoJnNsb3RbMF0sIC0xLCA0KTsK LQl3bWIoKTsKLQlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKLWVycl9wdXQ6Ci0JaW50ZWxfY29udGV4 dF9wdXQoY2UpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbGl2ZV9scmNfZ3ByKHZv aWQgKmFyZykKLXsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOwotCXN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKmVuZ2luZTsKLQlzdHJ1Y3QgaTkxNV92bWEgKnNjcmF0Y2g7Ci0JZW51bSBpbnRl bF9lbmdpbmVfaWQgaWQ7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgR1BS IHJlZ2lzdGVycyBhcmUgY2xlYXJlZCBpbiBuZXcgY29udGV4dHMgYXMgd2UgbmVlZAotCSAqIHRv IGF2b2lkIGxlYWtpbmcgYW55IGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgY29udGV4dHMuCi0J ICovCi0KLQlzY3JhdGNoID0gY3JlYXRlX3NjcmF0Y2goZ3QpOwotCWlmIChJU19FUlIoc2NyYXRj aCkpCi0JCXJldHVybiBQVFJfRVJSKHNjcmF0Y2gpOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2lu ZSwgZ3QsIGlkKSB7Ci0JCXN0X2VuZ2luZV9oZWFydGJlYXRfZGlzYWJsZShlbmdpbmUpOwotCi0J CWVyciA9IF9fbGl2ZV9scmNfZ3ByKGVuZ2luZSwgc2NyYXRjaCwgZmFsc2UpOwotCQlpZiAoZXJy KQotCQkJZ290byBlcnI7Ci0KLQkJZXJyID0gX19saXZlX2xyY19ncHIoZW5naW5lLCBzY3JhdGNo LCB0cnVlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyOwotCi1lcnI6Ci0JCXN0X2VuZ2luZV9o ZWFydGJlYXRfZW5hYmxlKGVuZ2luZSk7Ci0JCWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkxNSkp Ci0JCQllcnIgPSAtRUlPOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JaTkxNV92bWFf dW5waW5fYW5kX3JlbGVhc2UoJnNjcmF0Y2gsIDApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRp YyBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICoKLWNyZWF0ZV90aW1lc3RhbXAoc3RydWN0IGludGVsX2Nv bnRleHQgKmNlLCB2b2lkICpzbG90LCBpbnQgaWR4KQotewotCWNvbnN0IHUzMiBvZmZzZXQgPQot CQlpOTE1X2dndHRfb2Zmc2V0KGNlLT5lbmdpbmUtPnN0YXR1c19wYWdlLnZtYSkgKwotCQlvZmZz ZXRfaW5fcGFnZShzbG90KTsKLQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKLQl1MzIgKmNzOwot CWludCBlcnI7Ci0KLQlycSA9IGludGVsX2NvbnRleHRfY3JlYXRlX3JlcXVlc3QoY2UpOwotCWlm IChJU19FUlIocnEpKQotCQlyZXR1cm4gcnE7Ci0KLQljcyA9IGludGVsX3JpbmdfYmVnaW4ocnEs IDEwKTsKLQlpZiAoSVNfRVJSKGNzKSkgewotCQllcnIgPSBQVFJfRVJSKGNzKTsKLQkJZ290byBl cnI7Ci0JfQotCi0JKmNzKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0VOQUJMRTsKLQkqY3Mr KyA9IE1JX05PT1A7Ci0KLQkqY3MrKyA9IE1JX1NFTUFQSE9SRV9XQUlUIHwKLQkJTUlfU0VNQVBI T1JFX0dMT0JBTF9HVFQgfAotCQlNSV9TRU1BUEhPUkVfUE9MTCB8Ci0JCU1JX1NFTUFQSE9SRV9T QURfTkVRX1NERDsKLQkqY3MrKyA9IDA7Ci0JKmNzKysgPSBvZmZzZXQ7Ci0JKmNzKysgPSAwOwot Ci0JKmNzKysgPSBNSV9TVE9SRV9SRUdJU1RFUl9NRU1fR0VOOCB8IE1JX1VTRV9HR1RUOwotCSpj cysrID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19DVFhfVElNRVNUQU1QKHJxLT5lbmdpbmUt Pm1taW9fYmFzZSkpOwotCSpjcysrID0gb2Zmc2V0ICsgaWR4ICogc2l6ZW9mKHUzMik7Ci0JKmNz KysgPSAwOwotCi0JaW50ZWxfcmluZ19hZHZhbmNlKHJxLCBjcyk7Ci0KLQlycS0+c2NoZWQuYXR0 ci5wcmlvcml0eSA9IEk5MTVfUFJJT1JJVFlfTUFTSzsKLQllcnIgPSAwOwotZXJyOgotCWk5MTVf cmVxdWVzdF9nZXQocnEpOwotCWk5MTVfcmVxdWVzdF9hZGQocnEpOwotCWlmIChlcnIpIHsKLQkJ aTkxNV9yZXF1ZXN0X3B1dChycSk7Ci0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0JfQotCi0JcmV0 dXJuIHJxOwotfQotCi1zdHJ1Y3QgbHJjX3RpbWVzdGFtcCB7Ci0Jc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lOwotCXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZVsyXTsKLQl1MzIgcG9pc29u OwotfTsKLQotc3RhdGljIGJvb2wgdGltZXN0YW1wX2FkdmFuY2VkKHUzMiBzdGFydCwgdTMyIGVu ZCkKLXsKLQlyZXR1cm4gKHMzMikoZW5kIC0gc3RhcnQpID4gMDsKLX0KLQotc3RhdGljIGludCBf X2xyY190aW1lc3RhbXAoY29uc3Qgc3RydWN0IGxyY190aW1lc3RhbXAgKmFyZywgYm9vbCBwcmVl bXB0KQotewotCXUzMiAqc2xvdCA9IG1lbXNldDMyKGFyZy0+ZW5naW5lLT5zdGF0dXNfcGFnZS5h ZGRyICsgMTAwMCwgMCwgNCk7Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0JdTMyIHRpbWVz dGFtcDsKLQlpbnQgZXJyID0gMDsKLQotCWFyZy0+Y2VbMF0tPmxyY19yZWdfc3RhdGVbQ1RYX1RJ TUVTVEFNUF0gPSBhcmctPnBvaXNvbjsKLQlycSA9IGNyZWF0ZV90aW1lc3RhbXAoYXJnLT5jZVsw XSwgc2xvdCwgMSk7Ci0JaWYgKElTX0VSUihycSkpCi0JCXJldHVybiBQVFJfRVJSKHJxKTsKLQot CWVyciA9IHdhaXRfZm9yX3N1Ym1pdChycS0+ZW5naW5lLCBycSwgSFogLyAyKTsKLQlpZiAoZXJy KQotCQlnb3RvIGVycjsKLQotCWlmIChwcmVlbXB0KSB7Ci0JCWFyZy0+Y2VbMV0tPmxyY19yZWdf c3RhdGVbQ1RYX1RJTUVTVEFNUF0gPSAweGRlYWRiZWVmOwotCQllcnIgPSBlbWl0X3NlbWFwaG9y ZV9zaWduYWwoYXJnLT5jZVsxXSwgc2xvdCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycjsKLQl9 IGVsc2UgewotCQlzbG90WzBdID0gMTsKLQkJd21iKCk7Ci0JfQotCi0JLyogQW5kIHdhaXQgZm9y IHN3aXRjaCB0byBrZXJuZWwgKHRvIHNhdmUgb3VyIGNvbnRleHQgdG8gbWVtb3J5KSAqLwotCWVy ciA9IGNvbnRleHRfZmx1c2goYXJnLT5jZVswXSwgSFogLyAyKTsKLQlpZiAoZXJyKQotCQlnb3Rv IGVycjsKLQotCWlmICghdGltZXN0YW1wX2FkdmFuY2VkKGFyZy0+cG9pc29uLCBzbG90WzFdKSkg ewotCQlwcl9lcnIoIiVzKCVzKTogaW52YWxpZCB0aW1lc3RhbXAgb24gcmVzdG9yZSwgY29udGV4 dDoleCwgcmVxdWVzdDoleFxuIiwKLQkJICAgICAgIGFyZy0+ZW5naW5lLT5uYW1lLCBwcmVlbXB0 ID8gInByZWVtcHQiIDogInNpbXBsZSIsCi0JCSAgICAgICBhcmctPnBvaXNvbiwgc2xvdFsxXSk7 Ci0JCWVyciA9IC1FSU5WQUw7Ci0JfQotCi0JdGltZXN0YW1wID0gUkVBRF9PTkNFKGFyZy0+Y2Vb MF0tPmxyY19yZWdfc3RhdGVbQ1RYX1RJTUVTVEFNUF0pOwotCWlmICghdGltZXN0YW1wX2FkdmFu Y2VkKHNsb3RbMV0sIHRpbWVzdGFtcCkpIHsKLQkJcHJfZXJyKCIlcyglcyk6IGludmFsaWQgdGlt ZXN0YW1wIG9uIHNhdmUsIHJlcXVlc3Q6JXgsIGNvbnRleHQ6JXhcbiIsCi0JCSAgICAgICBhcmct PmVuZ2luZS0+bmFtZSwgcHJlZW1wdCA/ICJwcmVlbXB0IiA6ICJzaW1wbGUiLAotCQkgICAgICAg c2xvdFsxXSwgdGltZXN0YW1wKTsKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0KLWVycjoKLQltZW1z ZXQzMihzbG90LCAtMSwgNCk7Ci0JaTkxNV9yZXF1ZXN0X3B1dChycSk7Ci0JcmV0dXJuIGVycjsK LX0KLQotc3RhdGljIGludCBsaXZlX2xyY190aW1lc3RhbXAodm9pZCAqYXJnKQotewotCXN0cnVj dCBscmNfdGltZXN0YW1wIGRhdGEgPSB7fTsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOwot CWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwotCWNvbnN0IHUzMiBwb2lzb25bXSA9IHsKLQkJMCwK LQkJUzMyX01BWCwKLQkJKHUzMilTMzJfTUFYICsgMSwKLQkJVTMyX01BWCwKLQl9OwotCi0JLyoK LQkgKiBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgc2F2ZWQgYW5kIHJl c3RvcmUgYWNyb3NzCi0JICogY29udGV4dCBzd2l0Y2hlcyBhbmQgaXMgbW9ub3RvbmljLgotCSAq Ci0JICogU28gd2UgZG8gdGhpcyB3aXRoIGEgbGl0dGxlIGJpdCBvZiBMUkMgcG9pc29uaW5nIHRv IGNoZWNrIHZhcmlvdXMKLQkgKiBib3VuZGFyeSBjb25kaXRpb25zLCBhbmQgc2VlIHdoYXQgaGFw cGVucyBpZiB3ZSBwcmVlbXB0IHRoZSBjb250ZXh0Ci0JICogd2l0aCBhIHNlY29uZCByZXF1ZXN0 IChjYXJyeWluZyBtb3JlIHBvaXNvbiBpbnRvIHRoZSB0aW1lc3RhbXApLgotCSAqLwotCi0JZm9y X2VhY2hfZW5naW5lKGRhdGEuZW5naW5lLCBndCwgaWQpIHsKLQkJaW50IGksIGVyciA9IDA7Ci0K LQkJc3RfZW5naW5lX2hlYXJ0YmVhdF9kaXNhYmxlKGRhdGEuZW5naW5lKTsKLQotCQlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLmNlKTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgaW50ZWxfY29u dGV4dCAqdG1wOwotCi0JCQl0bXAgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZShkYXRhLmVuZ2luZSk7 Ci0JCQlpZiAoSVNfRVJSKHRtcCkpIHsKLQkJCQllcnIgPSBQVFJfRVJSKHRtcCk7Ci0JCQkJZ290 byBlcnI7Ci0JCQl9Ci0KLQkJCWVyciA9IGludGVsX2NvbnRleHRfcGluKHRtcCk7Ci0JCQlpZiAo ZXJyKSB7Ci0JCQkJaW50ZWxfY29udGV4dF9wdXQodG1wKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0K LQotCQkJZGF0YS5jZVtpXSA9IHRtcDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKHBvaXNvbik7IGkrKykgewotCQkJZGF0YS5wb2lzb24gPSBwb2lzb25baV07Ci0KLQkJCWVy ciA9IF9fbHJjX3RpbWVzdGFtcCgmZGF0YSwgZmFsc2UpOwotCQkJaWYgKGVycikKLQkJCQlicmVh azsKLQotCQkJZXJyID0gX19scmNfdGltZXN0YW1wKCZkYXRhLCB0cnVlKTsKLQkJCWlmIChlcnIp Ci0JCQkJYnJlYWs7Ci0JCX0KLQotZXJyOgotCQlzdF9lbmdpbmVfaGVhcnRiZWF0X2VuYWJsZShk YXRhLmVuZ2luZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEuY2UpOyBpKysp IHsKLQkJCWlmICghZGF0YS5jZVtpXSkKLQkJCQlicmVhazsKLQotCQkJaW50ZWxfY29udGV4dF91 bnBpbihkYXRhLmNlW2ldKTsKLQkJCWludGVsX2NvbnRleHRfcHV0KGRhdGEuY2VbaV0pOwotCQl9 Ci0KLQkJaWYgKGlndF9mbHVzaF90ZXN0KGd0LT5pOTE1KSkKLQkJCWVyciA9IC1FSU87Ci0JCWlm IChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3Ry dWN0IGk5MTVfdm1hICoKLWNyZWF0ZV91c2VyX3ZtYShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JaW50IGVycjsKLQotCW9iaiA9IGk5MTVf Z2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwodm0tPmk5MTUsIHNpemUpOwotCWlmIChJU19FUlIo b2JqKSkKLQkJcmV0dXJuIEVSUl9DQVNUKG9iaik7Ci0KLQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5j ZShvYmosIHZtLCBOVUxMKTsKLQlpZiAoSVNfRVJSKHZtYSkpIHsKLQkJaTkxNV9nZW1fb2JqZWN0 X3B1dChvYmopOwotCQlyZXR1cm4gdm1hOwotCX0KLQotCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEs IDAsIDAsIFBJTl9VU0VSKTsKLQlpZiAoZXJyKSB7Ci0JCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQl9Ci0KLQlyZXR1cm4gdm1hOwotfQotCi1zdGF0 aWMgc3RydWN0IGk5MTVfdm1hICoKLXN0b3JlX2NvbnRleHQoc3RydWN0IGludGVsX2NvbnRleHQg KmNlLCBzdHJ1Y3QgaTkxNV92bWEgKnNjcmF0Y2gpCi17Ci0Jc3RydWN0IGk5MTVfdm1hICpiYXRj aDsKLQl1MzIgZHcsIHgsICpjcywgKmh3OwotCXUzMiAqZGVmYXVsdHM7Ci0KLQliYXRjaCA9IGNy ZWF0ZV91c2VyX3ZtYShjZS0+dm0sIFNaXzY0Syk7Ci0JaWYgKElTX0VSUihiYXRjaCkpCi0JCXJl dHVybiBiYXRjaDsKLQotCWNzID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAoYmF0Y2gtPm9iaiwg STkxNV9NQVBfV0MpOwotCWlmIChJU19FUlIoY3MpKSB7Ci0JCWk5MTVfdm1hX3B1dChiYXRjaCk7 Ci0JCXJldHVybiBFUlJfQ0FTVChjcyk7Ci0JfQotCi0JZGVmYXVsdHMgPSBzaG1lbV9waW5fbWFw KGNlLT5lbmdpbmUtPmRlZmF1bHRfc3RhdGUpOwotCWlmICghZGVmYXVsdHMpIHsKLQkJaTkxNV9n ZW1fb2JqZWN0X3VucGluX21hcChiYXRjaC0+b2JqKTsKLQkJaTkxNV92bWFfcHV0KGJhdGNoKTsK LQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JeCA9IDA7Ci0JZHcgPSAwOwotCWh3 ID0gZGVmYXVsdHM7Ci0JaHcgKz0gTFJDX1NUQVRFX09GRlNFVCAvIHNpemVvZigqaHcpOwotCWRv IHsKLQkJdTMyIGxlbiA9IGh3W2R3XSAmIDB4N2Y7Ci0KLQkJaWYgKGh3W2R3XSA9PSAwKSB7Ci0J CQlkdysrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKGh3W2R3XSAmIEdFTk1BU0soMzEs IDIzKSkgIT0gTUlfSU5TVFIoMHgyMiwgMCkpIHsKLQkJCWR3ICs9IGxlbiArIDI7Ci0JCQljb250 aW51ZTsKLQkJfQotCi0JCWR3Kys7Ci0JCWxlbiA9IChsZW4gKyAxKSAvIDI7Ci0JCXdoaWxlIChs ZW4tLSkgewotCQkJKmNzKysgPSBNSV9TVE9SRV9SRUdJU1RFUl9NRU1fR0VOODsKLQkJCSpjcysr ID0gaHdbZHddOwotCQkJKmNzKysgPSBsb3dlcl8zMl9iaXRzKHNjcmF0Y2gtPm5vZGUuc3RhcnQg KyB4KTsKLQkJCSpjcysrID0gdXBwZXJfMzJfYml0cyhzY3JhdGNoLT5ub2RlLnN0YXJ0ICsgeCk7 Ci0KLQkJCWR3ICs9IDI7Ci0JCQl4ICs9IDQ7Ci0JCX0KLQl9IHdoaWxlIChkdyA8IFBBR0VfU0la RSAvIHNpemVvZih1MzIpICYmCi0JCSAoaHdbZHddICYgfkJJVCgwKSkgIT0gTUlfQkFUQ0hfQlVG RkVSX0VORCk7Ci0KLQkqY3MrKyA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7Ci0KLQlzaG1lbV91bnBp bl9tYXAoY2UtPmVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSwgZGVmYXVsdHMpOwotCi0JaTkxNV9nZW1f b2JqZWN0X2ZsdXNoX21hcChiYXRjaC0+b2JqKTsKLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFw KGJhdGNoLT5vYmopOwotCi0JcmV0dXJuIGJhdGNoOwotfQotCi1zdGF0aWMgaW50IG1vdmVfdG9f YWN0aXZlKHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxLAotCQkJICBzdHJ1Y3QgaTkxNV92bWEgKnZt YSwKLQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKQotewotCWludCBlcnI7Ci0KLQlpOTE1X3ZtYV9s b2NrKHZtYSk7Ci0JZXJyID0gaTkxNV9yZXF1ZXN0X2F3YWl0X29iamVjdChycSwgdm1hLT5vYmos IGZsYWdzKTsKLQlpZiAoIWVycikKLQkJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUodm1h LCBycSwgZmxhZ3MpOwotCWk5MTVfdm1hX3VubG9jayh2bWEpOwotCi0JcmV0dXJuIGVycjsKLX0K LQotc3RhdGljIHN0cnVjdCBpOTE1X3JlcXVlc3QgKgotcmVjb3JkX3JlZ2lzdGVycyhzdHJ1Y3Qg aW50ZWxfY29udGV4dCAqY2UsCi0JCSBzdHJ1Y3QgaTkxNV92bWEgKmJlZm9yZSwKLQkJIHN0cnVj dCBpOTE1X3ZtYSAqYWZ0ZXIsCi0JCSB1MzIgKnNlbWEpCi17Ci0Jc3RydWN0IGk5MTVfdm1hICpi X2JlZm9yZSwgKmJfYWZ0ZXI7Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0JdTMyICpjczsK LQlpbnQgZXJyOwotCi0JYl9iZWZvcmUgPSBzdG9yZV9jb250ZXh0KGNlLCBiZWZvcmUpOwotCWlm IChJU19FUlIoYl9iZWZvcmUpKQotCQlyZXR1cm4gRVJSX0NBU1QoYl9iZWZvcmUpOwotCi0JYl9h ZnRlciA9IHN0b3JlX2NvbnRleHQoY2UsIGFmdGVyKTsKLQlpZiAoSVNfRVJSKGJfYWZ0ZXIpKSB7 Ci0JCXJxID0gRVJSX0NBU1QoYl9hZnRlcik7Ci0JCWdvdG8gZXJyX2JlZm9yZTsKLQl9Ci0KLQly cSA9IGludGVsX2NvbnRleHRfY3JlYXRlX3JlcXVlc3QoY2UpOwotCWlmIChJU19FUlIocnEpKQot CQlnb3RvIGVycl9hZnRlcjsKLQotCWVyciA9IG1vdmVfdG9fYWN0aXZlKHJxLCBiZWZvcmUsIEVY RUNfT0JKRUNUX1dSSVRFKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9ycTsKLQotCWVyciA9IG1v dmVfdG9fYWN0aXZlKHJxLCBiX2JlZm9yZSwgMCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcnE7 Ci0KLQllcnIgPSBtb3ZlX3RvX2FjdGl2ZShycSwgYWZ0ZXIsIEVYRUNfT0JKRUNUX1dSSVRFKTsK LQlpZiAoZXJyKQotCQlnb3RvIGVycl9ycTsKLQotCWVyciA9IG1vdmVfdG9fYWN0aXZlKHJxLCBi X2FmdGVyLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9ycTsKLQotCWNzID0gaW50ZWxfcmlu Z19iZWdpbihycSwgMTQpOwotCWlmIChJU19FUlIoY3MpKSB7Ci0JCWVyciA9IFBUUl9FUlIoY3Mp OwotCQlnb3RvIGVycl9ycTsKLQl9Ci0KLQkqY3MrKyA9IE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJf RElTQUJMRTsKLQkqY3MrKyA9IE1JX0JBVENIX0JVRkZFUl9TVEFSVF9HRU44IHwgQklUKDgpOwot CSpjcysrID0gbG93ZXJfMzJfYml0cyhiX2JlZm9yZS0+bm9kZS5zdGFydCk7Ci0JKmNzKysgPSB1 cHBlcl8zMl9iaXRzKGJfYmVmb3JlLT5ub2RlLnN0YXJ0KTsKLQotCSpjcysrID0gTUlfQVJCX09O X09GRiB8IE1JX0FSQl9FTkFCTEU7Ci0JKmNzKysgPSBNSV9TRU1BUEhPUkVfV0FJVCB8Ci0JCU1J X1NFTUFQSE9SRV9HTE9CQUxfR1RUIHwKLQkJTUlfU0VNQVBIT1JFX1BPTEwgfAotCQlNSV9TRU1B UEhPUkVfU0FEX05FUV9TREQ7Ci0JKmNzKysgPSAwOwotCSpjcysrID0gaTkxNV9nZ3R0X29mZnNl dChjZS0+ZW5naW5lLT5zdGF0dXNfcGFnZS52bWEpICsKLQkJb2Zmc2V0X2luX3BhZ2Uoc2VtYSk7 Ci0JKmNzKysgPSAwOwotCSpjcysrID0gTUlfTk9PUDsKLQotCSpjcysrID0gTUlfQVJCX09OX09G RiB8IE1JX0FSQl9ESVNBQkxFOwotCSpjcysrID0gTUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0dFTjgg fCBCSVQoOCk7Ci0JKmNzKysgPSBsb3dlcl8zMl9iaXRzKGJfYWZ0ZXItPm5vZGUuc3RhcnQpOwot CSpjcysrID0gdXBwZXJfMzJfYml0cyhiX2FmdGVyLT5ub2RlLnN0YXJ0KTsKLQotCWludGVsX3Jp bmdfYWR2YW5jZShycSwgY3MpOwotCi0JV1JJVEVfT05DRSgqc2VtYSwgMCk7Ci0JaTkxNV9yZXF1 ZXN0X2dldChycSk7Ci0JaTkxNV9yZXF1ZXN0X2FkZChycSk7Ci1lcnJfYWZ0ZXI6Ci0JaTkxNV92 bWFfcHV0KGJfYWZ0ZXIpOwotZXJyX2JlZm9yZToKLQlpOTE1X3ZtYV9wdXQoYl9iZWZvcmUpOwot CXJldHVybiBycTsKLQotZXJyX3JxOgotCWk5MTVfcmVxdWVzdF9hZGQocnEpOwotCXJxID0gRVJS X1BUUihlcnIpOwotCWdvdG8gZXJyX2FmdGVyOwotfQotCi1zdGF0aWMgc3RydWN0IGk5MTVfdm1h ICpsb2FkX2NvbnRleHQoc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1MzIgcG9pc29uKQotewot CXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7Ci0JdTMyIGR3LCAqY3MsICpodzsKLQl1MzIgKmRlZmF1 bHRzOwotCi0JYmF0Y2ggPSBjcmVhdGVfdXNlcl92bWEoY2UtPnZtLCBTWl82NEspOwotCWlmIChJ U19FUlIoYmF0Y2gpKQotCQlyZXR1cm4gYmF0Y2g7Ci0KLQljcyA9IGk5MTVfZ2VtX29iamVjdF9w aW5fbWFwKGJhdGNoLT5vYmosIEk5MTVfTUFQX1dDKTsKLQlpZiAoSVNfRVJSKGNzKSkgewotCQlp OTE1X3ZtYV9wdXQoYmF0Y2gpOwotCQlyZXR1cm4gRVJSX0NBU1QoY3MpOwotCX0KLQotCWRlZmF1 bHRzID0gc2htZW1fcGluX21hcChjZS0+ZW5naW5lLT5kZWZhdWx0X3N0YXRlKTsKLQlpZiAoIWRl ZmF1bHRzKSB7Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAoYmF0Y2gtPm9iaik7Ci0JCWk5 MTVfdm1hX3B1dChiYXRjaCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCWR3 ID0gMDsKLQlodyA9IGRlZmF1bHRzOwotCWh3ICs9IExSQ19TVEFURV9PRkZTRVQgLyBzaXplb2Yo Kmh3KTsKLQlkbyB7Ci0JCXUzMiBsZW4gPSBod1tkd10gJiAweDdmOwotCi0JCWlmIChod1tkd10g PT0gMCkgewotCQkJZHcrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChod1tkd10gJiBH RU5NQVNLKDMxLCAyMykpICE9IE1JX0lOU1RSKDB4MjIsIDApKSB7Ci0JCQlkdyArPSBsZW4gKyAy OwotCQkJY29udGludWU7Ci0JCX0KLQotCQlkdysrOwotCQlsZW4gPSAobGVuICsgMSkgLyAyOwot CQkqY3MrKyA9IE1JX0xPQURfUkVHSVNURVJfSU1NKGxlbik7Ci0JCXdoaWxlIChsZW4tLSkgewot CQkJKmNzKysgPSBod1tkd107Ci0JCQkqY3MrKyA9IHBvaXNvbjsKLQkJCWR3ICs9IDI7Ci0JCX0K LQl9IHdoaWxlIChkdyA8IFBBR0VfU0laRSAvIHNpemVvZih1MzIpICYmCi0JCSAoaHdbZHddICYg fkJJVCgwKSkgIT0gTUlfQkFUQ0hfQlVGRkVSX0VORCk7Ci0KLQkqY3MrKyA9IE1JX0JBVENIX0JV RkZFUl9FTkQ7Ci0KLQlzaG1lbV91bnBpbl9tYXAoY2UtPmVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSwg ZGVmYXVsdHMpOwotCi0JaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX21hcChiYXRjaC0+b2JqKTsKLQlp OTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKGJhdGNoLT5vYmopOwotCi0JcmV0dXJuIGJhdGNoOwot fQotCi1zdGF0aWMgaW50IHBvaXNvbl9yZWdpc3RlcnMoc3RydWN0IGludGVsX2NvbnRleHQgKmNl LCB1MzIgcG9pc29uLCB1MzIgKnNlbWEpCi17Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0J c3RydWN0IGk5MTVfdm1hICpiYXRjaDsKLQl1MzIgKmNzOwotCWludCBlcnI7Ci0KLQliYXRjaCA9 IGxvYWRfY29udGV4dChjZSwgcG9pc29uKTsKLQlpZiAoSVNfRVJSKGJhdGNoKSkKLQkJcmV0dXJu IFBUUl9FUlIoYmF0Y2gpOwotCi0JcnEgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZV9yZXF1ZXN0KGNl KTsKLQlpZiAoSVNfRVJSKHJxKSkgewotCQllcnIgPSBQVFJfRVJSKHJxKTsKLQkJZ290byBlcnJf YmF0Y2g7Ci0JfQotCi0JZXJyID0gbW92ZV90b19hY3RpdmUocnEsIGJhdGNoLCAwKTsKLQlpZiAo ZXJyKQotCQlnb3RvIGVycl9ycTsKLQotCWNzID0gaW50ZWxfcmluZ19iZWdpbihycSwgOCk7Ci0J aWYgKElTX0VSUihjcykpIHsKLQkJZXJyID0gUFRSX0VSUihjcyk7Ci0JCWdvdG8gZXJyX3JxOwot CX0KLQotCSpjcysrID0gTUlfQVJCX09OX09GRiB8IE1JX0FSQl9ESVNBQkxFOwotCSpjcysrID0g TUlfQkFUQ0hfQlVGRkVSX1NUQVJUX0dFTjggfCBCSVQoOCk7Ci0JKmNzKysgPSBsb3dlcl8zMl9i aXRzKGJhdGNoLT5ub2RlLnN0YXJ0KTsKLQkqY3MrKyA9IHVwcGVyXzMyX2JpdHMoYmF0Y2gtPm5v ZGUuc3RhcnQpOwotCi0JKmNzKysgPSBNSV9TVE9SRV9EV09SRF9JTU1fR0VONCB8IE1JX1VTRV9H R1RUOwotCSpjcysrID0gaTkxNV9nZ3R0X29mZnNldChjZS0+ZW5naW5lLT5zdGF0dXNfcGFnZS52 bWEpICsKLQkJb2Zmc2V0X2luX3BhZ2Uoc2VtYSk7Ci0JKmNzKysgPSAwOwotCSpjcysrID0gMTsK LQotCWludGVsX3JpbmdfYWR2YW5jZShycSwgY3MpOwotCi0JcnEtPnNjaGVkLmF0dHIucHJpb3Jp dHkgPSBJOTE1X1BSSU9SSVRZX0JBUlJJRVI7Ci1lcnJfcnE6Ci0JaTkxNV9yZXF1ZXN0X2FkZChy cSk7Ci1lcnJfYmF0Y2g6Ci0JaTkxNV92bWFfcHV0KGJhdGNoKTsKLQlyZXR1cm4gZXJyOwotfQot Ci1zdGF0aWMgYm9vbCBpc19tb3ZpbmcodTMyIGEsIHUzMiBiKQotewotCXJldHVybiBhICE9IGI7 Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGFyZV9pc29sYXRpb24oc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lLAotCQkJICAgICBzdHJ1Y3QgaTkxNV92bWEgKnJlZlsyXSwKLQkJCSAgICAgc3Ry dWN0IGk5MTVfdm1hICpyZXN1bHRbMl0sCi0JCQkgICAgIHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSwKLQkJCSAgICAgdTMyIHBvaXNvbikKLXsKLQl1MzIgeCwgZHcsICpodywgKmxyYzsKLQl1MzIg KkFbMl0sICpCWzJdOwotCXUzMiAqZGVmYXVsdHM7Ci0JaW50IGVyciA9IDA7Ci0KLQlBWzBdID0g aTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAocmVmWzBdLT5vYmosIEk5MTVfTUFQX1dDKTsKLQlpZiAo SVNfRVJSKEFbMF0pKQotCQlyZXR1cm4gUFRSX0VSUihBWzBdKTsKLQotCUFbMV0gPSBpOTE1X2dl bV9vYmplY3RfcGluX21hcChyZWZbMV0tPm9iaiwgSTkxNV9NQVBfV0MpOwotCWlmIChJU19FUlIo QVsxXSkpIHsKLQkJZXJyID0gUFRSX0VSUihBWzFdKTsKLQkJZ290byBlcnJfQTA7Ci0JfQotCi0J QlswXSA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHJlc3VsdFswXS0+b2JqLCBJOTE1X01BUF9X Qyk7Ci0JaWYgKElTX0VSUihCWzBdKSkgewotCQllcnIgPSBQVFJfRVJSKEJbMF0pOwotCQlnb3Rv IGVycl9BMTsKLQl9Ci0KLQlCWzFdID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAocmVzdWx0WzFd LT5vYmosIEk5MTVfTUFQX1dDKTsKLQlpZiAoSVNfRVJSKEJbMV0pKSB7Ci0JCWVyciA9IFBUUl9F UlIoQlsxXSk7Ci0JCWdvdG8gZXJyX0IwOwotCX0KLQotCWxyYyA9IGk5MTVfZ2VtX29iamVjdF9w aW5fbWFwKGNlLT5zdGF0ZS0+b2JqLAotCQkJCSAgICAgIGk5MTVfY29oZXJlbnRfbWFwX3R5cGUo ZW5naW5lLT5pOTE1KSk7Ci0JaWYgKElTX0VSUihscmMpKSB7Ci0JCWVyciA9IFBUUl9FUlIobHJj KTsKLQkJZ290byBlcnJfQjE7Ci0JfQotCWxyYyArPSBMUkNfU1RBVEVfT0ZGU0VUIC8gc2l6ZW9m KCpodyk7Ci0KLQlkZWZhdWx0cyA9IHNobWVtX3Bpbl9tYXAoY2UtPmVuZ2luZS0+ZGVmYXVsdF9z dGF0ZSk7Ci0JaWYgKCFkZWZhdWx0cykgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9s cmM7Ci0JfQotCi0JeCA9IDA7Ci0JZHcgPSAwOwotCWh3ID0gZGVmYXVsdHM7Ci0JaHcgKz0gTFJD X1NUQVRFX09GRlNFVCAvIHNpemVvZigqaHcpOwotCWRvIHsKLQkJdTMyIGxlbiA9IGh3W2R3XSAm IDB4N2Y7Ci0KLQkJaWYgKGh3W2R3XSA9PSAwKSB7Ci0JCQlkdysrOwotCQkJY29udGludWU7Ci0J CX0KLQotCQlpZiAoKGh3W2R3XSAmIEdFTk1BU0soMzEsIDIzKSkgIT0gTUlfSU5TVFIoMHgyMiwg MCkpIHsKLQkJCWR3ICs9IGxlbiArIDI7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWR3Kys7Ci0J CWxlbiA9IChsZW4gKyAxKSAvIDI7Ci0JCXdoaWxlIChsZW4tLSkgewotCQkJaWYgKCFpc19tb3Zp bmcoQVswXVt4XSwgQVsxXVt4XSkgJiYKLQkJCSAgICAoQVswXVt4XSAhPSBCWzBdW3hdIHx8IEFb MV1beF0gIT0gQlsxXVt4XSkpIHsKLQkJCQlzd2l0Y2ggKGh3W2R3XSAmIDQwOTUpIHsKLQkJCQlj YXNlIDB4MzA6IC8qIFJJTkdfSEVBRCAqLwotCQkJCWNhc2UgMHgzNDogLyogUklOR19UQUlMICov Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJcHJfZXJyKCIlc1slZF06IE1pc21h dGNoIGZvciByZWdpc3RlciAlNHgsIGRlZmF1bHQgJTA4eCwgcmVmZXJlbmNlICUwOHgsIHJlc3Vs dCAoJTA4eCwgJTA4eCksIHBvaXNvbiAlMDh4LCBjb250ZXh0ICUwOHhcbiIsCi0JCQkJCSAgICAg ICBlbmdpbmUtPm5hbWUsIGR3LAotCQkJCQkgICAgICAgaHdbZHddLCBod1tkdyArIDFdLAotCQkJ CQkgICAgICAgQVswXVt4XSwgQlswXVt4XSwgQlsxXVt4XSwKLQkJCQkJICAgICAgIHBvaXNvbiwg bHJjW2R3ICsgMV0pOwotCQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCX0KLQkJCX0KLQkJCWR3ICs9 IDI7Ci0JCQl4Kys7Ci0JCX0KLQl9IHdoaWxlIChkdyA8IFBBR0VfU0laRSAvIHNpemVvZih1MzIp ICYmCi0JCSAoaHdbZHddICYgfkJJVCgwKSkgIT0gTUlfQkFUQ0hfQlVGRkVSX0VORCk7Ci0KLQlz aG1lbV91bnBpbl9tYXAoY2UtPmVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSwgZGVmYXVsdHMpOwotZXJy X2xyYzoKLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKGNlLT5zdGF0ZS0+b2JqKTsKLWVycl9C MToKLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKHJlc3VsdFsxXS0+b2JqKTsKLWVycl9CMDoK LQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKHJlc3VsdFswXS0+b2JqKTsKLWVycl9BMToKLQlp OTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKHJlZlsxXS0+b2JqKTsKLWVycl9BMDoKLQlpOTE1X2dl bV9vYmplY3RfdW5waW5fbWFwKHJlZlswXS0+b2JqKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0 aWMgaW50IF9fbHJjX2lzb2xhdGlvbihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsIHUz MiBwb2lzb24pCi17Ci0JdTMyICpzZW1hID0gbWVtc2V0MzIoZW5naW5lLT5zdGF0dXNfcGFnZS5h ZGRyICsgMTAwMCwgMCwgMSk7Ci0Jc3RydWN0IGk5MTVfdm1hICpyZWZbMl0sICpyZXN1bHRbMl07 Ci0Jc3RydWN0IGludGVsX2NvbnRleHQgKkEsICpCOwotCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJx OwotCWludCBlcnI7Ci0KLQlBID0gaW50ZWxfY29udGV4dF9jcmVhdGUoZW5naW5lKTsKLQlpZiAo SVNfRVJSKEEpKQotCQlyZXR1cm4gUFRSX0VSUihBKTsKLQotCUIgPSBpbnRlbF9jb250ZXh0X2Ny ZWF0ZShlbmdpbmUpOwotCWlmIChJU19FUlIoQikpIHsKLQkJZXJyID0gUFRSX0VSUihCKTsKLQkJ Z290byBlcnJfQTsKLQl9Ci0KLQlyZWZbMF0gPSBjcmVhdGVfdXNlcl92bWEoQS0+dm0sIFNaXzY0 Syk7Ci0JaWYgKElTX0VSUihyZWZbMF0pKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVmWzBdKTsKLQkJ Z290byBlcnJfQjsKLQl9Ci0KLQlyZWZbMV0gPSBjcmVhdGVfdXNlcl92bWEoQS0+dm0sIFNaXzY0 Syk7Ci0JaWYgKElTX0VSUihyZWZbMV0pKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVmWzFdKTsKLQkJ Z290byBlcnJfcmVmMDsKLQl9Ci0KLQlycSA9IHJlY29yZF9yZWdpc3RlcnMoQSwgcmVmWzBdLCBy ZWZbMV0sIHNlbWEpOwotCWlmIChJU19FUlIocnEpKSB7Ci0JCWVyciA9IFBUUl9FUlIocnEpOwot CQlnb3RvIGVycl9yZWYxOwotCX0KLQotCVdSSVRFX09OQ0UoKnNlbWEsIDEpOwotCXdtYigpOwot Ci0JaWYgKGk5MTVfcmVxdWVzdF93YWl0KHJxLCAwLCBIWiAvIDIpIDwgMCkgewotCQlpOTE1X3Jl cXVlc3RfcHV0KHJxKTsKLQkJZXJyID0gLUVUSU1FOwotCQlnb3RvIGVycl9yZWYxOwotCX0KLQlp OTE1X3JlcXVlc3RfcHV0KHJxKTsKLQotCXJlc3VsdFswXSA9IGNyZWF0ZV91c2VyX3ZtYShBLT52 bSwgU1pfNjRLKTsKLQlpZiAoSVNfRVJSKHJlc3VsdFswXSkpIHsKLQkJZXJyID0gUFRSX0VSUihy ZXN1bHRbMF0pOwotCQlnb3RvIGVycl9yZWYxOwotCX0KLQotCXJlc3VsdFsxXSA9IGNyZWF0ZV91 c2VyX3ZtYShBLT52bSwgU1pfNjRLKTsKLQlpZiAoSVNfRVJSKHJlc3VsdFsxXSkpIHsKLQkJZXJy ID0gUFRSX0VSUihyZXN1bHRbMV0pOwotCQlnb3RvIGVycl9yZXN1bHQwOwotCX0KLQotCXJxID0g cmVjb3JkX3JlZ2lzdGVycyhBLCByZXN1bHRbMF0sIHJlc3VsdFsxXSwgc2VtYSk7Ci0JaWYgKElT X0VSUihycSkpIHsKLQkJZXJyID0gUFRSX0VSUihycSk7Ci0JCWdvdG8gZXJyX3Jlc3VsdDE7Ci0J fQotCi0JZXJyID0gcG9pc29uX3JlZ2lzdGVycyhCLCBwb2lzb24sIHNlbWEpOwotCWlmIChlcnIp IHsKLQkJV1JJVEVfT05DRSgqc2VtYSwgLTEpOwotCQlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKLQkJ Z290byBlcnJfcmVzdWx0MTsKLQl9Ci0KLQlpZiAoaTkxNV9yZXF1ZXN0X3dhaXQocnEsIDAsIEha IC8gMikgPCAwKSB7Ci0JCWk5MTVfcmVxdWVzdF9wdXQocnEpOwotCQllcnIgPSAtRVRJTUU7Ci0J CWdvdG8gZXJyX3Jlc3VsdDE7Ci0JfQotCWk5MTVfcmVxdWVzdF9wdXQocnEpOwotCi0JZXJyID0g Y29tcGFyZV9pc29sYXRpb24oZW5naW5lLCByZWYsIHJlc3VsdCwgQSwgcG9pc29uKTsKLQotZXJy X3Jlc3VsdDE6Ci0JaTkxNV92bWFfcHV0KHJlc3VsdFsxXSk7Ci1lcnJfcmVzdWx0MDoKLQlpOTE1 X3ZtYV9wdXQocmVzdWx0WzBdKTsKLWVycl9yZWYxOgotCWk5MTVfdm1hX3B1dChyZWZbMV0pOwot ZXJyX3JlZjA6Ci0JaTkxNV92bWFfcHV0KHJlZlswXSk7Ci1lcnJfQjoKLQlpbnRlbF9jb250ZXh0 X3B1dChCKTsKLWVycl9BOgotCWludGVsX2NvbnRleHRfcHV0KEEpOwotCXJldHVybiBlcnI7Ci19 Ci0KLXN0YXRpYyBib29sIHNraXBfaXNvbGF0aW9uKGNvbnN0IHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZSkKLXsKLQlpZiAoZW5naW5lLT5jbGFzcyA9PSBDT1BZX0VOR0lORV9DTEFTUyAm JiBJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA9PSA5KQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmIChl bmdpbmUtPmNsYXNzID09IFJFTkRFUl9DTEFTUyAmJiBJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA9 PSAxMSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQg bGl2ZV9scmNfaXNvbGF0aW9uKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0ID0g YXJnOwotCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQllbnVtIGludGVsX2VuZ2lu ZV9pZCBpZDsKLQljb25zdCB1MzIgcG9pc29uW10gPSB7Ci0JCVNUQUNLX01BR0lDLAotCQkweDNh M2EzYTNhLAotCQkweDVjNWM1YzVjLAotCQkweGZmZmZmZmZmLAotCQkweGZmZmYwMDAwLAotCX07 Ci0JaW50IGVyciA9IDA7Ci0KLQkvKgotCSAqIE91ciBnb2FsIGlzIHRyeSBhbmQgdmVyaWZ5IHRo YXQgcGVyLWNvbnRleHQgc3RhdGUgY2Fubm90IGJlCi0JICogdGFtcGVyZWQgd2l0aCBieSBhbm90 aGVyIG5vbi1wcml2aWxlZ2VkIGNsaWVudC4KLQkgKgotCSAqIFdlIHRha2UgdGhlIGxpc3Qgb2Yg Y29udGV4dCByZWdpc3RlcnMgZnJvbSB0aGUgTFJJIGluIHRoZSBkZWZhdWx0Ci0JICogY29udGV4 dCBpbWFnZSBhbmQgYXR0ZW1wdCB0byBtb2RpZnkgdGhhdCBsaXN0IGZyb20gYSByZW1vdGUgY29u dGV4dC4KLQkgKi8KLQotCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGd0LCBpZCkgewotCQlpbnQg aTsKLQotCQkvKiBKdXN0IGRvbid0IGV2ZW4gYXNrICovCi0JCWlmICghSVNfRU5BQkxFRChDT05G SUdfRFJNX0k5MTVfU0VMRlRFU1RfQlJPS0VOKSAmJgotCQkgICAgc2tpcF9pc29sYXRpb24oZW5n aW5lKSkKLQkJCWNvbnRpbnVlOwotCi0JCWludGVsX2VuZ2luZV9wbV9nZXQoZW5naW5lKTsKLQkJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9pc29uKTsgaSsrKSB7Ci0JCQlpbnQgcmVzdWx0 OwotCi0JCQlyZXN1bHQgPSBfX2xyY19pc29sYXRpb24oZW5naW5lLCBwb2lzb25baV0pOwotCQkJ aWYgKHJlc3VsdCAmJiAhZXJyKQotCQkJCWVyciA9IHJlc3VsdDsKLQotCQkJcmVzdWx0ID0gX19s cmNfaXNvbGF0aW9uKGVuZ2luZSwgfnBvaXNvbltpXSk7Ci0JCQlpZiAocmVzdWx0ICYmICFlcnIp Ci0JCQkJZXJyID0gcmVzdWx0OwotCQl9Ci0JCWludGVsX2VuZ2luZV9wbV9wdXQoZW5naW5lKTsK LQkJaWYgKGlndF9mbHVzaF90ZXN0KGd0LT5pOTE1KSkgewotCQkJZXJyID0gLUVJTzsKLQkJCWJy ZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBpbmRpcmVjdF9j dHhfc3VibWl0X3JlcShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCi17Ci0Jc3RydWN0IGk5MTVf cmVxdWVzdCAqcnE7Ci0JaW50IGVyciA9IDA7Ci0KLQlycSA9IGludGVsX2NvbnRleHRfY3JlYXRl X3JlcXVlc3QoY2UpOwotCWlmIChJU19FUlIocnEpKQotCQlyZXR1cm4gUFRSX0VSUihycSk7Ci0K LQlpOTE1X3JlcXVlc3RfZ2V0KHJxKTsKLQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQotCWlmIChp OTE1X3JlcXVlc3Rfd2FpdChycSwgMCwgSFogLyA1KSA8IDApCi0JCWVyciA9IC1FVElNRTsKLQot CWk5MTVfcmVxdWVzdF9wdXQocnEpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotI2RlZmluZSBDVFhf QkJfQ0FOQVJZX09GRlNFVCAoMyAqIDEwMjQpCi0jZGVmaW5lIENUWF9CQl9DQU5BUllfSU5ERVgg IChDVFhfQkJfQ0FOQVJZX09GRlNFVCAvIHNpemVvZih1MzIpKQotCi1zdGF0aWMgdTMyICoKLWVt aXRfaW5kaXJlY3RfY3R4X2JiX2NhbmFyeShjb25zdCBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Us IHUzMiAqY3MpCi17Ci0JKmNzKysgPSBNSV9TVE9SRV9SRUdJU1RFUl9NRU1fR0VOOCB8Ci0JCU1J X1NSTV9MUk1fR0xPQkFMX0dUVCB8Ci0JCU1JX0xSSV9MUk1fQ1NfTU1JTzsKLQkqY3MrKyA9IGk5 MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfU1RBUlQoMCkpOwotCSpjcysrID0gaTkxNV9nZ3R0X29m ZnNldChjZS0+c3RhdGUpICsKLQkJY29udGV4dF93YV9iYl9vZmZzZXQoY2UpICsKLQkJQ1RYX0JC X0NBTkFSWV9PRkZTRVQ7Ci0JKmNzKysgPSAwOwotCi0JcmV0dXJuIGNzOwotfQotCi1zdGF0aWMg dm9pZAotaW5kaXJlY3RfY3R4X2JiX3NldHVwKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKLXsK LQl1MzIgKmNzID0gY29udGV4dF9pbmRpcmVjdF9iYihjZSk7Ci0KLQljc1tDVFhfQkJfQ0FOQVJZ X0lOREVYXSA9IDB4ZGVhZGYwMGQ7Ci0KLQlzZXR1cF9pbmRpcmVjdF9jdHhfYmIoY2UsIGNlLT5l bmdpbmUsIGVtaXRfaW5kaXJlY3RfY3R4X2JiX2NhbmFyeSk7Ci19Ci0KLXN0YXRpYyBib29sIGNo ZWNrX3Jpbmdfc3RhcnQoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQotewotCWNvbnN0IHUzMiAq IGNvbnN0IGN0eF9iYiA9ICh2b2lkICopKGNlLT5scmNfcmVnX3N0YXRlKSAtCi0JCUxSQ19TVEFU RV9PRkZTRVQgKyBjb250ZXh0X3dhX2JiX29mZnNldChjZSk7Ci0KLQlpZiAoY3R4X2JiW0NUWF9C Ql9DQU5BUllfSU5ERVhdID09IGNlLT5scmNfcmVnX3N0YXRlW0NUWF9SSU5HX1NUQVJUXSkKLQkJ cmV0dXJuIHRydWU7Ci0KLQlwcl9lcnIoInJpbmcgc3RhcnQgbWlzbWF0Y2g6IGNhbmFyeSAweCUw OHggdnMgc3RhdGUgMHglMDh4XG4iLAotCSAgICAgICBjdHhfYmJbQ1RYX0JCX0NBTkFSWV9JTkRF WF0sCi0JICAgICAgIGNlLT5scmNfcmVnX3N0YXRlW0NUWF9SSU5HX1NUQVJUXSk7Ci0KLQlyZXR1 cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgaW5kaXJlY3RfY3R4X2JiX2NoZWNrKHN0cnVjdCBp bnRlbF9jb250ZXh0ICpjZSkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gaW5kaXJlY3RfY3R4X3N1 Ym1pdF9yZXEoY2UpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoIWNoZWNrX3Jp bmdfc3RhcnQoY2UpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgaW50IF9fbGl2ZV9scmNfaW5kaXJlY3RfY3R4X2JiKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSkKLXsKLQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqYSwgKmI7Ci0JaW50IGVycjsKLQot CWEgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZShlbmdpbmUpOwotCWlmIChJU19FUlIoYSkpCi0JCXJl dHVybiBQVFJfRVJSKGEpOwotCWVyciA9IGludGVsX2NvbnRleHRfcGluKGEpOwotCWlmIChlcnIp Ci0JCWdvdG8gcHV0X2E7Ci0KLQliID0gaW50ZWxfY29udGV4dF9jcmVhdGUoZW5naW5lKTsKLQlp ZiAoSVNfRVJSKGIpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYik7Ci0JCWdvdG8gdW5waW5fYTsKLQl9 Ci0JZXJyID0gaW50ZWxfY29udGV4dF9waW4oYik7Ci0JaWYgKGVycikKLQkJZ290byBwdXRfYjsK LQotCS8qIFdlIHVzZSB0aGUgYWxyZWFkeSByZXNlcnZlZCBleHRyYSBwYWdlIGluIGNvbnRleHQg c3RhdGUgKi8KLQlpZiAoIWEtPndhX2JiX3BhZ2UpIHsKLQkJR0VNX0JVR19PTihiLT53YV9iYl9w YWdlKTsKLQkJR0VNX0JVR19PTihJTlRFTF9HRU4oZW5naW5lLT5pOTE1KSA9PSAxMik7Ci0JCWdv dG8gdW5waW5fYjsKLQl9Ci0KLQkvKgotCSAqIEluIG9yZGVyIHRvIHRlc3QgdGhhdCBvdXIgcGVy IGNvbnRleHQgYmIgaXMgdHJ1bHkgcGVyIGNvbnRleHQsCi0JICogYW5kIGV4ZWN1dGVzIGF0IHRo ZSBpbnRlbmRlZCBzcG90IG9uIGNvbnRleHQgcmVzdG9yaW5nIHByb2Nlc3MsCi0JICogbWFrZSB0 aGUgYmF0Y2ggc3RvcmUgdGhlIHJpbmcgc3RhcnQgdmFsdWUgdG8gbWVtb3J5LgotCSAqIEFzIHJp bmcgc3RhcnQgaXMgcmVzdG9yZWQgYXByaW9yaSBvZiBzdGFydGluZyB0aGUgaW5kaXJlY3QgY3R4 IGJiIGFuZAotCSAqIGFzIGl0IHdpbGwgYmUgZGlmZmVyZW50IGZvciBlYWNoIGNvbnRleHQsIGl0 IGZpdHMgdG8gdGhpcyBwdXJwb3NlLgotCSAqLwotCWluZGlyZWN0X2N0eF9iYl9zZXR1cChhKTsK LQlpbmRpcmVjdF9jdHhfYmJfc2V0dXAoYik7Ci0KLQllcnIgPSBpbmRpcmVjdF9jdHhfYmJfY2hl Y2soYSk7Ci0JaWYgKGVycikKLQkJZ290byB1bnBpbl9iOwotCi0JZXJyID0gaW5kaXJlY3RfY3R4 X2JiX2NoZWNrKGIpOwotCi11bnBpbl9iOgotCWludGVsX2NvbnRleHRfdW5waW4oYik7Ci1wdXRf YjoKLQlpbnRlbF9jb250ZXh0X3B1dChiKTsKLXVucGluX2E6Ci0JaW50ZWxfY29udGV4dF91bnBp bihhKTsKLXB1dF9hOgotCWludGVsX2NvbnRleHRfcHV0KGEpOwotCi0JcmV0dXJuIGVycjsKLX0K LQotc3RhdGljIGludCBsaXZlX2xyY19pbmRpcmVjdF9jdHhfYmIodm9pZCAqYXJnKQotewotCXN0 cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l OwotCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwotCWludCBlcnIgPSAwOwotCi0JZm9yX2VhY2hf ZW5naW5lKGVuZ2luZSwgZ3QsIGlkKSB7Ci0JCWludGVsX2VuZ2luZV9wbV9nZXQoZW5naW5lKTsK LQkJZXJyID0gX19saXZlX2xyY19pbmRpcmVjdF9jdHhfYmIoZW5naW5lKTsKLQkJaW50ZWxfZW5n aW5lX3BtX3B1dChlbmdpbmUpOwotCi0JCWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkxNSkpCi0J CQllcnIgPSAtRUlPOwotCi0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJy OwotfQotCi1zdGF0aWMgdm9pZCBnYXJiYWdlX3Jlc2V0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSwKLQkJCSAgc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCi17Ci0JY29uc3QgdW5zaWdu ZWQgaW50IGJpdCA9IEk5MTVfUkVTRVRfRU5HSU5FICsgZW5naW5lLT5pZDsKLQl1bnNpZ25lZCBs b25nICpsb2NrID0gJmVuZ2luZS0+Z3QtPnJlc2V0LmZsYWdzOwotCi0JaWYgKHRlc3RfYW5kX3Nl dF9iaXQoYml0LCBsb2NrKSkKLQkJcmV0dXJuOwotCi0JdGFza2xldF9kaXNhYmxlKCZlbmdpbmUt PmV4ZWNsaXN0cy50YXNrbGV0KTsKLQotCWlmICghcnEtPmZlbmNlLmVycm9yKQotCQlpbnRlbF9l bmdpbmVfcmVzZXQoZW5naW5lLCBOVUxMKTsKLQotCXRhc2tsZXRfZW5hYmxlKCZlbmdpbmUtPmV4 ZWNsaXN0cy50YXNrbGV0KTsKLQljbGVhcl9hbmRfd2FrZV91cF9iaXQoYml0LCBsb2NrKTsKLX0K LQotc3RhdGljIHN0cnVjdCBpOTE1X3JlcXVlc3QgKmdhcmJhZ2Uoc3RydWN0IGludGVsX2NvbnRl eHQgKmNlLAotCQkJCSAgICBzdHJ1Y3Qgcm5kX3N0YXRlICpwcm5nKQotewotCXN0cnVjdCBpOTE1 X3JlcXVlc3QgKnJxOwotCWludCBlcnI7Ci0KLQllcnIgPSBpbnRlbF9jb250ZXh0X3BpbihjZSk7 Ci0JaWYgKGVycikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQotCXByYW5kb21fYnl0ZXNfc3Rh dGUocHJuZywKLQkJCSAgICBjZS0+bHJjX3JlZ19zdGF0ZSwKLQkJCSAgICBjZS0+ZW5naW5lLT5j b250ZXh0X3NpemUgLQotCQkJICAgIExSQ19TVEFURV9PRkZTRVQpOwotCi0JcnEgPSBpbnRlbF9j b250ZXh0X2NyZWF0ZV9yZXF1ZXN0KGNlKTsKLQlpZiAoSVNfRVJSKHJxKSkgewotCQllcnIgPSBQ VFJfRVJSKHJxKTsKLQkJZ290byBlcnJfdW5waW47Ci0JfQotCi0JaTkxNV9yZXF1ZXN0X2dldChy cSk7Ci0JaTkxNV9yZXF1ZXN0X2FkZChycSk7Ci0JcmV0dXJuIHJxOwotCi1lcnJfdW5waW46Ci0J aW50ZWxfY29udGV4dF91bnBpbihjZSk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3Rh dGljIGludCBfX2xyY19nYXJiYWdlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwgc3Ry dWN0IHJuZF9zdGF0ZSAqcHJuZykKLXsKLQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7Ci0Jc3Ry dWN0IGk5MTVfcmVxdWVzdCAqaGFuZzsKLQlpbnQgZXJyID0gMDsKLQotCWNlID0gaW50ZWxfY29u dGV4dF9jcmVhdGUoZW5naW5lKTsKLQlpZiAoSVNfRVJSKGNlKSkKLQkJcmV0dXJuIFBUUl9FUlIo Y2UpOwotCi0JaGFuZyA9IGdhcmJhZ2UoY2UsIHBybmcpOwotCWlmIChJU19FUlIoaGFuZykpIHsK LQkJZXJyID0gUFRSX0VSUihoYW5nKTsKLQkJZ290byBlcnJfY2U7Ci0JfQotCi0JaWYgKHdhaXRf Zm9yX3N1Ym1pdChlbmdpbmUsIGhhbmcsIEhaIC8gMikpIHsKLQkJaTkxNV9yZXF1ZXN0X3B1dCho YW5nKTsKLQkJZXJyID0gLUVUSU1FOwotCQlnb3RvIGVycl9jZTsKLQl9Ci0KLQlpbnRlbF9jb250 ZXh0X3NldF9iYW5uZWQoY2UpOwotCWdhcmJhZ2VfcmVzZXQoZW5naW5lLCBoYW5nKTsKLQotCWlu dGVsX2VuZ2luZV9mbHVzaF9zdWJtaXNzaW9uKGVuZ2luZSk7Ci0JaWYgKCFoYW5nLT5mZW5jZS5l cnJvcikgewotCQlpOTE1X3JlcXVlc3RfcHV0KGhhbmcpOwotCQlwcl9lcnIoIiVzOiBjb3JydXB0 ZWQgY29udGV4dCB3YXMgbm90IHJlc2V0XG4iLAotCQkgICAgICAgZW5naW5lLT5uYW1lKTsKLQkJ ZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfY2U7Ci0JfQotCi0JaWYgKGk5MTVfcmVxdWVzdF93 YWl0KGhhbmcsIDAsIEhaIC8gMikgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvcnJ1cHRlZCBjb250 ZXh0IGRpZCBub3QgcmVjb3ZlclxuIiwKLQkJICAgICAgIGVuZ2luZS0+bmFtZSk7Ci0JCWk5MTVf cmVxdWVzdF9wdXQoaGFuZyk7Ci0JCWVyciA9IC1FSU87Ci0JCWdvdG8gZXJyX2NlOwotCX0KLQlp OTE1X3JlcXVlc3RfcHV0KGhhbmcpOwotCi1lcnJfY2U6Ci0JaW50ZWxfY29udGV4dF9wdXQoY2Up OwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbGl2ZV9scmNfZ2FyYmFnZSh2b2lkICph cmcpCi17Ci0Jc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKLQlzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmU7Ci0JZW51bSBpbnRlbF9lbmdpbmVfaWQgaWQ7Ci0KLQkvKgotCSAqIFZlcmlm eSB0aGF0IHdlIGNhbiByZWNvdmVyIGlmIG9uZSBjb250ZXh0IHN0YXRlIGlzIGNvbXBsZXRlbHkK LQkgKiBjb3JydXB0ZWQuCi0JICovCi0KLQlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1 X1NFTEZURVNUX0JST0tFTikpCi0JCXJldHVybiAwOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2lu ZSwgZ3QsIGlkKSB7Ci0JCUk5MTVfUk5EX1NUQVRFKHBybmcpOwotCQlpbnQgZXJyID0gMCwgaTsK LQotCQlpZiAoIWludGVsX2hhc19yZXNldF9lbmdpbmUoZW5naW5lLT5ndCkpCi0JCQljb250aW51 ZTsKLQotCQlpbnRlbF9lbmdpbmVfcG1fZ2V0KGVuZ2luZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCAz OyBpKyspIHsKLQkJCWVyciA9IF9fbHJjX2dhcmJhZ2UoZW5naW5lLCAmcHJuZyk7Ci0JCQlpZiAo ZXJyKQotCQkJCWJyZWFrOwotCQl9Ci0JCWludGVsX2VuZ2luZV9wbV9wdXQoZW5naW5lKTsKLQot CQlpZiAoaWd0X2ZsdXNoX3Rlc3QoZ3QtPmk5MTUpKQotCQkJZXJyID0gLUVJTzsKLQkJaWYgKGVy cikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19s aXZlX3BwaHdzcF9ydW50aW1lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlz dHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0JSUdU X1RJTUVPVVQoZW5kX3RpbWUpOwotCWludCBlcnI7Ci0KLQljZSA9IGludGVsX2NvbnRleHRfY3Jl YXRlKGVuZ2luZSk7Ci0JaWYgKElTX0VSUihjZSkpCi0JCXJldHVybiBQVFJfRVJSKGNlKTsKLQot CWNlLT5ydW50aW1lLm51bV91bmRlcmZsb3cgPSAwOwotCWNlLT5ydW50aW1lLm1heF91bmRlcmZs b3cgPSAwOwotCi0JZG8gewotCQl1bnNpZ25lZCBpbnQgbG9vcCA9IDEwMjQ7Ci0KLQkJd2hpbGUg KGxvb3ApIHsKLQkJCXJxID0gaW50ZWxfY29udGV4dF9jcmVhdGVfcmVxdWVzdChjZSk7Ci0JCQlp ZiAoSVNfRVJSKHJxKSkgewotCQkJCWVyciA9IFBUUl9FUlIocnEpOwotCQkJCWdvdG8gZXJyX3Jx OwotCQkJfQotCi0JCQlpZiAoLS1sb29wID09IDApCi0JCQkJaTkxNV9yZXF1ZXN0X2dldChycSk7 Ci0KLQkJCWk5MTVfcmVxdWVzdF9hZGQocnEpOwotCQl9Ci0KLQkJaWYgKF9faWd0X3RpbWVvdXQo ZW5kX3RpbWUsIE5VTEwpKQotCQkJYnJlYWs7Ci0KLQkJaTkxNV9yZXF1ZXN0X3B1dChycSk7Ci0J fSB3aGlsZSAoMSk7Ci0KLQllcnIgPSBpOTE1X3JlcXVlc3Rfd2FpdChycSwgMCwgSFogLyA1KTsK LQlpZiAoZXJyIDwgMCkgewotCQlwcl9lcnIoIiVzOiByZXF1ZXN0IG5vdCBjb21wbGV0ZWQhXG4i LCBlbmdpbmUtPm5hbWUpOwotCQlnb3RvIGVycl93YWl0OwotCX0KLQotCWlndF9mbHVzaF90ZXN0 KGVuZ2luZS0+aTkxNSk7Ci0KLQlwcl9pbmZvKCIlczogcHBod3NwIHJ1bnRpbWUgJWxsdW5zLCBh dmVyYWdlICVsbHVuc1xuIiwKLQkJZW5naW5lLT5uYW1lLAotCQlpbnRlbF9jb250ZXh0X2dldF90 b3RhbF9ydW50aW1lX25zKGNlKSwKLQkJaW50ZWxfY29udGV4dF9nZXRfYXZnX3J1bnRpbWVfbnMo Y2UpKTsKLQotCWVyciA9IDA7Ci0JaWYgKGNlLT5ydW50aW1lLm51bV91bmRlcmZsb3cpIHsKLQkJ cHJfZXJyKCIlczogcHBod3NwIHVuZGVyZmxvdyAldSB0aW1lKHMpLCBtYXggJXUgY3ljbGVzIVxu IiwKLQkJICAgICAgIGVuZ2luZS0+bmFtZSwKLQkJICAgICAgIGNlLT5ydW50aW1lLm51bV91bmRl cmZsb3csCi0JCSAgICAgICBjZS0+cnVudGltZS5tYXhfdW5kZXJmbG93KTsKLQkJR0VNX1RSQUNF X0RVTVAoKTsKLQkJZXJyID0gLUVPVkVSRkxPVzsKLQl9Ci0KLWVycl93YWl0OgotCWk5MTVfcmVx dWVzdF9wdXQocnEpOwotZXJyX3JxOgotCWludGVsX2NvbnRleHRfcHV0KGNlKTsKLQlyZXR1cm4g ZXJyOwotfQotCi1zdGF0aWMgaW50IGxpdmVfcHBod3NwX3J1bnRpbWUodm9pZCAqYXJnKQotewot CXN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lOwotCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwotCWludCBlcnIgPSAwOwotCi0JLyoKLQkg KiBDaGVjayB0aGF0IGN1bXVsYXRpdmUgY29udGV4dCBydW50aW1lIGFzIHN0b3JlZCBpbiB0aGUg cHBod3NwWzE2XQotCSAqIGlzIG1vbm90b25pYy4KLQkgKi8KLQotCWZvcl9lYWNoX2VuZ2luZShl bmdpbmUsIGd0LCBpZCkgewotCQllcnIgPSBfX2xpdmVfcHBod3NwX3J1bnRpbWUoZW5naW5lKTsK LQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkx NSkpCi0JCWVyciA9IC1FSU87Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgaW50ZWxfbHJjX2xp dmVfc2VsZnRlc3RzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCXN0YXRpYyBj b25zdCBzdHJ1Y3QgaTkxNV9zdWJ0ZXN0IHRlc3RzW10gPSB7Ci0JCVNVQlRFU1QobGl2ZV9scmNf bGF5b3V0KSwKLQkJU1VCVEVTVChsaXZlX2xyY19maXhlZCksCi0JCVNVQlRFU1QobGl2ZV9scmNf c3RhdGUpLAotCQlTVUJURVNUKGxpdmVfbHJjX2dwciksCi0JCVNVQlRFU1QobGl2ZV9scmNfaXNv bGF0aW9uKSwKLQkJU1VCVEVTVChsaXZlX2xyY190aW1lc3RhbXApLAotCQlTVUJURVNUKGxpdmVf bHJjX2dhcmJhZ2UpLAotCQlTVUJURVNUKGxpdmVfcHBod3NwX3J1bnRpbWUpLAotCQlTVUJURVNU KGxpdmVfbHJjX2luZGlyZWN0X2N0eF9iYiksCi0JfTsKLQotCWlmICghSEFTX0xPR0lDQUxfUklO R19DT05URVhUUyhpOTE1KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gaW50ZWxfZ3RfbGl2ZV9z dWJ0ZXN0cyh0ZXN0cywgJmk5MTUtPmd0KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d0L3NlbGZ0ZXN0X2xyYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRl c3RfbHJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5iNzYxNzcz MWQyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9zZWxmdGVz dF9scmMuYwpAQCAtMCwwICsxLDE4NjEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBN SVQKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNp bmNsdWRlIDxsaW51eC9wcmltZV9udW1iZXJzLmg+CisKKyNpbmNsdWRlICJpOTE1X3NlbGZ0ZXN0 LmgiCisjaW5jbHVkZSAiaW50ZWxfZW5naW5lX2hlYXJ0YmVhdC5oIgorI2luY2x1ZGUgImludGVs X2VuZ2luZV9wbS5oIgorI2luY2x1ZGUgImludGVsX3Jlc2V0LmgiCisjaW5jbHVkZSAiaW50ZWxf cmluZy5oIgorI2luY2x1ZGUgInNlbGZ0ZXN0X2VuZ2luZV9oZWFydGJlYXQuaCIKKyNpbmNsdWRl ICJzZWxmdGVzdHMvaTkxNV9yYW5kb20uaCIKKyNpbmNsdWRlICJzZWxmdGVzdHMvaWd0X2ZsdXNo X3Rlc3QuaCIKKyNpbmNsdWRlICJzZWxmdGVzdHMvaWd0X2xpdmVfdGVzdC5oIgorI2luY2x1ZGUg InNlbGZ0ZXN0cy9pZ3Rfc3Bpbm5lci5oIgorI2luY2x1ZGUgInNlbGZ0ZXN0cy9saWJfc3dfZmVu Y2UuaCIKKyNpbmNsdWRlICJzaG1lbV91dGlscy5oIgorCisjaW5jbHVkZSAiZ2VtL3NlbGZ0ZXN0 cy9pZ3RfZ2VtX3V0aWxzLmgiCisjaW5jbHVkZSAiZ2VtL3NlbGZ0ZXN0cy9tb2NrX2NvbnRleHQu aCIKKworI2RlZmluZSBDU19HUFIoZW5naW5lLCBuKSAoKGVuZ2luZSktPm1taW9fYmFzZSArIDB4 NjAwICsgKG4pICogNCkKKyNkZWZpbmUgTlVNX0dQUiAxNgorI2RlZmluZSBOVU1fR1BSX0RXIChO VU1fR1BSICogMikgLyogZWFjaCBHUFIgaXMgMiBkd29yZHMgKi8KKworc3RhdGljIHN0cnVjdCBp OTE1X3ZtYSAqY3JlYXRlX3NjcmF0Y2goc3RydWN0IGludGVsX2d0ICpndCkKK3sKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCWludCBl cnI7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGd0LT5pOTE1LCBQ QUdFX1NJWkUpOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJuIEVSUl9DQVNUKG9iaik7CisK KwlpOTE1X2dlbV9vYmplY3Rfc2V0X2NhY2hlX2NvaGVyZW5jeShvYmosIEk5MTVfQ0FDSElOR19D QUNIRUQpOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmZ3QtPmdndHQtPnZtLCBO VUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor CQlyZXR1cm4gdm1hOworCX0KKworCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIFBJTl9H TE9CQUwpOworCWlmIChlcnIpIHsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCQlyZXR1 cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVybiB2bWE7Cit9CisKK3N0YXRpYyBib29sIGlz X2FjdGl2ZShzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSkKK3sKKwlpZiAoaTkxNV9yZXF1ZXN0X2lz X2FjdGl2ZShycSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKGk5MTVfcmVxdWVzdF9vbl9ob2xk KHJxKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaTkxNV9yZXF1ZXN0X2hhc19pbml0aWFsX2Jy ZWFkY3J1bWIocnEpICYmIGk5MTVfcmVxdWVzdF9zdGFydGVkKHJxKSkKKwkJcmV0dXJuIHRydWU7 CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3Jfc3VibWl0KHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKKwkJCSAgIHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJx LAorCQkJICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgKz0gamlmZmllczsK KwlkbyB7CisJCWJvb2wgZG9uZSA9IHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCk7CisKKwkJ aWYgKGk5MTVfcmVxdWVzdF9jb21wbGV0ZWQocnEpKSAvKiB0aGF0IHdhcyBxdWljayEgKi8KKwkJ CXJldHVybiAwOworCisJCS8qIFdhaXQgdW50aWwgdGhlIEhXIGhhcyBhY2tub3dsZWdlZCB0aGUg c3VibWlzc2lvbiAob3IgZXJyKSAqLworCQlpbnRlbF9lbmdpbmVfZmx1c2hfc3VibWlzc2lvbihl bmdpbmUpOworCQlpZiAoIVJFQURfT05DRShlbmdpbmUtPmV4ZWNsaXN0cy5wZW5kaW5nWzBdKSAm JiBpc19hY3RpdmUocnEpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGRvbmUpCisJCQlyZXR1cm4g LUVUSU1FOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMg aW50IGVtaXRfc2VtYXBob3JlX3NpZ25hbChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UsIHZvaWQg KnNsb3QpCit7CisJY29uc3QgdTMyIG9mZnNldCA9CisJCWk5MTVfZ2d0dF9vZmZzZXQoY2UtPmVu Z2luZS0+c3RhdHVzX3BhZ2Uudm1hKSArCisJCW9mZnNldF9pbl9wYWdlKHNsb3QpOworCXN0cnVj dCBpOTE1X3JlcXVlc3QgKnJxOworCXUzMiAqY3M7CisKKwlycSA9IGludGVsX2NvbnRleHRfY3Jl YXRlX3JlcXVlc3QoY2UpOworCWlmIChJU19FUlIocnEpKQorCQlyZXR1cm4gUFRSX0VSUihycSk7 CisKKwljcyA9IGludGVsX3JpbmdfYmVnaW4ocnEsIDQpOworCWlmIChJU19FUlIoY3MpKSB7CisJ CWk5MTVfcmVxdWVzdF9hZGQocnEpOworCQlyZXR1cm4gUFRSX0VSUihjcyk7CisJfQorCisJKmNz KysgPSBNSV9TVE9SRV9EV09SRF9JTU1fR0VONCB8IE1JX1VTRV9HR1RUOworCSpjcysrID0gb2Zm c2V0OworCSpjcysrID0gMDsKKwkqY3MrKyA9IDE7CisKKwlpbnRlbF9yaW5nX2FkdmFuY2UocnEs IGNzKTsKKworCXJxLT5zY2hlZC5hdHRyLnByaW9yaXR5ID0gSTkxNV9QUklPUklUWV9CQVJSSUVS OworCWk5MTVfcmVxdWVzdF9hZGQocnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNv bnRleHRfZmx1c2goc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCBsb25nIHRpbWVvdXQpCit7CisJ c3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7CisJc3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7CisJaW50 IGVyciA9IDA7CisKKwlycSA9IGludGVsX2VuZ2luZV9jcmVhdGVfa2VybmVsX3JlcXVlc3QoY2Ut PmVuZ2luZSk7CisJaWYgKElTX0VSUihycSkpCisJCXJldHVybiBQVFJfRVJSKHJxKTsKKworCWZl bmNlID0gaTkxNV9hY3RpdmVfZmVuY2VfZ2V0KCZjZS0+dGltZWxpbmUtPmxhc3RfcmVxdWVzdCk7 CisJaWYgKGZlbmNlKSB7CisJCWk5MTVfcmVxdWVzdF9hd2FpdF9kbWFfZmVuY2UocnEsIGZlbmNl KTsKKwkJZG1hX2ZlbmNlX3B1dChmZW5jZSk7CisJfQorCisJcnEgPSBpOTE1X3JlcXVlc3RfZ2V0 KHJxKTsKKwlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKKwlpZiAoaTkxNV9yZXF1ZXN0X3dhaXQocnEs IDAsIHRpbWVvdXQpIDwgMCkKKwkJZXJyID0gLUVUSU1FOworCWk5MTVfcmVxdWVzdF9wdXQocnEp OworCisJcm1iKCk7IC8qIFdlIGtub3cgdGhlIHJlcXVlc3QgaXMgd3JpdHRlbiwgbWFrZSBzdXJl IGFsbCBzdGF0ZSBpcyB0b28hICovCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsaXZl X2xyY19sYXlvdXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7CisJ c3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOworCWVudW0gaW50ZWxfZW5naW5lX2lkIGlk OworCXUzMiAqbHJjOworCWludCBlcnI7CisKKwkvKgorCSAqIENoZWNrIHRoZSByZWdpc3RlcnMg b2Zmc2V0cyB3ZSB1c2UgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHJlZyBzdGF0ZQorCSAqIG1hdGNo IHRoZSBsYXlvdXQgc2F2ZWQgYnkgSFcuCisJICovCisKKwlscmMgPSBrbWFsbG9jKFBBR0VfU0la RSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0g MDsKKwlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBndCwgaWQpIHsKKwkJdTMyICpodzsKKwkJaW50 IGR3OworCisJCWlmICghZW5naW5lLT5kZWZhdWx0X3N0YXRlKQorCQkJY29udGludWU7CisKKwkJ aHcgPSBzaG1lbV9waW5fbWFwKGVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSk7CisJCWlmIChJU19FUlIo aHcpKSB7CisJCQllcnIgPSBQVFJfRVJSKGh3KTsKKwkJCWJyZWFrOworCQl9CisJCWh3ICs9IExS Q19TVEFURV9PRkZTRVQgLyBzaXplb2YoKmh3KTsKKworCQlfX2xyY19pbml0X3JlZ3MobWVtc2V0 KGxyYywgUE9JU09OX0lOVVNFLCBQQUdFX1NJWkUpLAorCQkJCWVuZ2luZS0+a2VybmVsX2NvbnRl eHQsIGVuZ2luZSwgdHJ1ZSk7CisKKwkJZHcgPSAwOworCQlkbyB7CisJCQl1MzIgbHJpID0gaHdb ZHddOworCisJCQlpZiAobHJpID09IDApIHsKKwkJCQlkdysrOworCQkJCWNvbnRpbnVlOworCQkJ fQorCisJCQlpZiAobHJjW2R3XSA9PSAwKSB7CisJCQkJcHJfZGVidWcoIiVzOiBza2lwcGVkIGlu c3RydWN0aW9uICV4IGF0IGR3b3JkICVkXG4iLAorCQkJCQkgZW5naW5lLT5uYW1lLCBscmksIGR3 KTsKKwkJCQlkdysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoKGxyaSAmIEdFTk1B U0soMzEsIDIzKSkgIT0gTUlfSU5TVFIoMHgyMiwgMCkpIHsKKwkJCQlwcl9lcnIoIiVzOiBFeHBl Y3RlZCBMUkkgY29tbWFuZCBhdCBkd29yZCAlZCwgZm91bmQgJTA4eFxuIiwKKwkJCQkgICAgICAg ZW5naW5lLT5uYW1lLCBkdywgbHJpKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJyZWFrOwor CQkJfQorCisJCQlpZiAobHJjW2R3XSAhPSBscmkpIHsKKwkJCQlwcl9lcnIoIiVzOiBMUkkgY29t bWFuZCBtaXNtYXRjaCBhdCBkd29yZCAlZCwgZXhwZWN0ZWQgJTA4eCBmb3VuZCAlMDh4XG4iLAor CQkJCSAgICAgICBlbmdpbmUtPm5hbWUsIGR3LCBscmksIGxyY1tkd10pOworCQkJCWVyciA9IC1F SU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxyaSAmPSAweDdmOworCQkJbHJpKys7CisJ CQlkdysrOworCisJCQl3aGlsZSAobHJpKSB7CisJCQkJaWYgKGh3W2R3XSAhPSBscmNbZHddKSB7 CisJCQkJCXByX2VycigiJXM6IERpZmZlcmVudCByZWdpc3RlcnMgZm91bmQgYXQgZHdvcmQgJWQs IGV4cGVjdGVkICV4LCBmb3VuZCAleFxuIiwKKwkJCQkJICAgICAgIGVuZ2luZS0+bmFtZSwgZHcs IGh3W2R3XSwgbHJjW2R3XSk7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJ CX0KKworCQkJCS8qCisJCQkJICogU2tpcCBvdmVyIHRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWUg YXMgd2UKKwkJCQkgKiBleHBlY3QgdGhhdCB0byBkaWZmZXIuCisJCQkJICovCisJCQkJZHcgKz0g MjsKKwkJCQlscmkgLT0gMjsKKwkJCX0KKwkJfSB3aGlsZSAoKGxyY1tkd10gJiB+QklUKDApKSAh PSBNSV9CQVRDSF9CVUZGRVJfRU5EKTsKKworCQlpZiAoZXJyKSB7CisJCQlwcl9pbmZvKCIlczog SFcgcmVnaXN0ZXIgaW1hZ2U6XG4iLCBlbmdpbmUtPm5hbWUpOworCQkJaWd0X2hleGR1bXAoaHcs IFBBR0VfU0laRSk7CisKKwkJCXByX2luZm8oIiVzOiBTVyByZWdpc3RlciBpbWFnZTpcbiIsIGVu Z2luZS0+bmFtZSk7CisJCQlpZ3RfaGV4ZHVtcChscmMsIFBBR0VfU0laRSk7CisJCX0KKworCQlz aG1lbV91bnBpbl9tYXAoZW5naW5lLT5kZWZhdWx0X3N0YXRlLCBodyk7CisJCWlmIChlcnIpCisJ CQlicmVhazsKKwl9CisKKwlrZnJlZShscmMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBp bnQgZmluZF9vZmZzZXQoY29uc3QgdTMyICpscmksIHUzMiBvZmZzZXQpCit7CisJaW50IGk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHUzMik7IGkrKykKKwkJaWYgKGxy aVtpXSA9PSBvZmZzZXQpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGlj IGludCBsaXZlX2xyY19maXhlZCh2b2lkICphcmcpCit7CisJc3RydWN0IGludGVsX2d0ICpndCA9 IGFyZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7CisJZW51bSBpbnRlbF9lbmdp bmVfaWQgaWQ7CisJaW50IGVyciA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoZSBhc3N1bWVkIHJl Z2lzdGVyIG9mZnNldHMgbWF0Y2ggdGhlIGFjdHVhbCBsb2NhdGlvbnMgaW4KKwkgKiB0aGUgY29u dGV4dCBpbWFnZS4KKwkgKi8KKworCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGd0LCBpZCkgewor CQljb25zdCBzdHJ1Y3QgeworCQkJdTMyIHJlZzsKKwkJCXUzMiBvZmZzZXQ7CisJCQljb25zdCBj aGFyICpuYW1lOworCQl9IHRibFtdID0geworCQkJeworCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0 KFJJTkdfU1RBUlQoZW5naW5lLT5tbWlvX2Jhc2UpKSwKKwkJCQlDVFhfUklOR19TVEFSVCAtIDEs CisJCQkJIlJJTkdfU1RBUlQiCisJCQl9LAorCQkJeworCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0 KFJJTkdfQ1RMKGVuZ2luZS0+bW1pb19iYXNlKSksCisJCQkJQ1RYX1JJTkdfQ1RMIC0gMSwKKwkJ CQkiUklOR19DVEwiCisJCQl9LAorCQkJeworCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdf SEVBRChlbmdpbmUtPm1taW9fYmFzZSkpLAorCQkJCUNUWF9SSU5HX0hFQUQgLSAxLAorCQkJCSJS SU5HX0hFQUQiCisJCQl9LAorCQkJeworCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfVEFJ TChlbmdpbmUtPm1taW9fYmFzZSkpLAorCQkJCUNUWF9SSU5HX1RBSUwgLSAxLAorCQkJCSJSSU5H X1RBSUwiCisJCQl9LAorCQkJeworCQkJCWk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfTUlfTU9E RShlbmdpbmUtPm1taW9fYmFzZSkpLAorCQkJCWxyY19yaW5nX21pX21vZGUoZW5naW5lKSwKKwkJ CQkiUklOR19NSV9NT0RFIgorCQkJfSwKKwkJCXsKKwkJCQlpOTE1X21taW9fcmVnX29mZnNldChS SU5HX0JCU1RBVEUoZW5naW5lLT5tbWlvX2Jhc2UpKSwKKwkJCQlDVFhfQkJfU1RBVEUgLSAxLAor CQkJCSJCQl9TVEFURSIKKwkJCX0sCisJCQl7CisJCQkJaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklO R19CQl9QRVJfQ1RYX1BUUihlbmdpbmUtPm1taW9fYmFzZSkpLAorCQkJCWxyY19yaW5nX3dhX2Ji X3Blcl9jdHgoZW5naW5lKSwKKwkJCQkiUklOR19CQl9QRVJfQ1RYX1BUUiIKKwkJCX0sCisJCQl7 CisJCQkJaTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19JTkRJUkVDVF9DVFgoZW5naW5lLT5tbWlv X2Jhc2UpKSwKKwkJCQlscmNfcmluZ19pbmRpcmVjdF9wdHIoZW5naW5lKSwKKwkJCQkiUklOR19J TkRJUkVDVF9DVFhfUFRSIgorCQkJfSwKKwkJCXsKKwkJCQlpOTE1X21taW9fcmVnX29mZnNldChS SU5HX0lORElSRUNUX0NUWF9PRkZTRVQoZW5naW5lLT5tbWlvX2Jhc2UpKSwKKwkJCQlscmNfcmlu Z19pbmRpcmVjdF9vZmZzZXQoZW5naW5lKSwKKwkJCQkiUklOR19JTkRJUkVDVF9DVFhfT0ZGU0VU IgorCQkJfSwKKwkJCXsKKwkJCQlpOTE1X21taW9fcmVnX29mZnNldChSSU5HX0NUWF9USU1FU1RB TVAoZW5naW5lLT5tbWlvX2Jhc2UpKSwKKwkJCQlDVFhfVElNRVNUQU1QIC0gMSwKKwkJCQkiUklO R19DVFhfVElNRVNUQU1QIgorCQkJfSwKKwkJCXsKKwkJCQlpOTE1X21taW9fcmVnX29mZnNldChH RU44X1JJTkdfQ1NfR1BSKGVuZ2luZS0+bW1pb19iYXNlLCAwKSksCisJCQkJbHJjX3JpbmdfZ3By MChlbmdpbmUpLAorCQkJCSJSSU5HX0NTX0dQUjAiCisJCQl9LAorCQkJeworCQkJCWk5MTVfbW1p b19yZWdfb2Zmc2V0KFJJTkdfQ01EX0JVRl9DQ1RMKGVuZ2luZS0+bW1pb19iYXNlKSksCisJCQkJ bHJjX3JpbmdfY21kX2J1Zl9jY3RsKGVuZ2luZSksCisJCQkJIlJJTkdfQ01EX0JVRl9DQ1RMIgor CQkJfSwKKwkJCXsgfSwKKwkJfSwgKnQ7CisJCXUzMiAqaHc7CisKKwkJaWYgKCFlbmdpbmUtPmRl ZmF1bHRfc3RhdGUpCisJCQljb250aW51ZTsKKworCQlodyA9IHNobWVtX3Bpbl9tYXAoZW5naW5l LT5kZWZhdWx0X3N0YXRlKTsKKwkJaWYgKElTX0VSUihodykpIHsKKwkJCWVyciA9IFBUUl9FUlIo aHcpOworCQkJYnJlYWs7CisJCX0KKwkJaHcgKz0gTFJDX1NUQVRFX09GRlNFVCAvIHNpemVvZigq aHcpOworCisJCWZvciAodCA9IHRibDsgdC0+bmFtZTsgdCsrKSB7CisJCQlpbnQgZHcgPSBmaW5k X29mZnNldChodywgdC0+cmVnKTsKKworCQkJaWYgKGR3ICE9IHQtPm9mZnNldCkgeworCQkJCXBy X2VycigiJXM6IE9mZnNldCBmb3IgJXMgWzB4JXhdIG1pc21hdGNoLCBmb3VuZCAleCwgZXhwZWN0 ZWQgJXhcbiIsCisJCQkJICAgICAgIGVuZ2luZS0+bmFtZSwKKwkJCQkgICAgICAgdC0+bmFtZSwK KwkJCQkgICAgICAgdC0+cmVnLAorCQkJCSAgICAgICBkdywKKwkJCQkgICAgICAgdC0+b2Zmc2V0 KTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJc2htZW1fdW5waW5fbWFwKGVu Z2luZS0+ZGVmYXVsdF9zdGF0ZSwgaHcpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBpbnQgX19saXZlX2xyY19zdGF0ZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJ CQkgICAgc3RydWN0IGk5MTVfdm1hICpzY3JhdGNoKQoreworCXN0cnVjdCBpbnRlbF9jb250ZXh0 ICpjZTsKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4 IHd3OworCWVudW0geworCQlSSU5HX1NUQVJUX0lEWCA9IDAsCisJCVJJTkdfVEFJTF9JRFgsCisJ CU1BWF9JRFgKKwl9OworCXUzMiBleHBlY3RlZFtNQVhfSURYXTsKKwl1MzIgKmNzOworCWludCBl cnI7CisJaW50IG47CisKKwljZSA9IGludGVsX2NvbnRleHRfY3JlYXRlKGVuZ2luZSk7CisJaWYg KElTX0VSUihjZSkpCisJCXJldHVybiBQVFJfRVJSKGNlKTsKKworCWk5MTVfZ2VtX3d3X2N0eF9p bml0KCZ3dywgZmFsc2UpOworcmV0cnk6CisJZXJyID0gaTkxNV9nZW1fb2JqZWN0X2xvY2soc2Ny YXRjaC0+b2JqLCAmd3cpOworCWlmICghZXJyKQorCQllcnIgPSBpbnRlbF9jb250ZXh0X3Bpbl93 dyhjZSwgJnd3KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wdXQ7CisKKwlycSA9IGk5MTVfcmVx dWVzdF9jcmVhdGUoY2UpOworCWlmIChJU19FUlIocnEpKSB7CisJCWVyciA9IFBUUl9FUlIocnEp OworCQlnb3RvIGVycl91bnBpbjsKKwl9CisKKwljcyA9IGludGVsX3JpbmdfYmVnaW4ocnEsIDQg KiBNQVhfSURYKTsKKwlpZiAoSVNfRVJSKGNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNzKTsKKwkJ aTkxNV9yZXF1ZXN0X2FkZChycSk7CisJCWdvdG8gZXJyX3VucGluOworCX0KKworCSpjcysrID0g TUlfU1RPUkVfUkVHSVNURVJfTUVNX0dFTjggfCBNSV9VU0VfR0dUVDsKKwkqY3MrKyA9IGk5MTVf bW1pb19yZWdfb2Zmc2V0KFJJTkdfU1RBUlQoZW5naW5lLT5tbWlvX2Jhc2UpKTsKKwkqY3MrKyA9 IGk5MTVfZ2d0dF9vZmZzZXQoc2NyYXRjaCkgKyBSSU5HX1NUQVJUX0lEWCAqIHNpemVvZih1MzIp OworCSpjcysrID0gMDsKKworCWV4cGVjdGVkW1JJTkdfU1RBUlRfSURYXSA9IGk5MTVfZ2d0dF9v ZmZzZXQoY2UtPnJpbmctPnZtYSk7CisKKwkqY3MrKyA9IE1JX1NUT1JFX1JFR0lTVEVSX01FTV9H RU44IHwgTUlfVVNFX0dHVFQ7CisJKmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldChSSU5HX1RB SUwoZW5naW5lLT5tbWlvX2Jhc2UpKTsKKwkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZzZXQoc2NyYXRj aCkgKyBSSU5HX1RBSUxfSURYICogc2l6ZW9mKHUzMik7CisJKmNzKysgPSAwOworCisJZXJyID0g aTkxNV9yZXF1ZXN0X2F3YWl0X29iamVjdChycSwgc2NyYXRjaC0+b2JqLCB0cnVlKTsKKwlpZiAo IWVycikKKwkJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUoc2NyYXRjaCwgcnEsIEVYRUNf T0JKRUNUX1dSSVRFKTsKKworCWk5MTVfcmVxdWVzdF9nZXQocnEpOworCWk5MTVfcmVxdWVzdF9h ZGQocnEpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JxOworCisJaW50ZWxfZW5naW5lX2ZsdXNo X3N1Ym1pc3Npb24oZW5naW5lKTsKKwlleHBlY3RlZFtSSU5HX1RBSUxfSURYXSA9IGNlLT5yaW5n LT50YWlsOworCisJaWYgKGk5MTVfcmVxdWVzdF93YWl0KHJxLCAwLCBIWiAvIDUpIDwgMCkgewor CQllcnIgPSAtRVRJTUU7CisJCWdvdG8gZXJyX3JxOworCX0KKworCWNzID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9tYXAoc2NyYXRjaC0+b2JqLCBJOTE1X01BUF9XQik7CisJaWYgKElTX0VSUihjcykp IHsKKwkJZXJyID0gUFRSX0VSUihjcyk7CisJCWdvdG8gZXJyX3JxOworCX0KKworCWZvciAobiA9 IDA7IG4gPCBNQVhfSURYOyBuKyspIHsKKwkJaWYgKGNzW25dICE9IGV4cGVjdGVkW25dKSB7CisJ CQlwcl9lcnIoIiVzOiBTdG9yZWQgcmVnaXN0ZXJbJWRdIHZhbHVlWzB4JXhdIGRpZCBub3QgbWF0 Y2ggZXhwZWN0ZWRbMHgleF1cbiIsCisJCQkgICAgICAgZW5naW5lLT5uYW1lLCBuLCBjc1tuXSwg ZXhwZWN0ZWRbbl0pOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJ aTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChzY3JhdGNoLT5vYmopOworCitlcnJfcnE6CisJaTkx NV9yZXF1ZXN0X3B1dChycSk7CitlcnJfdW5waW46CisJaW50ZWxfY29udGV4dF91bnBpbihjZSk7 CitlcnJfcHV0OgorCWlmIChlcnIgPT0gLUVERUFETEspIHsKKwkJZXJyID0gaTkxNV9nZW1fd3df Y3R4X2JhY2tvZmYoJnd3KTsKKwkJaWYgKCFlcnIpCisJCQlnb3RvIHJldHJ5OworCX0KKwlpOTE1 X2dlbV93d19jdHhfZmluaSgmd3cpOworCWludGVsX2NvbnRleHRfcHV0KGNlKTsKKwlyZXR1cm4g ZXJyOworfQorCitzdGF0aWMgaW50IGxpdmVfbHJjX3N0YXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1 Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsK KwlzdHJ1Y3QgaTkxNV92bWEgKnNjcmF0Y2g7CisJZW51bSBpbnRlbF9lbmdpbmVfaWQgaWQ7CisJ aW50IGVyciA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoZSBsaXZlIHJlZ2lzdGVyIHN0YXRlIG1h dGNoZXMgd2hhdCB3ZSBleHBlY3QgZm9yIHRoaXMKKwkgKiBpbnRlbF9jb250ZXh0LgorCSAqLwor CisJc2NyYXRjaCA9IGNyZWF0ZV9zY3JhdGNoKGd0KTsKKwlpZiAoSVNfRVJSKHNjcmF0Y2gpKQor CQlyZXR1cm4gUFRSX0VSUihzY3JhdGNoKTsKKworCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGd0 LCBpZCkgeworCQllcnIgPSBfX2xpdmVfbHJjX3N0YXRlKGVuZ2luZSwgc2NyYXRjaCk7CisJCWlm IChlcnIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaWd0X2ZsdXNoX3Rlc3QoZ3QtPmk5MTUpKQor CQllcnIgPSAtRUlPOworCisJaTkxNV92bWFfdW5waW5fYW5kX3JlbGVhc2UoJnNjcmF0Y2gsIDAp OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ3ByX21ha2VfZGlydHkoc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlKQoreworCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCXUzMiAqY3M7 CisJaW50IG47CisKKwlycSA9IGludGVsX2NvbnRleHRfY3JlYXRlX3JlcXVlc3QoY2UpOworCWlm IChJU19FUlIocnEpKQorCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwljcyA9IGludGVsX3Jpbmdf YmVnaW4ocnEsIDIgKiBOVU1fR1BSX0RXICsgMik7CisJaWYgKElTX0VSUihjcykpIHsKKwkJaTkx NV9yZXF1ZXN0X2FkZChycSk7CisJCXJldHVybiBQVFJfRVJSKGNzKTsKKwl9CisKKwkqY3MrKyA9 IE1JX0xPQURfUkVHSVNURVJfSU1NKE5VTV9HUFJfRFcpOworCWZvciAobiA9IDA7IG4gPCBOVU1f R1BSX0RXOyBuKyspIHsKKwkJKmNzKysgPSBDU19HUFIoY2UtPmVuZ2luZSwgbik7CisJCSpjcysr ID0gU1RBQ0tfTUFHSUM7CisJfQorCSpjcysrID0gTUlfTk9PUDsKKworCWludGVsX3JpbmdfYWR2 YW5jZShycSwgY3MpOworCisJcnEtPnNjaGVkLmF0dHIucHJpb3JpdHkgPSBJOTE1X1BSSU9SSVRZ X0JBUlJJRVI7CisJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIHN0cnVjdCBpOTE1X3JlcXVlc3QgKgorX19ncHJfcmVhZChzdHJ1Y3QgaW50ZWxfY29udGV4 dCAqY2UsIHN0cnVjdCBpOTE1X3ZtYSAqc2NyYXRjaCwgdTMyICpzbG90KQoreworCWNvbnN0IHUz MiBvZmZzZXQgPQorCQlpOTE1X2dndHRfb2Zmc2V0KGNlLT5lbmdpbmUtPnN0YXR1c19wYWdlLnZt YSkgKworCQlvZmZzZXRfaW5fcGFnZShzbG90KTsKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsK Kwl1MzIgKmNzOworCWludCBlcnI7CisJaW50IG47CisKKwlycSA9IGludGVsX2NvbnRleHRfY3Jl YXRlX3JlcXVlc3QoY2UpOworCWlmIChJU19FUlIocnEpKQorCQlyZXR1cm4gcnE7CisKKwljcyA9 IGludGVsX3JpbmdfYmVnaW4ocnEsIDYgKyA0ICogTlVNX0dQUl9EVyk7CisJaWYgKElTX0VSUihj cykpIHsKKwkJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisJCXJldHVybiBFUlJfQ0FTVChjcyk7CisJ fQorCisJKmNzKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0VOQUJMRTsKKwkqY3MrKyA9IE1J X05PT1A7CisKKwkqY3MrKyA9IE1JX1NFTUFQSE9SRV9XQUlUIHwKKwkJTUlfU0VNQVBIT1JFX0dM T0JBTF9HVFQgfAorCQlNSV9TRU1BUEhPUkVfUE9MTCB8CisJCU1JX1NFTUFQSE9SRV9TQURfTkVR X1NERDsKKwkqY3MrKyA9IDA7CisJKmNzKysgPSBvZmZzZXQ7CisJKmNzKysgPSAwOworCisJZm9y IChuID0gMDsgbiA8IE5VTV9HUFJfRFc7IG4rKykgeworCQkqY3MrKyA9IE1JX1NUT1JFX1JFR0lT VEVSX01FTV9HRU44IHwgTUlfVVNFX0dHVFQ7CisJCSpjcysrID0gQ1NfR1BSKGNlLT5lbmdpbmUs IG4pOworCQkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZzZXQoc2NyYXRjaCkgKyBuICogc2l6ZW9mKHUz Mik7CisJCSpjcysrID0gMDsKKwl9CisKKwlpOTE1X3ZtYV9sb2NrKHNjcmF0Y2gpOworCWVyciA9 IGk5MTVfcmVxdWVzdF9hd2FpdF9vYmplY3QocnEsIHNjcmF0Y2gtPm9iaiwgdHJ1ZSk7CisJaWYg KCFlcnIpCisJCWVyciA9IGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHNjcmF0Y2gsIHJxLCBFWEVD X09CSkVDVF9XUklURSk7CisJaTkxNV92bWFfdW5sb2NrKHNjcmF0Y2gpOworCisJaTkxNV9yZXF1 ZXN0X2dldChycSk7CisJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisJaWYgKGVycikgeworCQlpOTE1 X3JlcXVlc3RfcHV0KHJxKTsKKwkJcnEgPSBFUlJfUFRSKGVycik7CisJfQorCisJcmV0dXJuIHJx OworfQorCitzdGF0aWMgaW50IF9fbGl2ZV9scmNfZ3ByKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSwKKwkJCSAgc3RydWN0IGk5MTVfdm1hICpzY3JhdGNoLAorCQkJICBib29sIHByZWVt cHQpCit7CisJdTMyICpzbG90ID0gbWVtc2V0MzIoZW5naW5lLT5zdGF0dXNfcGFnZS5hZGRyICsg MTAwMCwgMCwgNCk7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmNlOworCXN0cnVjdCBpOTE1X3Jl cXVlc3QgKnJxOworCXUzMiAqY3M7CisJaW50IGVycjsKKwlpbnQgbjsKKworCWlmIChJTlRFTF9H RU4oZW5naW5lLT5pOTE1KSA8IDkgJiYgZW5naW5lLT5jbGFzcyAhPSBSRU5ERVJfQ0xBU1MpCisJ CXJldHVybiAwOyAvKiBHUFIgb25seSBvbiByY3MwIGZvciBnZW44ICovCisKKwllcnIgPSBncHJf bWFrZV9kaXJ0eShlbmdpbmUtPmtlcm5lbF9jb250ZXh0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4g ZXJyOworCisJY2UgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZShlbmdpbmUpOworCWlmIChJU19FUlIo Y2UpKQorCQlyZXR1cm4gUFRSX0VSUihjZSk7CisKKwlycSA9IF9fZ3ByX3JlYWQoY2UsIHNjcmF0 Y2gsIHNsb3QpOworCWlmIChJU19FUlIocnEpKSB7CisJCWVyciA9IFBUUl9FUlIocnEpOworCQln b3RvIGVycl9wdXQ7CisJfQorCisJZXJyID0gd2FpdF9mb3Jfc3VibWl0KGVuZ2luZSwgcnEsIEha IC8gMik7CisJaWYgKGVycikKKwkJZ290byBlcnJfcnE7CisKKwlpZiAocHJlZW1wdCkgeworCQll cnIgPSBncHJfbWFrZV9kaXJ0eShlbmdpbmUtPmtlcm5lbF9jb250ZXh0KTsKKwkJaWYgKGVycikK KwkJCWdvdG8gZXJyX3JxOworCisJCWVyciA9IGVtaXRfc2VtYXBob3JlX3NpZ25hbChlbmdpbmUt Pmtlcm5lbF9jb250ZXh0LCBzbG90KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JxOworCX0g ZWxzZSB7CisJCXNsb3RbMF0gPSAxOworCQl3bWIoKTsKKwl9CisKKwlpZiAoaTkxNV9yZXF1ZXN0 X3dhaXQocnEsIDAsIEhaIC8gNSkgPCAwKSB7CisJCWVyciA9IC1FVElNRTsKKwkJZ290byBlcnJf cnE7CisJfQorCisJY3MgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChzY3JhdGNoLT5vYmosIEk5 MTVfTUFQX1dCKTsKKwlpZiAoSVNfRVJSKGNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNzKTsKKwkJ Z290byBlcnJfcnE7CisJfQorCisJZm9yIChuID0gMDsgbiA8IE5VTV9HUFJfRFc7IG4rKykgewor CQlpZiAoY3Nbbl0pIHsKKwkJCXByX2VycigiJXM6IEdQUlslZF0uJXMgd2FzIG5vdCB6ZXJvLCBm b3VuZCAweCUwOHghXG4iLAorCQkJICAgICAgIGVuZ2luZS0+bmFtZSwKKwkJCSAgICAgICBuIC8g MiwgbiAmIDEgPyAidWR3IiA6ICJsZHciLAorCQkJICAgICAgIGNzW25dKTsKKwkJCWVyciA9IC1F SU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAo c2NyYXRjaC0+b2JqKTsKKworZXJyX3JxOgorCW1lbXNldDMyKCZzbG90WzBdLCAtMSwgNCk7CisJ d21iKCk7CisJaTkxNV9yZXF1ZXN0X3B1dChycSk7CitlcnJfcHV0OgorCWludGVsX2NvbnRleHRf cHV0KGNlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxpdmVfbHJjX2dwcih2b2lk ICphcmcpCit7CisJc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKKwlzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmU7CisJc3RydWN0IGk5MTVfdm1hICpzY3JhdGNoOworCWVudW0gaW50ZWxf ZW5naW5lX2lkIGlkOworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IEdQUiBy ZWdpc3RlcnMgYXJlIGNsZWFyZWQgaW4gbmV3IGNvbnRleHRzIGFzIHdlIG5lZWQKKwkgKiB0byBh dm9pZCBsZWFraW5nIGFueSBpbmZvcm1hdGlvbiBmcm9tIHByZXZpb3VzIGNvbnRleHRzLgorCSAq LworCisJc2NyYXRjaCA9IGNyZWF0ZV9zY3JhdGNoKGd0KTsKKwlpZiAoSVNfRVJSKHNjcmF0Y2gp KQorCQlyZXR1cm4gUFRSX0VSUihzY3JhdGNoKTsKKworCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUs IGd0LCBpZCkgeworCQlzdF9lbmdpbmVfaGVhcnRiZWF0X2Rpc2FibGUoZW5naW5lKTsKKworCQll cnIgPSBfX2xpdmVfbHJjX2dwcihlbmdpbmUsIHNjcmF0Y2gsIGZhbHNlKTsKKwkJaWYgKGVycikK KwkJCWdvdG8gZXJyOworCisJCWVyciA9IF9fbGl2ZV9scmNfZ3ByKGVuZ2luZSwgc2NyYXRjaCwg dHJ1ZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycjsKKworZXJyOgorCQlzdF9lbmdpbmVfaGVh cnRiZWF0X2VuYWJsZShlbmdpbmUpOworCQlpZiAoaWd0X2ZsdXNoX3Rlc3QoZ3QtPmk5MTUpKQor CQkJZXJyID0gLUVJTzsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCWk5MTVfdm1hX3Vu cGluX2FuZF9yZWxlYXNlKCZzY3JhdGNoLCAwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg c3RydWN0IGk5MTVfcmVxdWVzdCAqCitjcmVhdGVfdGltZXN0YW1wKHN0cnVjdCBpbnRlbF9jb250 ZXh0ICpjZSwgdm9pZCAqc2xvdCwgaW50IGlkeCkKK3sKKwljb25zdCB1MzIgb2Zmc2V0ID0KKwkJ aTkxNV9nZ3R0X29mZnNldChjZS0+ZW5naW5lLT5zdGF0dXNfcGFnZS52bWEpICsKKwkJb2Zmc2V0 X2luX3BhZ2Uoc2xvdCk7CisJc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7CisJdTMyICpjczsKKwlp bnQgZXJyOworCisJcnEgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZV9yZXF1ZXN0KGNlKTsKKwlpZiAo SVNfRVJSKHJxKSkKKwkJcmV0dXJuIHJxOworCisJY3MgPSBpbnRlbF9yaW5nX2JlZ2luKHJxLCAx MCk7CisJaWYgKElTX0VSUihjcykpIHsKKwkJZXJyID0gUFRSX0VSUihjcyk7CisJCWdvdG8gZXJy OworCX0KKworCSpjcysrID0gTUlfQVJCX09OX09GRiB8IE1JX0FSQl9FTkFCTEU7CisJKmNzKysg PSBNSV9OT09QOworCisJKmNzKysgPSBNSV9TRU1BUEhPUkVfV0FJVCB8CisJCU1JX1NFTUFQSE9S RV9HTE9CQUxfR1RUIHwKKwkJTUlfU0VNQVBIT1JFX1BPTEwgfAorCQlNSV9TRU1BUEhPUkVfU0FE X05FUV9TREQ7CisJKmNzKysgPSAwOworCSpjcysrID0gb2Zmc2V0OworCSpjcysrID0gMDsKKwor CSpjcysrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVNX0dFTjggfCBNSV9VU0VfR0dUVDsKKwkqY3Mr KyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ1RYX1RJTUVTVEFNUChycS0+ZW5naW5lLT5t bWlvX2Jhc2UpKTsKKwkqY3MrKyA9IG9mZnNldCArIGlkeCAqIHNpemVvZih1MzIpOworCSpjcysr ID0gMDsKKworCWludGVsX3JpbmdfYWR2YW5jZShycSwgY3MpOworCisJcnEtPnNjaGVkLmF0dHIu cHJpb3JpdHkgPSBJOTE1X1BSSU9SSVRZX01BU0s7CisJZXJyID0gMDsKK2VycjoKKwlpOTE1X3Jl cXVlc3RfZ2V0KHJxKTsKKwlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKKwlpZiAoZXJyKSB7CisJCWk5 MTVfcmVxdWVzdF9wdXQocnEpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVy biBycTsKK30KKworc3RydWN0IGxyY190aW1lc3RhbXAgeworCXN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZTsKKwlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2VbMl07CisJdTMyIHBvaXNvbjsK K307CisKK3N0YXRpYyBib29sIHRpbWVzdGFtcF9hZHZhbmNlZCh1MzIgc3RhcnQsIHUzMiBlbmQp Cit7CisJcmV0dXJuIChzMzIpKGVuZCAtIHN0YXJ0KSA+IDA7Cit9CisKK3N0YXRpYyBpbnQgX19s cmNfdGltZXN0YW1wKGNvbnN0IHN0cnVjdCBscmNfdGltZXN0YW1wICphcmcsIGJvb2wgcHJlZW1w dCkKK3sKKwl1MzIgKnNsb3QgPSBtZW1zZXQzMihhcmctPmVuZ2luZS0+c3RhdHVzX3BhZ2UuYWRk ciArIDEwMDAsIDAsIDQpOworCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCXUzMiB0aW1lc3Rh bXA7CisJaW50IGVyciA9IDA7CisKKwlhcmctPmNlWzBdLT5scmNfcmVnX3N0YXRlW0NUWF9USU1F U1RBTVBdID0gYXJnLT5wb2lzb247CisJcnEgPSBjcmVhdGVfdGltZXN0YW1wKGFyZy0+Y2VbMF0s IHNsb3QsIDEpOworCWlmIChJU19FUlIocnEpKQorCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwll cnIgPSB3YWl0X2Zvcl9zdWJtaXQocnEtPmVuZ2luZSwgcnEsIEhaIC8gMik7CisJaWYgKGVycikK KwkJZ290byBlcnI7CisKKwlpZiAocHJlZW1wdCkgeworCQlhcmctPmNlWzFdLT5scmNfcmVnX3N0 YXRlW0NUWF9USU1FU1RBTVBdID0gMHhkZWFkYmVlZjsKKwkJZXJyID0gZW1pdF9zZW1hcGhvcmVf c2lnbmFsKGFyZy0+Y2VbMV0sIHNsb3QpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfSBl bHNlIHsKKwkJc2xvdFswXSA9IDE7CisJCXdtYigpOworCX0KKworCS8qIEFuZCB3YWl0IGZvciBz d2l0Y2ggdG8ga2VybmVsICh0byBzYXZlIG91ciBjb250ZXh0IHRvIG1lbW9yeSkgKi8KKwllcnIg PSBjb250ZXh0X2ZsdXNoKGFyZy0+Y2VbMF0sIEhaIC8gMik7CisJaWYgKGVycikKKwkJZ290byBl cnI7CisKKwlpZiAoIXRpbWVzdGFtcF9hZHZhbmNlZChhcmctPnBvaXNvbiwgc2xvdFsxXSkpIHsK KwkJcHJfZXJyKCIlcyglcyk6IGludmFsaWQgdGltZXN0YW1wIG9uIHJlc3RvcmUsIGNvbnRleHQ6 JXgsIHJlcXVlc3Q6JXhcbiIsCisJCSAgICAgICBhcmctPmVuZ2luZS0+bmFtZSwgcHJlZW1wdCA/ ICJwcmVlbXB0IiA6ICJzaW1wbGUiLAorCQkgICAgICAgYXJnLT5wb2lzb24sIHNsb3RbMV0pOwor CQllcnIgPSAtRUlOVkFMOworCX0KKworCXRpbWVzdGFtcCA9IFJFQURfT05DRShhcmctPmNlWzBd LT5scmNfcmVnX3N0YXRlW0NUWF9USU1FU1RBTVBdKTsKKwlpZiAoIXRpbWVzdGFtcF9hZHZhbmNl ZChzbG90WzFdLCB0aW1lc3RhbXApKSB7CisJCXByX2VycigiJXMoJXMpOiBpbnZhbGlkIHRpbWVz dGFtcCBvbiBzYXZlLCByZXF1ZXN0OiV4LCBjb250ZXh0OiV4XG4iLAorCQkgICAgICAgYXJnLT5l bmdpbmUtPm5hbWUsIHByZWVtcHQgPyAicHJlZW1wdCIgOiAic2ltcGxlIiwKKwkJICAgICAgIHNs b3RbMV0sIHRpbWVzdGFtcCk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCitlcnI6CisJbWVtc2V0 MzIoc2xvdCwgLTEsIDQpOworCWk5MTVfcmVxdWVzdF9wdXQocnEpOworCXJldHVybiBlcnI7Cit9 CisKK3N0YXRpYyBpbnQgbGl2ZV9scmNfdGltZXN0YW1wKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qg bHJjX3RpbWVzdGFtcCBkYXRhID0ge307CisJc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKKwll bnVtIGludGVsX2VuZ2luZV9pZCBpZDsKKwljb25zdCB1MzIgcG9pc29uW10gPSB7CisJCTAsCisJ CVMzMl9NQVgsCisJCSh1MzIpUzMyX01BWCArIDEsCisJCVUzMl9NQVgsCisJfTsKKworCS8qCisJ ICogV2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgdGltZXN0YW1wIGlzIHNhdmVkIGFuZCByZXN0 b3JlIGFjcm9zcworCSAqIGNvbnRleHQgc3dpdGNoZXMgYW5kIGlzIG1vbm90b25pYy4KKwkgKgor CSAqIFNvIHdlIGRvIHRoaXMgd2l0aCBhIGxpdHRsZSBiaXQgb2YgTFJDIHBvaXNvbmluZyB0byBj aGVjayB2YXJpb3VzCisJICogYm91bmRhcnkgY29uZGl0aW9ucywgYW5kIHNlZSB3aGF0IGhhcHBl bnMgaWYgd2UgcHJlZW1wdCB0aGUgY29udGV4dAorCSAqIHdpdGggYSBzZWNvbmQgcmVxdWVzdCAo Y2FycnlpbmcgbW9yZSBwb2lzb24gaW50byB0aGUgdGltZXN0YW1wKS4KKwkgKi8KKworCWZvcl9l YWNoX2VuZ2luZShkYXRhLmVuZ2luZSwgZ3QsIGlkKSB7CisJCWludCBpLCBlcnIgPSAwOworCisJ CXN0X2VuZ2luZV9oZWFydGJlYXRfZGlzYWJsZShkYXRhLmVuZ2luZSk7CisKKwkJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUoZGF0YS5jZSk7IGkrKykgeworCQkJc3RydWN0IGludGVsX2NvbnRl eHQgKnRtcDsKKworCQkJdG1wID0gaW50ZWxfY29udGV4dF9jcmVhdGUoZGF0YS5lbmdpbmUpOwor CQkJaWYgKElTX0VSUih0bXApKSB7CisJCQkJZXJyID0gUFRSX0VSUih0bXApOworCQkJCWdvdG8g ZXJyOworCQkJfQorCisJCQllcnIgPSBpbnRlbF9jb250ZXh0X3Bpbih0bXApOworCQkJaWYgKGVy cikgeworCQkJCWludGVsX2NvbnRleHRfcHV0KHRtcCk7CisJCQkJZ290byBlcnI7CisJCQl9CisK KwkJCWRhdGEuY2VbaV0gPSB0bXA7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShwb2lzb24pOyBpKyspIHsKKwkJCWRhdGEucG9pc29uID0gcG9pc29uW2ldOworCisJCQllcnIg PSBfX2xyY190aW1lc3RhbXAoJmRhdGEsIGZhbHNlKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7 CisKKwkJCWVyciA9IF9fbHJjX3RpbWVzdGFtcCgmZGF0YSwgdHJ1ZSk7CisJCQlpZiAoZXJyKQor CQkJCWJyZWFrOworCQl9CisKK2VycjoKKwkJc3RfZW5naW5lX2hlYXJ0YmVhdF9lbmFibGUoZGF0 YS5lbmdpbmUpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLmNlKTsgaSsrKSB7 CisJCQlpZiAoIWRhdGEuY2VbaV0pCisJCQkJYnJlYWs7CisKKwkJCWludGVsX2NvbnRleHRfdW5w aW4oZGF0YS5jZVtpXSk7CisJCQlpbnRlbF9jb250ZXh0X3B1dChkYXRhLmNlW2ldKTsKKwkJfQor CisJCWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkxNSkpCisJCQllcnIgPSAtRUlPOworCQlpZiAo ZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVj dCBpOTE1X3ZtYSAqCitjcmVhdGVfdXNlcl92bWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCWludCBlcnI7CisKKwlvYmogPSBpOTE1X2dl bV9vYmplY3RfY3JlYXRlX2ludGVybmFsKHZtLT5pOTE1LCBzaXplKTsKKwlpZiAoSVNfRVJSKG9i aikpCisJCXJldHVybiBFUlJfQ0FTVChvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uo b2JqLCB2bSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKKwkJcmV0dXJuIHZtYTsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAw LCAwLCBQSU5fVVNFUik7CisJaWYgKGVycikgeworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7 CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJcmV0dXJuIHZtYTsKK30KKworc3RhdGlj IHN0cnVjdCBpOTE1X3ZtYSAqCitzdG9yZV9jb250ZXh0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpj ZSwgc3RydWN0IGk5MTVfdm1hICpzY3JhdGNoKQoreworCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7 CisJdTMyIGR3LCB4LCAqY3MsICpodzsKKwl1MzIgKmRlZmF1bHRzOworCisJYmF0Y2ggPSBjcmVh dGVfdXNlcl92bWEoY2UtPnZtLCBTWl82NEspOworCWlmIChJU19FUlIoYmF0Y2gpKQorCQlyZXR1 cm4gYmF0Y2g7CisKKwljcyA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKGJhdGNoLT5vYmosIEk5 MTVfTUFQX1dDKTsKKwlpZiAoSVNfRVJSKGNzKSkgeworCQlpOTE1X3ZtYV9wdXQoYmF0Y2gpOwor CQlyZXR1cm4gRVJSX0NBU1QoY3MpOworCX0KKworCWRlZmF1bHRzID0gc2htZW1fcGluX21hcChj ZS0+ZW5naW5lLT5kZWZhdWx0X3N0YXRlKTsKKwlpZiAoIWRlZmF1bHRzKSB7CisJCWk5MTVfZ2Vt X29iamVjdF91bnBpbl9tYXAoYmF0Y2gtPm9iaik7CisJCWk5MTVfdm1hX3B1dChiYXRjaCk7CisJ CXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXggPSAwOworCWR3ID0gMDsKKwlodyA9 IGRlZmF1bHRzOworCWh3ICs9IExSQ19TVEFURV9PRkZTRVQgLyBzaXplb2YoKmh3KTsKKwlkbyB7 CisJCXUzMiBsZW4gPSBod1tkd10gJiAweDdmOworCisJCWlmIChod1tkd10gPT0gMCkgeworCQkJ ZHcrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChod1tkd10gJiBHRU5NQVNLKDMxLCAy MykpICE9IE1JX0lOU1RSKDB4MjIsIDApKSB7CisJCQlkdyArPSBsZW4gKyAyOworCQkJY29udGlu dWU7CisJCX0KKworCQlkdysrOworCQlsZW4gPSAobGVuICsgMSkgLyAyOworCQl3aGlsZSAobGVu LS0pIHsKKwkJCSpjcysrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVNX0dFTjg7CisJCQkqY3MrKyA9 IGh3W2R3XTsKKwkJCSpjcysrID0gbG93ZXJfMzJfYml0cyhzY3JhdGNoLT5ub2RlLnN0YXJ0ICsg eCk7CisJCQkqY3MrKyA9IHVwcGVyXzMyX2JpdHMoc2NyYXRjaC0+bm9kZS5zdGFydCArIHgpOwor CisJCQlkdyArPSAyOworCQkJeCArPSA0OworCQl9CisJfSB3aGlsZSAoZHcgPCBQQUdFX1NJWkUg LyBzaXplb2YodTMyKSAmJgorCQkgKGh3W2R3XSAmIH5CSVQoMCkpICE9IE1JX0JBVENIX0JVRkZF Ul9FTkQpOworCisJKmNzKysgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCisJc2htZW1fdW5waW5f bWFwKGNlLT5lbmdpbmUtPmRlZmF1bHRfc3RhdGUsIGRlZmF1bHRzKTsKKworCWk5MTVfZ2VtX29i amVjdF9mbHVzaF9tYXAoYmF0Y2gtPm9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChi YXRjaC0+b2JqKTsKKworCXJldHVybiBiYXRjaDsKK30KKworc3RhdGljIGludCBtb3ZlX3RvX2Fj dGl2ZShzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycSwKKwkJCSAgc3RydWN0IGk5MTVfdm1hICp2bWEs CisJCQkgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCisJaTkxNV92bWFfbG9j ayh2bWEpOworCWVyciA9IGk5MTVfcmVxdWVzdF9hd2FpdF9vYmplY3QocnEsIHZtYS0+b2JqLCBm bGFncyk7CisJaWYgKCFlcnIpCisJCWVyciA9IGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHZtYSwg cnEsIGZsYWdzKTsKKwlpOTE1X3ZtYV91bmxvY2sodm1hKTsKKworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICoKK3JlY29yZF9yZWdpc3RlcnMoc3RydWN0IGlu dGVsX2NvbnRleHQgKmNlLAorCQkgc3RydWN0IGk5MTVfdm1hICpiZWZvcmUsCisJCSBzdHJ1Y3Qg aTkxNV92bWEgKmFmdGVyLAorCQkgdTMyICpzZW1hKQoreworCXN0cnVjdCBpOTE1X3ZtYSAqYl9i ZWZvcmUsICpiX2FmdGVyOworCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCXUzMiAqY3M7CisJ aW50IGVycjsKKworCWJfYmVmb3JlID0gc3RvcmVfY29udGV4dChjZSwgYmVmb3JlKTsKKwlpZiAo SVNfRVJSKGJfYmVmb3JlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGJfYmVmb3JlKTsKKworCWJfYWZ0 ZXIgPSBzdG9yZV9jb250ZXh0KGNlLCBhZnRlcik7CisJaWYgKElTX0VSUihiX2FmdGVyKSkgewor CQlycSA9IEVSUl9DQVNUKGJfYWZ0ZXIpOworCQlnb3RvIGVycl9iZWZvcmU7CisJfQorCisJcnEg PSBpbnRlbF9jb250ZXh0X2NyZWF0ZV9yZXF1ZXN0KGNlKTsKKwlpZiAoSVNfRVJSKHJxKSkKKwkJ Z290byBlcnJfYWZ0ZXI7CisKKwllcnIgPSBtb3ZlX3RvX2FjdGl2ZShycSwgYmVmb3JlLCBFWEVD X09CSkVDVF9XUklURSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcnE7CisKKwllcnIgPSBtb3Zl X3RvX2FjdGl2ZShycSwgYl9iZWZvcmUsIDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JxOwor CisJZXJyID0gbW92ZV90b19hY3RpdmUocnEsIGFmdGVyLCBFWEVDX09CSkVDVF9XUklURSk7CisJ aWYgKGVycikKKwkJZ290byBlcnJfcnE7CisKKwllcnIgPSBtb3ZlX3RvX2FjdGl2ZShycSwgYl9h ZnRlciwgMCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcnE7CisKKwljcyA9IGludGVsX3Jpbmdf YmVnaW4ocnEsIDE0KTsKKwlpZiAoSVNfRVJSKGNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNzKTsK KwkJZ290byBlcnJfcnE7CisJfQorCisJKmNzKysgPSBNSV9BUkJfT05fT0ZGIHwgTUlfQVJCX0RJ U0FCTEU7CisJKmNzKysgPSBNSV9CQVRDSF9CVUZGRVJfU1RBUlRfR0VOOCB8IEJJVCg4KTsKKwkq Y3MrKyA9IGxvd2VyXzMyX2JpdHMoYl9iZWZvcmUtPm5vZGUuc3RhcnQpOworCSpjcysrID0gdXBw ZXJfMzJfYml0cyhiX2JlZm9yZS0+bm9kZS5zdGFydCk7CisKKwkqY3MrKyA9IE1JX0FSQl9PTl9P RkYgfCBNSV9BUkJfRU5BQkxFOworCSpjcysrID0gTUlfU0VNQVBIT1JFX1dBSVQgfAorCQlNSV9T RU1BUEhPUkVfR0xPQkFMX0dUVCB8CisJCU1JX1NFTUFQSE9SRV9QT0xMIHwKKwkJTUlfU0VNQVBI T1JFX1NBRF9ORVFfU0REOworCSpjcysrID0gMDsKKwkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZzZXQo Y2UtPmVuZ2luZS0+c3RhdHVzX3BhZ2Uudm1hKSArCisJCW9mZnNldF9pbl9wYWdlKHNlbWEpOwor CSpjcysrID0gMDsKKwkqY3MrKyA9IE1JX05PT1A7CisKKwkqY3MrKyA9IE1JX0FSQl9PTl9PRkYg fCBNSV9BUkJfRElTQUJMRTsKKwkqY3MrKyA9IE1JX0JBVENIX0JVRkZFUl9TVEFSVF9HRU44IHwg QklUKDgpOworCSpjcysrID0gbG93ZXJfMzJfYml0cyhiX2FmdGVyLT5ub2RlLnN0YXJ0KTsKKwkq Y3MrKyA9IHVwcGVyXzMyX2JpdHMoYl9hZnRlci0+bm9kZS5zdGFydCk7CisKKwlpbnRlbF9yaW5n X2FkdmFuY2UocnEsIGNzKTsKKworCVdSSVRFX09OQ0UoKnNlbWEsIDApOworCWk5MTVfcmVxdWVz dF9nZXQocnEpOworCWk5MTVfcmVxdWVzdF9hZGQocnEpOworZXJyX2FmdGVyOgorCWk5MTVfdm1h X3B1dChiX2FmdGVyKTsKK2Vycl9iZWZvcmU6CisJaTkxNV92bWFfcHV0KGJfYmVmb3JlKTsKKwly ZXR1cm4gcnE7CisKK2Vycl9ycToKKwlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKKwlycSA9IEVSUl9Q VFIoZXJyKTsKKwlnb3RvIGVycl9hZnRlcjsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X3ZtYSAq bG9hZF9jb250ZXh0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwgdTMyIHBvaXNvbikKK3sKKwlz dHJ1Y3QgaTkxNV92bWEgKmJhdGNoOworCXUzMiBkdywgKmNzLCAqaHc7CisJdTMyICpkZWZhdWx0 czsKKworCWJhdGNoID0gY3JlYXRlX3VzZXJfdm1hKGNlLT52bSwgU1pfNjRLKTsKKwlpZiAoSVNf RVJSKGJhdGNoKSkKKwkJcmV0dXJuIGJhdGNoOworCisJY3MgPSBpOTE1X2dlbV9vYmplY3RfcGlu X21hcChiYXRjaC0+b2JqLCBJOTE1X01BUF9XQyk7CisJaWYgKElTX0VSUihjcykpIHsKKwkJaTkx NV92bWFfcHV0KGJhdGNoKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGNzKTsKKwl9CisKKwlkZWZhdWx0 cyA9IHNobWVtX3Bpbl9tYXAoY2UtPmVuZ2luZS0+ZGVmYXVsdF9zdGF0ZSk7CisJaWYgKCFkZWZh dWx0cykgeworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKGJhdGNoLT5vYmopOworCQlpOTE1 X3ZtYV9wdXQoYmF0Y2gpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlkdyA9 IDA7CisJaHcgPSBkZWZhdWx0czsKKwlodyArPSBMUkNfU1RBVEVfT0ZGU0VUIC8gc2l6ZW9mKCpo dyk7CisJZG8geworCQl1MzIgbGVuID0gaHdbZHddICYgMHg3ZjsKKworCQlpZiAoaHdbZHddID09 IDApIHsKKwkJCWR3Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoaHdbZHddICYgR0VO TUFTSygzMSwgMjMpKSAhPSBNSV9JTlNUUigweDIyLCAwKSkgeworCQkJZHcgKz0gbGVuICsgMjsK KwkJCWNvbnRpbnVlOworCQl9CisKKwkJZHcrKzsKKwkJbGVuID0gKGxlbiArIDEpIC8gMjsKKwkJ KmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX0lNTShsZW4pOworCQl3aGlsZSAobGVuLS0pIHsKKwkJ CSpjcysrID0gaHdbZHddOworCQkJKmNzKysgPSBwb2lzb247CisJCQlkdyArPSAyOworCQl9CisJ fSB3aGlsZSAoZHcgPCBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSAmJgorCQkgKGh3W2R3XSAmIH5C SVQoMCkpICE9IE1JX0JBVENIX0JVRkZFUl9FTkQpOworCisJKmNzKysgPSBNSV9CQVRDSF9CVUZG RVJfRU5EOworCisJc2htZW1fdW5waW5fbWFwKGNlLT5lbmdpbmUtPmRlZmF1bHRfc3RhdGUsIGRl ZmF1bHRzKTsKKworCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9tYXAoYmF0Y2gtPm9iaik7CisJaTkx NV9nZW1fb2JqZWN0X3VucGluX21hcChiYXRjaC0+b2JqKTsKKworCXJldHVybiBiYXRjaDsKK30K Kworc3RhdGljIGludCBwb2lzb25fcmVnaXN0ZXJzKHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSwg dTMyIHBvaXNvbiwgdTMyICpzZW1hKQoreworCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCXN0 cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7CisJdTMyICpjczsKKwlpbnQgZXJyOworCisJYmF0Y2ggPSBs b2FkX2NvbnRleHQoY2UsIHBvaXNvbik7CisJaWYgKElTX0VSUihiYXRjaCkpCisJCXJldHVybiBQ VFJfRVJSKGJhdGNoKTsKKworCXJxID0gaW50ZWxfY29udGV4dF9jcmVhdGVfcmVxdWVzdChjZSk7 CisJaWYgKElTX0VSUihycSkpIHsKKwkJZXJyID0gUFRSX0VSUihycSk7CisJCWdvdG8gZXJyX2Jh dGNoOworCX0KKworCWVyciA9IG1vdmVfdG9fYWN0aXZlKHJxLCBiYXRjaCwgMCk7CisJaWYgKGVy cikKKwkJZ290byBlcnJfcnE7CisKKwljcyA9IGludGVsX3JpbmdfYmVnaW4ocnEsIDgpOworCWlm IChJU19FUlIoY3MpKSB7CisJCWVyciA9IFBUUl9FUlIoY3MpOworCQlnb3RvIGVycl9ycTsKKwl9 CisKKwkqY3MrKyA9IE1JX0FSQl9PTl9PRkYgfCBNSV9BUkJfRElTQUJMRTsKKwkqY3MrKyA9IE1J X0JBVENIX0JVRkZFUl9TVEFSVF9HRU44IHwgQklUKDgpOworCSpjcysrID0gbG93ZXJfMzJfYml0 cyhiYXRjaC0+bm9kZS5zdGFydCk7CisJKmNzKysgPSB1cHBlcl8zMl9iaXRzKGJhdGNoLT5ub2Rl LnN0YXJ0KTsKKworCSpjcysrID0gTUlfU1RPUkVfRFdPUkRfSU1NX0dFTjQgfCBNSV9VU0VfR0dU VDsKKwkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZzZXQoY2UtPmVuZ2luZS0+c3RhdHVzX3BhZ2Uudm1h KSArCisJCW9mZnNldF9pbl9wYWdlKHNlbWEpOworCSpjcysrID0gMDsKKwkqY3MrKyA9IDE7CisK KwlpbnRlbF9yaW5nX2FkdmFuY2UocnEsIGNzKTsKKworCXJxLT5zY2hlZC5hdHRyLnByaW9yaXR5 ID0gSTkxNV9QUklPUklUWV9CQVJSSUVSOworZXJyX3JxOgorCWk5MTVfcmVxdWVzdF9hZGQocnEp OworZXJyX2JhdGNoOgorCWk5MTVfdm1hX3B1dChiYXRjaCk7CisJcmV0dXJuIGVycjsKK30KKwor c3RhdGljIGJvb2wgaXNfbW92aW5nKHUzMiBhLCB1MzIgYikKK3sKKwlyZXR1cm4gYSAhPSBiOwor fQorCitzdGF0aWMgaW50IGNvbXBhcmVfaXNvbGF0aW9uKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSwKKwkJCSAgICAgc3RydWN0IGk5MTVfdm1hICpyZWZbMl0sCisJCQkgICAgIHN0cnVj dCBpOTE1X3ZtYSAqcmVzdWx0WzJdLAorCQkJICAgICBzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Us CisJCQkgICAgIHUzMiBwb2lzb24pCit7CisJdTMyIHgsIGR3LCAqaHcsICpscmM7CisJdTMyICpB WzJdLCAqQlsyXTsKKwl1MzIgKmRlZmF1bHRzOworCWludCBlcnIgPSAwOworCisJQVswXSA9IGk5 MTVfZ2VtX29iamVjdF9waW5fbWFwKHJlZlswXS0+b2JqLCBJOTE1X01BUF9XQyk7CisJaWYgKElT X0VSUihBWzBdKSkKKwkJcmV0dXJuIFBUUl9FUlIoQVswXSk7CisKKwlBWzFdID0gaTkxNV9nZW1f b2JqZWN0X3Bpbl9tYXAocmVmWzFdLT5vYmosIEk5MTVfTUFQX1dDKTsKKwlpZiAoSVNfRVJSKEFb MV0pKSB7CisJCWVyciA9IFBUUl9FUlIoQVsxXSk7CisJCWdvdG8gZXJyX0EwOworCX0KKworCUJb MF0gPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChyZXN1bHRbMF0tPm9iaiwgSTkxNV9NQVBfV0Mp OworCWlmIChJU19FUlIoQlswXSkpIHsKKwkJZXJyID0gUFRSX0VSUihCWzBdKTsKKwkJZ290byBl cnJfQTE7CisJfQorCisJQlsxXSA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHJlc3VsdFsxXS0+ b2JqLCBJOTE1X01BUF9XQyk7CisJaWYgKElTX0VSUihCWzFdKSkgeworCQllcnIgPSBQVFJfRVJS KEJbMV0pOworCQlnb3RvIGVycl9CMDsKKwl9CisKKwlscmMgPSBpOTE1X2dlbV9vYmplY3RfcGlu X21hcChjZS0+c3RhdGUtPm9iaiwKKwkJCQkgICAgICBpOTE1X2NvaGVyZW50X21hcF90eXBlKGVu Z2luZS0+aTkxNSkpOworCWlmIChJU19FUlIobHJjKSkgeworCQllcnIgPSBQVFJfRVJSKGxyYyk7 CisJCWdvdG8gZXJyX0IxOworCX0KKwlscmMgKz0gTFJDX1NUQVRFX09GRlNFVCAvIHNpemVvZigq aHcpOworCisJZGVmYXVsdHMgPSBzaG1lbV9waW5fbWFwKGNlLT5lbmdpbmUtPmRlZmF1bHRfc3Rh dGUpOworCWlmICghZGVmYXVsdHMpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfbHJj OworCX0KKworCXggPSAwOworCWR3ID0gMDsKKwlodyA9IGRlZmF1bHRzOworCWh3ICs9IExSQ19T VEFURV9PRkZTRVQgLyBzaXplb2YoKmh3KTsKKwlkbyB7CisJCXUzMiBsZW4gPSBod1tkd10gJiAw eDdmOworCisJCWlmIChod1tkd10gPT0gMCkgeworCQkJZHcrKzsKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJaWYgKChod1tkd10gJiBHRU5NQVNLKDMxLCAyMykpICE9IE1JX0lOU1RSKDB4MjIsIDAp KSB7CisJCQlkdyArPSBsZW4gKyAyOworCQkJY29udGludWU7CisJCX0KKworCQlkdysrOworCQls ZW4gPSAobGVuICsgMSkgLyAyOworCQl3aGlsZSAobGVuLS0pIHsKKwkJCWlmICghaXNfbW92aW5n KEFbMF1beF0sIEFbMV1beF0pICYmCisJCQkgICAgKEFbMF1beF0gIT0gQlswXVt4XSB8fCBBWzFd W3hdICE9IEJbMV1beF0pKSB7CisJCQkJc3dpdGNoIChod1tkd10gJiA0MDk1KSB7CisJCQkJY2Fz ZSAweDMwOiAvKiBSSU5HX0hFQUQgKi8KKwkJCQljYXNlIDB4MzQ6IC8qIFJJTkdfVEFJTCAqLwor CQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXByX2VycigiJXNbJWRdOiBNaXNtYXRj aCBmb3IgcmVnaXN0ZXIgJTR4LCBkZWZhdWx0ICUwOHgsIHJlZmVyZW5jZSAlMDh4LCByZXN1bHQg KCUwOHgsICUwOHgpLCBwb2lzb24gJTA4eCwgY29udGV4dCAlMDh4XG4iLAorCQkJCQkgICAgICAg ZW5naW5lLT5uYW1lLCBkdywKKwkJCQkJICAgICAgIGh3W2R3XSwgaHdbZHcgKyAxXSwKKwkJCQkJ ICAgICAgIEFbMF1beF0sIEJbMF1beF0sIEJbMV1beF0sCisJCQkJCSAgICAgICBwb2lzb24sIGxy Y1tkdyArIDFdKTsKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQlkdyArPSAy OworCQkJeCsrOworCQl9CisJfSB3aGlsZSAoZHcgPCBQQUdFX1NJWkUgLyBzaXplb2YodTMyKSAm JgorCQkgKGh3W2R3XSAmIH5CSVQoMCkpICE9IE1JX0JBVENIX0JVRkZFUl9FTkQpOworCisJc2ht ZW1fdW5waW5fbWFwKGNlLT5lbmdpbmUtPmRlZmF1bHRfc3RhdGUsIGRlZmF1bHRzKTsKK2Vycl9s cmM6CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChjZS0+c3RhdGUtPm9iaik7CitlcnJfQjE6 CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChyZXN1bHRbMV0tPm9iaik7CitlcnJfQjA6CisJ aTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChyZXN1bHRbMF0tPm9iaik7CitlcnJfQTE6CisJaTkx NV9nZW1fb2JqZWN0X3VucGluX21hcChyZWZbMV0tPm9iaik7CitlcnJfQTA6CisJaTkxNV9nZW1f b2JqZWN0X3VucGluX21hcChyZWZbMF0tPm9iaik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGlj IGludCBfX2xyY19pc29sYXRpb24oc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCB1MzIg cG9pc29uKQoreworCXUzMiAqc2VtYSA9IG1lbXNldDMyKGVuZ2luZS0+c3RhdHVzX3BhZ2UuYWRk ciArIDEwMDAsIDAsIDEpOworCXN0cnVjdCBpOTE1X3ZtYSAqcmVmWzJdLCAqcmVzdWx0WzJdOwor CXN0cnVjdCBpbnRlbF9jb250ZXh0ICpBLCAqQjsKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsK KwlpbnQgZXJyOworCisJQSA9IGludGVsX2NvbnRleHRfY3JlYXRlKGVuZ2luZSk7CisJaWYgKElT X0VSUihBKSkKKwkJcmV0dXJuIFBUUl9FUlIoQSk7CisKKwlCID0gaW50ZWxfY29udGV4dF9jcmVh dGUoZW5naW5lKTsKKwlpZiAoSVNfRVJSKEIpKSB7CisJCWVyciA9IFBUUl9FUlIoQik7CisJCWdv dG8gZXJyX0E7CisJfQorCisJcmVmWzBdID0gY3JlYXRlX3VzZXJfdm1hKEEtPnZtLCBTWl82NEsp OworCWlmIChJU19FUlIocmVmWzBdKSkgeworCQllcnIgPSBQVFJfRVJSKHJlZlswXSk7CisJCWdv dG8gZXJyX0I7CisJfQorCisJcmVmWzFdID0gY3JlYXRlX3VzZXJfdm1hKEEtPnZtLCBTWl82NEsp OworCWlmIChJU19FUlIocmVmWzFdKSkgeworCQllcnIgPSBQVFJfRVJSKHJlZlsxXSk7CisJCWdv dG8gZXJyX3JlZjA7CisJfQorCisJcnEgPSByZWNvcmRfcmVnaXN0ZXJzKEEsIHJlZlswXSwgcmVm WzFdLCBzZW1hKTsKKwlpZiAoSVNfRVJSKHJxKSkgeworCQllcnIgPSBQVFJfRVJSKHJxKTsKKwkJ Z290byBlcnJfcmVmMTsKKwl9CisKKwlXUklURV9PTkNFKCpzZW1hLCAxKTsKKwl3bWIoKTsKKwor CWlmIChpOTE1X3JlcXVlc3Rfd2FpdChycSwgMCwgSFogLyAyKSA8IDApIHsKKwkJaTkxNV9yZXF1 ZXN0X3B1dChycSk7CisJCWVyciA9IC1FVElNRTsKKwkJZ290byBlcnJfcmVmMTsKKwl9CisJaTkx NV9yZXF1ZXN0X3B1dChycSk7CisKKwlyZXN1bHRbMF0gPSBjcmVhdGVfdXNlcl92bWEoQS0+dm0s IFNaXzY0Syk7CisJaWYgKElTX0VSUihyZXN1bHRbMF0pKSB7CisJCWVyciA9IFBUUl9FUlIocmVz dWx0WzBdKTsKKwkJZ290byBlcnJfcmVmMTsKKwl9CisKKwlyZXN1bHRbMV0gPSBjcmVhdGVfdXNl cl92bWEoQS0+dm0sIFNaXzY0Syk7CisJaWYgKElTX0VSUihyZXN1bHRbMV0pKSB7CisJCWVyciA9 IFBUUl9FUlIocmVzdWx0WzFdKTsKKwkJZ290byBlcnJfcmVzdWx0MDsKKwl9CisKKwlycSA9IHJl Y29yZF9yZWdpc3RlcnMoQSwgcmVzdWx0WzBdLCByZXN1bHRbMV0sIHNlbWEpOworCWlmIChJU19F UlIocnEpKSB7CisJCWVyciA9IFBUUl9FUlIocnEpOworCQlnb3RvIGVycl9yZXN1bHQxOworCX0K KworCWVyciA9IHBvaXNvbl9yZWdpc3RlcnMoQiwgcG9pc29uLCBzZW1hKTsKKwlpZiAoZXJyKSB7 CisJCVdSSVRFX09OQ0UoKnNlbWEsIC0xKTsKKwkJaTkxNV9yZXF1ZXN0X3B1dChycSk7CisJCWdv dG8gZXJyX3Jlc3VsdDE7CisJfQorCisJaWYgKGk5MTVfcmVxdWVzdF93YWl0KHJxLCAwLCBIWiAv IDIpIDwgMCkgeworCQlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKKwkJZXJyID0gLUVUSU1FOworCQln b3RvIGVycl9yZXN1bHQxOworCX0KKwlpOTE1X3JlcXVlc3RfcHV0KHJxKTsKKworCWVyciA9IGNv bXBhcmVfaXNvbGF0aW9uKGVuZ2luZSwgcmVmLCByZXN1bHQsIEEsIHBvaXNvbik7CisKK2Vycl9y ZXN1bHQxOgorCWk5MTVfdm1hX3B1dChyZXN1bHRbMV0pOworZXJyX3Jlc3VsdDA6CisJaTkxNV92 bWFfcHV0KHJlc3VsdFswXSk7CitlcnJfcmVmMToKKwlpOTE1X3ZtYV9wdXQocmVmWzFdKTsKK2Vy cl9yZWYwOgorCWk5MTVfdm1hX3B1dChyZWZbMF0pOworZXJyX0I6CisJaW50ZWxfY29udGV4dF9w dXQoQik7CitlcnJfQToKKwlpbnRlbF9jb250ZXh0X3B1dChBKTsKKwlyZXR1cm4gZXJyOworfQor CitzdGF0aWMgYm9vbCBza2lwX2lzb2xhdGlvbihjb25zdCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz ICplbmdpbmUpCit7CisJaWYgKGVuZ2luZS0+Y2xhc3MgPT0gQ09QWV9FTkdJTkVfQ0xBU1MgJiYg SU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPT0gOSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoZW5n aW5lLT5jbGFzcyA9PSBSRU5ERVJfQ0xBU1MgJiYgSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPT0g MTEpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGxp dmVfbHJjX2lzb2xhdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IGludGVsX2d0ICpndCA9IGFy ZzsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7CisJZW51bSBpbnRlbF9lbmdpbmVf aWQgaWQ7CisJY29uc3QgdTMyIHBvaXNvbltdID0geworCQlTVEFDS19NQUdJQywKKwkJMHgzYTNh M2EzYSwKKwkJMHg1YzVjNWM1YywKKwkJMHhmZmZmZmZmZiwKKwkJMHhmZmZmMDAwMCwKKwl9Owor CWludCBlcnIgPSAwOworCisJLyoKKwkgKiBPdXIgZ29hbCBpcyB0cnkgYW5kIHZlcmlmeSB0aGF0 IHBlci1jb250ZXh0IHN0YXRlIGNhbm5vdCBiZQorCSAqIHRhbXBlcmVkIHdpdGggYnkgYW5vdGhl ciBub24tcHJpdmlsZWdlZCBjbGllbnQuCisJICoKKwkgKiBXZSB0YWtlIHRoZSBsaXN0IG9mIGNv bnRleHQgcmVnaXN0ZXJzIGZyb20gdGhlIExSSSBpbiB0aGUgZGVmYXVsdAorCSAqIGNvbnRleHQg aW1hZ2UgYW5kIGF0dGVtcHQgdG8gbW9kaWZ5IHRoYXQgbGlzdCBmcm9tIGEgcmVtb3RlIGNvbnRl eHQuCisJICovCisKKwlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBndCwgaWQpIHsKKwkJaW50IGk7 CisKKwkJLyogSnVzdCBkb24ndCBldmVuIGFzayAqLworCQlpZiAoIUlTX0VOQUJMRUQoQ09ORklH X0RSTV9JOTE1X1NFTEZURVNUX0JST0tFTikgJiYKKwkJICAgIHNraXBfaXNvbGF0aW9uKGVuZ2lu ZSkpCisJCQljb250aW51ZTsKKworCQlpbnRlbF9lbmdpbmVfcG1fZ2V0KGVuZ2luZSk7CisJCWZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvaXNvbik7IGkrKykgeworCQkJaW50IHJlc3VsdDsK KworCQkJcmVzdWx0ID0gX19scmNfaXNvbGF0aW9uKGVuZ2luZSwgcG9pc29uW2ldKTsKKwkJCWlm IChyZXN1bHQgJiYgIWVycikKKwkJCQllcnIgPSByZXN1bHQ7CisKKwkJCXJlc3VsdCA9IF9fbHJj X2lzb2xhdGlvbihlbmdpbmUsIH5wb2lzb25baV0pOworCQkJaWYgKHJlc3VsdCAmJiAhZXJyKQor CQkJCWVyciA9IHJlc3VsdDsKKwkJfQorCQlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2luZSk7CisJ CWlmIChpZ3RfZmx1c2hfdGVzdChndC0+aTkxNSkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlicmVh azsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY3R4 X3N1Ym1pdF9yZXEoc3RydWN0IGludGVsX2NvbnRleHQgKmNlKQoreworCXN0cnVjdCBpOTE1X3Jl cXVlc3QgKnJxOworCWludCBlcnIgPSAwOworCisJcnEgPSBpbnRlbF9jb250ZXh0X2NyZWF0ZV9y ZXF1ZXN0KGNlKTsKKwlpZiAoSVNfRVJSKHJxKSkKKwkJcmV0dXJuIFBUUl9FUlIocnEpOworCisJ aTkxNV9yZXF1ZXN0X2dldChycSk7CisJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisKKwlpZiAoaTkx NV9yZXF1ZXN0X3dhaXQocnEsIDAsIEhaIC8gNSkgPCAwKQorCQllcnIgPSAtRVRJTUU7CisKKwlp OTE1X3JlcXVlc3RfcHV0KHJxKTsKKworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgQ1RYX0JC X0NBTkFSWV9PRkZTRVQgKDMgKiAxMDI0KQorI2RlZmluZSBDVFhfQkJfQ0FOQVJZX0lOREVYICAo Q1RYX0JCX0NBTkFSWV9PRkZTRVQgLyBzaXplb2YodTMyKSkKKworc3RhdGljIHUzMiAqCitlbWl0 X2luZGlyZWN0X2N0eF9iYl9jYW5hcnkoY29uc3Qgc3RydWN0IGludGVsX2NvbnRleHQgKmNlLCB1 MzIgKmNzKQoreworCSpjcysrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVNX0dFTjggfAorCQlNSV9T Uk1fTFJNX0dMT0JBTF9HVFQgfAorCQlNSV9MUklfTFJNX0NTX01NSU87CisJKmNzKysgPSBpOTE1 X21taW9fcmVnX29mZnNldChSSU5HX1NUQVJUKDApKTsKKwkqY3MrKyA9IGk5MTVfZ2d0dF9vZmZz ZXQoY2UtPnN0YXRlKSArCisJCWNvbnRleHRfd2FfYmJfb2Zmc2V0KGNlKSArCisJCUNUWF9CQl9D QU5BUllfT0ZGU0VUOworCSpjcysrID0gMDsKKworCXJldHVybiBjczsKK30KKworc3RhdGljIHZv aWQKK2luZGlyZWN0X2N0eF9iYl9zZXR1cChzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2UpCit7CisJ dTMyICpjcyA9IGNvbnRleHRfaW5kaXJlY3RfYmIoY2UpOworCisJY3NbQ1RYX0JCX0NBTkFSWV9J TkRFWF0gPSAweGRlYWRmMDBkOworCisJc2V0dXBfaW5kaXJlY3RfY3R4X2JiKGNlLCBjZS0+ZW5n aW5lLCBlbWl0X2luZGlyZWN0X2N0eF9iYl9jYW5hcnkpOworfQorCitzdGF0aWMgYm9vbCBjaGVj a19yaW5nX3N0YXJ0KHN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZSkKK3sKKwljb25zdCB1MzIgKiBj b25zdCBjdHhfYmIgPSAodm9pZCAqKShjZS0+bHJjX3JlZ19zdGF0ZSkgLQorCQlMUkNfU1RBVEVf T0ZGU0VUICsgY29udGV4dF93YV9iYl9vZmZzZXQoY2UpOworCisJaWYgKGN0eF9iYltDVFhfQkJf Q0FOQVJZX0lOREVYXSA9PSBjZS0+bHJjX3JlZ19zdGF0ZVtDVFhfUklOR19TVEFSVF0pCisJCXJl dHVybiB0cnVlOworCisJcHJfZXJyKCJyaW5nIHN0YXJ0IG1pc21hdGNoOiBjYW5hcnkgMHglMDh4 IHZzIHN0YXRlIDB4JTA4eFxuIiwKKwkgICAgICAgY3R4X2JiW0NUWF9CQl9DQU5BUllfSU5ERVhd LAorCSAgICAgICBjZS0+bHJjX3JlZ19zdGF0ZVtDVFhfUklOR19TVEFSVF0pOworCisJcmV0dXJu IGZhbHNlOworfQorCitzdGF0aWMgaW50IGluZGlyZWN0X2N0eF9iYl9jaGVjayhzdHJ1Y3QgaW50 ZWxfY29udGV4dCAqY2UpCit7CisJaW50IGVycjsKKworCWVyciA9IGluZGlyZWN0X2N0eF9zdWJt aXRfcmVxKGNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFjaGVja19yaW5n X3N0YXJ0KGNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBfX2xpdmVfbHJjX2luZGlyZWN0X2N0eF9iYihzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpCit7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmEsICpiOworCWludCBlcnI7CisKKwlh ID0gaW50ZWxfY29udGV4dF9jcmVhdGUoZW5naW5lKTsKKwlpZiAoSVNfRVJSKGEpKQorCQlyZXR1 cm4gUFRSX0VSUihhKTsKKwllcnIgPSBpbnRlbF9jb250ZXh0X3BpbihhKTsKKwlpZiAoZXJyKQor CQlnb3RvIHB1dF9hOworCisJYiA9IGludGVsX2NvbnRleHRfY3JlYXRlKGVuZ2luZSk7CisJaWYg KElTX0VSUihiKSkgeworCQllcnIgPSBQVFJfRVJSKGIpOworCQlnb3RvIHVucGluX2E7CisJfQor CWVyciA9IGludGVsX2NvbnRleHRfcGluKGIpOworCWlmIChlcnIpCisJCWdvdG8gcHV0X2I7CisK KwkvKiBXZSB1c2UgdGhlIGFscmVhZHkgcmVzZXJ2ZWQgZXh0cmEgcGFnZSBpbiBjb250ZXh0IHN0 YXRlICovCisJaWYgKCFhLT53YV9iYl9wYWdlKSB7CisJCUdFTV9CVUdfT04oYi0+d2FfYmJfcGFn ZSk7CisJCUdFTV9CVUdfT04oSU5URUxfR0VOKGVuZ2luZS0+aTkxNSkgPT0gMTIpOworCQlnb3Rv IHVucGluX2I7CisJfQorCisJLyoKKwkgKiBJbiBvcmRlciB0byB0ZXN0IHRoYXQgb3VyIHBlciBj b250ZXh0IGJiIGlzIHRydWx5IHBlciBjb250ZXh0LAorCSAqIGFuZCBleGVjdXRlcyBhdCB0aGUg aW50ZW5kZWQgc3BvdCBvbiBjb250ZXh0IHJlc3RvcmluZyBwcm9jZXNzLAorCSAqIG1ha2UgdGhl IGJhdGNoIHN0b3JlIHRoZSByaW5nIHN0YXJ0IHZhbHVlIHRvIG1lbW9yeS4KKwkgKiBBcyByaW5n IHN0YXJ0IGlzIHJlc3RvcmVkIGFwcmlvcmkgb2Ygc3RhcnRpbmcgdGhlIGluZGlyZWN0IGN0eCBi YiBhbmQKKwkgKiBhcyBpdCB3aWxsIGJlIGRpZmZlcmVudCBmb3IgZWFjaCBjb250ZXh0LCBpdCBm aXRzIHRvIHRoaXMgcHVycG9zZS4KKwkgKi8KKwlpbmRpcmVjdF9jdHhfYmJfc2V0dXAoYSk7CisJ aW5kaXJlY3RfY3R4X2JiX3NldHVwKGIpOworCisJZXJyID0gaW5kaXJlY3RfY3R4X2JiX2NoZWNr KGEpOworCWlmIChlcnIpCisJCWdvdG8gdW5waW5fYjsKKworCWVyciA9IGluZGlyZWN0X2N0eF9i Yl9jaGVjayhiKTsKKwordW5waW5fYjoKKwlpbnRlbF9jb250ZXh0X3VucGluKGIpOworcHV0X2I6 CisJaW50ZWxfY29udGV4dF9wdXQoYik7Cit1bnBpbl9hOgorCWludGVsX2NvbnRleHRfdW5waW4o YSk7CitwdXRfYToKKwlpbnRlbF9jb250ZXh0X3B1dChhKTsKKworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBpbnQgbGl2ZV9scmNfaW5kaXJlY3RfY3R4X2JiKHZvaWQgKmFyZykKK3sKKwlzdHJ1 Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsK KwllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsKKwlpbnQgZXJyID0gMDsKKworCWZvcl9lYWNoX2Vu Z2luZShlbmdpbmUsIGd0LCBpZCkgeworCQlpbnRlbF9lbmdpbmVfcG1fZ2V0KGVuZ2luZSk7CisJ CWVyciA9IF9fbGl2ZV9scmNfaW5kaXJlY3RfY3R4X2JiKGVuZ2luZSk7CisJCWludGVsX2VuZ2lu ZV9wbV9wdXQoZW5naW5lKTsKKworCQlpZiAoaWd0X2ZsdXNoX3Rlc3QoZ3QtPmk5MTUpKQorCQkJ ZXJyID0gLUVJTzsKKworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsK K30KKworc3RhdGljIHZvaWQgZ2FyYmFnZV9yZXNldChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUsCisJCQkgIHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxKQoreworCWNvbnN0IHVuc2lnbmVk IGludCBiaXQgPSBJOTE1X1JFU0VUX0VOR0lORSArIGVuZ2luZS0+aWQ7CisJdW5zaWduZWQgbG9u ZyAqbG9jayA9ICZlbmdpbmUtPmd0LT5yZXNldC5mbGFnczsKKworCWlmICh0ZXN0X2FuZF9zZXRf Yml0KGJpdCwgbG9jaykpCisJCXJldHVybjsKKworCXRhc2tsZXRfZGlzYWJsZSgmZW5naW5lLT5l eGVjbGlzdHMudGFza2xldCk7CisKKwlpZiAoIXJxLT5mZW5jZS5lcnJvcikKKwkJaW50ZWxfZW5n aW5lX3Jlc2V0KGVuZ2luZSwgTlVMTCk7CisKKwl0YXNrbGV0X2VuYWJsZSgmZW5naW5lLT5leGVj bGlzdHMudGFza2xldCk7CisJY2xlYXJfYW5kX3dha2VfdXBfYml0KGJpdCwgbG9jayk7Cit9CisK K3N0YXRpYyBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpnYXJiYWdlKHN0cnVjdCBpbnRlbF9jb250ZXh0 ICpjZSwKKwkJCQkgICAgc3RydWN0IHJuZF9zdGF0ZSAqcHJuZykKK3sKKwlzdHJ1Y3QgaTkxNV9y ZXF1ZXN0ICpycTsKKwlpbnQgZXJyOworCisJZXJyID0gaW50ZWxfY29udGV4dF9waW4oY2UpOwor CWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwlwcmFuZG9tX2J5dGVzX3N0YXRl KHBybmcsCisJCQkgICAgY2UtPmxyY19yZWdfc3RhdGUsCisJCQkgICAgY2UtPmVuZ2luZS0+Y29u dGV4dF9zaXplIC0KKwkJCSAgICBMUkNfU1RBVEVfT0ZGU0VUKTsKKworCXJxID0gaW50ZWxfY29u dGV4dF9jcmVhdGVfcmVxdWVzdChjZSk7CisJaWYgKElTX0VSUihycSkpIHsKKwkJZXJyID0gUFRS X0VSUihycSk7CisJCWdvdG8gZXJyX3VucGluOworCX0KKworCWk5MTVfcmVxdWVzdF9nZXQocnEp OworCWk5MTVfcmVxdWVzdF9hZGQocnEpOworCXJldHVybiBycTsKKworZXJyX3VucGluOgorCWlu dGVsX2NvbnRleHRfdW5waW4oY2UpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRp YyBpbnQgX19scmNfZ2FyYmFnZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsIHN0cnVj dCBybmRfc3RhdGUgKnBybmcpCit7CisJc3RydWN0IGludGVsX2NvbnRleHQgKmNlOworCXN0cnVj dCBpOTE1X3JlcXVlc3QgKmhhbmc7CisJaW50IGVyciA9IDA7CisKKwljZSA9IGludGVsX2NvbnRl eHRfY3JlYXRlKGVuZ2luZSk7CisJaWYgKElTX0VSUihjZSkpCisJCXJldHVybiBQVFJfRVJSKGNl KTsKKworCWhhbmcgPSBnYXJiYWdlKGNlLCBwcm5nKTsKKwlpZiAoSVNfRVJSKGhhbmcpKSB7CisJ CWVyciA9IFBUUl9FUlIoaGFuZyk7CisJCWdvdG8gZXJyX2NlOworCX0KKworCWlmICh3YWl0X2Zv cl9zdWJtaXQoZW5naW5lLCBoYW5nLCBIWiAvIDIpKSB7CisJCWk5MTVfcmVxdWVzdF9wdXQoaGFu Zyk7CisJCWVyciA9IC1FVElNRTsKKwkJZ290byBlcnJfY2U7CisJfQorCisJaW50ZWxfY29udGV4 dF9zZXRfYmFubmVkKGNlKTsKKwlnYXJiYWdlX3Jlc2V0KGVuZ2luZSwgaGFuZyk7CisKKwlpbnRl bF9lbmdpbmVfZmx1c2hfc3VibWlzc2lvbihlbmdpbmUpOworCWlmICghaGFuZy0+ZmVuY2UuZXJy b3IpIHsKKwkJaTkxNV9yZXF1ZXN0X3B1dChoYW5nKTsKKwkJcHJfZXJyKCIlczogY29ycnVwdGVk IGNvbnRleHQgd2FzIG5vdCByZXNldFxuIiwKKwkJICAgICAgIGVuZ2luZS0+bmFtZSk7CisJCWVy ciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2NlOworCX0KKworCWlmIChpOTE1X3JlcXVlc3Rfd2Fp dChoYW5nLCAwLCBIWiAvIDIpIDwgMCkgeworCQlwcl9lcnIoIiVzOiBjb3JydXB0ZWQgY29udGV4 dCBkaWQgbm90IHJlY292ZXJcbiIsCisJCSAgICAgICBlbmdpbmUtPm5hbWUpOworCQlpOTE1X3Jl cXVlc3RfcHV0KGhhbmcpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9jZTsKKwl9CisJaTkx NV9yZXF1ZXN0X3B1dChoYW5nKTsKKworZXJyX2NlOgorCWludGVsX2NvbnRleHRfcHV0KGNlKTsK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxpdmVfbHJjX2dhcmJhZ2Uodm9pZCAqYXJn KQoreworCXN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBhcmc7CisJc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lOworCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOworCisJLyoKKwkgKiBWZXJpZnkg dGhhdCB3ZSBjYW4gcmVjb3ZlciBpZiBvbmUgY29udGV4dCBzdGF0ZSBpcyBjb21wbGV0ZWx5CisJ ICogY29ycnVwdGVkLgorCSAqLworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9T RUxGVEVTVF9CUk9LRU4pKQorCQlyZXR1cm4gMDsKKworCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUs IGd0LCBpZCkgeworCQlJOTE1X1JORF9TVEFURShwcm5nKTsKKwkJaW50IGVyciA9IDAsIGk7CisK KwkJaWYgKCFpbnRlbF9oYXNfcmVzZXRfZW5naW5lKGVuZ2luZS0+Z3QpKQorCQkJY29udGludWU7 CisKKwkJaW50ZWxfZW5naW5lX3BtX2dldChlbmdpbmUpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsg aSsrKSB7CisJCQllcnIgPSBfX2xyY19nYXJiYWdlKGVuZ2luZSwgJnBybmcpOworCQkJaWYgKGVy cikKKwkJCQlicmVhazsKKwkJfQorCQlpbnRlbF9lbmdpbmVfcG1fcHV0KGVuZ2luZSk7CisKKwkJ aWYgKGlndF9mbHVzaF90ZXN0KGd0LT5pOTE1KSkKKwkJCWVyciA9IC1FSU87CisJCWlmIChlcnIp CisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbGl2 ZV9wcGh3c3BfcnVudGltZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3Ry dWN0IGludGVsX2NvbnRleHQgKmNlOworCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCUlHVF9U SU1FT1VUKGVuZF90aW1lKTsKKwlpbnQgZXJyOworCisJY2UgPSBpbnRlbF9jb250ZXh0X2NyZWF0 ZShlbmdpbmUpOworCWlmIChJU19FUlIoY2UpKQorCQlyZXR1cm4gUFRSX0VSUihjZSk7CisKKwlj ZS0+cnVudGltZS5udW1fdW5kZXJmbG93ID0gMDsKKwljZS0+cnVudGltZS5tYXhfdW5kZXJmbG93 ID0gMDsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IGxvb3AgPSAxMDI0OworCisJCXdoaWxlIChs b29wKSB7CisJCQlycSA9IGludGVsX2NvbnRleHRfY3JlYXRlX3JlcXVlc3QoY2UpOworCQkJaWYg KElTX0VSUihycSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHJxKTsKKwkJCQlnb3RvIGVycl9ycTsK KwkJCX0KKworCQkJaWYgKC0tbG9vcCA9PSAwKQorCQkJCWk5MTVfcmVxdWVzdF9nZXQocnEpOwor CisJCQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKKwkJfQorCisJCWlmIChfX2lndF90aW1lb3V0KGVu ZF90aW1lLCBOVUxMKSkKKwkJCWJyZWFrOworCisJCWk5MTVfcmVxdWVzdF9wdXQocnEpOworCX0g d2hpbGUgKDEpOworCisJZXJyID0gaTkxNV9yZXF1ZXN0X3dhaXQocnEsIDAsIEhaIC8gNSk7CisJ aWYgKGVyciA8IDApIHsKKwkJcHJfZXJyKCIlczogcmVxdWVzdCBub3QgY29tcGxldGVkIVxuIiwg ZW5naW5lLT5uYW1lKTsKKwkJZ290byBlcnJfd2FpdDsKKwl9CisKKwlpZ3RfZmx1c2hfdGVzdChl bmdpbmUtPmk5MTUpOworCisJcHJfaW5mbygiJXM6IHBwaHdzcCBydW50aW1lICVsbHVucywgYXZl cmFnZSAlbGx1bnNcbiIsCisJCWVuZ2luZS0+bmFtZSwKKwkJaW50ZWxfY29udGV4dF9nZXRfdG90 YWxfcnVudGltZV9ucyhjZSksCisJCWludGVsX2NvbnRleHRfZ2V0X2F2Z19ydW50aW1lX25zKGNl KSk7CisKKwllcnIgPSAwOworCWlmIChjZS0+cnVudGltZS5udW1fdW5kZXJmbG93KSB7CisJCXBy X2VycigiJXM6IHBwaHdzcCB1bmRlcmZsb3cgJXUgdGltZShzKSwgbWF4ICV1IGN5Y2xlcyFcbiIs CisJCSAgICAgICBlbmdpbmUtPm5hbWUsCisJCSAgICAgICBjZS0+cnVudGltZS5udW1fdW5kZXJm bG93LAorCQkgICAgICAgY2UtPnJ1bnRpbWUubWF4X3VuZGVyZmxvdyk7CisJCUdFTV9UUkFDRV9E VU1QKCk7CisJCWVyciA9IC1FT1ZFUkZMT1c7CisJfQorCitlcnJfd2FpdDoKKwlpOTE1X3JlcXVl c3RfcHV0KHJxKTsKK2Vycl9ycToKKwlpbnRlbF9jb250ZXh0X3B1dChjZSk7CisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGludCBsaXZlX3BwaHdzcF9ydW50aW1lKHZvaWQgKmFyZykKK3sKKwlz dHJ1Y3QgaW50ZWxfZ3QgKmd0ID0gYXJnOworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZTsKKwllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsKKwlpbnQgZXJyID0gMDsKKworCS8qCisJICog Q2hlY2sgdGhhdCBjdW11bGF0aXZlIGNvbnRleHQgcnVudGltZSBhcyBzdG9yZWQgaW4gdGhlIHBw aHdzcFsxNl0KKwkgKiBpcyBtb25vdG9uaWMuCisJICovCisKKwlmb3JfZWFjaF9lbmdpbmUoZW5n aW5lLCBndCwgaWQpIHsKKwkJZXJyID0gX19saXZlX3BwaHdzcF9ydW50aW1lKGVuZ2luZSk7CisJ CWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaWd0X2ZsdXNoX3Rlc3QoZ3QtPmk5MTUp KQorCQllcnIgPSAtRUlPOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGludGVsX2xyY19saXZl X3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdGF0aWMgY29u c3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0geworCQlTVUJURVNUKGxpdmVfbHJjX2xh eW91dCksCisJCVNVQlRFU1QobGl2ZV9scmNfZml4ZWQpLAorCQlTVUJURVNUKGxpdmVfbHJjX3N0 YXRlKSwKKwkJU1VCVEVTVChsaXZlX2xyY19ncHIpLAorCQlTVUJURVNUKGxpdmVfbHJjX2lzb2xh dGlvbiksCisJCVNVQlRFU1QobGl2ZV9scmNfdGltZXN0YW1wKSwKKwkJU1VCVEVTVChsaXZlX2xy Y19nYXJiYWdlKSwKKwkJU1VCVEVTVChsaXZlX3BwaHdzcF9ydW50aW1lKSwKKwkJU1VCVEVTVChs aXZlX2xyY19pbmRpcmVjdF9jdHhfYmIpLAorCX07CisKKwlpZiAoIUhBU19MT0dJQ0FMX1JJTkdf Q09OVEVYVFMoaTkxNSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGludGVsX2d0X2xpdmVfc3Vi dGVzdHModGVzdHMsICZpOTE1LT5ndCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC91Yy9pbnRlbF9ndWNfYWRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9p bnRlbF9ndWNfYWRzLmMKaW5kZXggMWEyZTRmNjMxNzYzLi4xNzUyNjcxNzM2OGMgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19hZHMuYworKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfYWRzLmMKQEAgLTMsOCArMyw4IEBACiAg KiBDb3B5cmlnaHQgwqkgMjAxNC0yMDE5IEludGVsIENvcnBvcmF0aW9uCiAgKi8KIAotI2luY2x1 ZGUgImd0L2ludGVsX2V4ZWNsaXN0c19zdWJtaXNzaW9uLmgiIC8qIGxyYyBsYXlvdXQgKi8KICNp bmNsdWRlICJndC9pbnRlbF9ndC5oIgorI2luY2x1ZGUgImd0L2ludGVsX2xyYy5oIgogI2luY2x1 ZGUgImludGVsX2d1Y19hZHMuaCIKICNpbmNsdWRlICJpbnRlbF91Yy5oIgogI2luY2x1ZGUgImk5 MTVfZHJ2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9n dWNfc3VibWlzc2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1 Ym1pc3Npb24uYwppbmRleCA4NTI4YWI1NzRkYmUuLjY5NGVlNDI0YjRlZSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uYworKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5jCkBAIC0xMSw3 ICsxMSw3IEBACiAjaW5jbHVkZSAiZ3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaCIgLyog WFhYICovCiAjaW5jbHVkZSAiZ3QvaW50ZWxfZ3QuaCIKICNpbmNsdWRlICJndC9pbnRlbF9ndF9w bS5oIgotI2luY2x1ZGUgImd0L2ludGVsX2xyY19yZWcuaCIKKyNpbmNsdWRlICJndC9pbnRlbF9s cmMuaCIKICNpbmNsdWRlICJndC9pbnRlbF9yaW5nLmgiCiAKICNpbmNsdWRlICJpbnRlbF9ndWNf c3VibWlzc2lvbi5oIgpAQCAtNDAyLDYgKzQwMiwyOCBAQCBjYW5jZWxfcG9ydF9yZXF1ZXN0cyhz dHJ1Y3QgaW50ZWxfZW5naW5lX2V4ZWNsaXN0cyAqIGNvbnN0IGV4ZWNsaXN0cykKIAkJbWVtc2V0 KGV4ZWNsaXN0cy0+aW5mbGlnaHQsIDAsIHNpemVvZihleGVjbGlzdHMtPmluZmxpZ2h0KSk7CiB9 CiAKK3N0YXRpYyB2b2lkIGd1Y19yZXNldF9zdGF0ZShzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2Us CisJCQkgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAorCQkJICAgIHUzMiBoZWFk LAorCQkJICAgIGJvb2wgc2NydWIpCit7CisJR0VNX0JVR19PTighaW50ZWxfY29udGV4dF9pc19w aW5uZWQoY2UpKTsKKworCS8qCisJICogV2Ugd2FudCBhIHNpbXBsZSBjb250ZXh0ICsgcmluZyB0 byBleGVjdXRlIHRoZSBicmVhZGNydW1iIHVwZGF0ZS4KKwkgKiBXZSBjYW5ub3QgcmVseSBvbiB0 aGUgY29udGV4dCBiZWluZyBpbnRhY3QgYWNyb3NzIHRoZSBHUFUgaGFuZywKKwkgKiBzbyBjbGVh ciBpdCBhbmQgcmVidWlsZCBqdXN0IHdoYXQgd2UgbmVlZCBmb3IgdGhlIGJyZWFkY3J1bWIuCisJ ICogQWxsIHBlbmRpbmcgcmVxdWVzdHMgZm9yIHRoaXMgY29udGV4dCB3aWxsIGJlIHphcHBlZCwg YW5kIGFueQorCSAqIGZ1dHVyZSByZXF1ZXN0IHdpbGwgYmUgYWZ0ZXIgdXNlcnNwYWNlIGhhcyBo YWQgdGhlIG9wcG9ydHVuaXR5CisJICogdG8gcmVjcmVhdGUgaXRzIG93biBzdGF0ZS4KKwkgKi8K KwlpZiAoc2NydWIpCisJCWxyY19pbml0X3JlZ3MoY2UsIGVuZ2luZSwgdHJ1ZSk7CisKKwkvKiBS ZXJ1biB0aGUgcmVxdWVzdDsgaXRzIHBheWxvYWQgaGFzIGJlZW4gbmV1dGVyZWQgKGlmIGd1aWx0 eSkuICovCisJbHJjX3VwZGF0ZV9yZWdzKGNlLCBlbmdpbmUsIGhlYWQpOworfQorCiBzdGF0aWMg dm9pZCBndWNfcmVzZXRfcmV3aW5kKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwgYm9v bCBzdGFsbGVkKQogewogCXN0cnVjdCBpbnRlbF9lbmdpbmVfZXhlY2xpc3RzICogY29uc3QgZXhl Y2xpc3RzID0gJmVuZ2luZS0+ZXhlY2xpc3RzOwpAQCAtNDIxLDcgKzQ0Myw3IEBAIHN0YXRpYyB2 b2lkIGd1Y19yZXNldF9yZXdpbmQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCBib29s IHN0YWxsZWQpCiAJCXN0YWxsZWQgPSBmYWxzZTsKIAogCV9faTkxNV9yZXF1ZXN0X3Jlc2V0KHJx LCBzdGFsbGVkKTsKLQlpbnRlbF9scl9jb250ZXh0X3Jlc2V0KGVuZ2luZSwgcnEtPmNvbnRleHQs IHJxLT5oZWFkLCBzdGFsbGVkKTsKKwlndWNfcmVzZXRfc3RhdGUocnEtPmNvbnRleHQsIGVuZ2lu ZSwgcnEtPmhlYWQsIHN0YWxsZWQpOwogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmVuZ2luZS0+YWN0aXZlLmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d2dC9zY2hlZHVsZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9z Y2hlZHVsZXIuYwppbmRleCBlZDMwZmRkZTQxMTQuLjZhZjVjMDZjYWVlMCAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L3NjaGVkdWxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d2dC9zY2hlZHVsZXIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgImdlbS9p OTE1X2dlbV9wbS5oIgogI2luY2x1ZGUgImd0L2ludGVsX2NvbnRleHQuaCIKICNpbmNsdWRlICJn dC9pbnRlbF9leGVjbGlzdHNfc3VibWlzc2lvbi5oIgorI2luY2x1ZGUgImd0L2ludGVsX2xyYy5o IgogI2luY2x1ZGUgImd0L2ludGVsX3JpbmcuaCIKIAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3BlcmYuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfcGVyZi5jCmluZGV4IDU4Y2FhM2YxYTM4Yi4uZjY1YzMyYmQ5NzBlIDEw MDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3BlcmYuYworKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X3BlcmYuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAjaW5jbHVkZSAi Z3QvaW50ZWxfZXhlY2xpc3RzX3N1Ym1pc3Npb24uaCIKICNpbmNsdWRlICJndC9pbnRlbF9ncHVf Y29tbWFuZHMuaCIKICNpbmNsdWRlICJndC9pbnRlbF9ndC5oIgotI2luY2x1ZGUgImd0L2ludGVs X2xyY19yZWcuaCIKKyNpbmNsdWRlICJndC9pbnRlbF9scmMuaCIKICNpbmNsdWRlICJndC9pbnRl bF9yaW5nLmgiCiAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgotLSAKMi4yMC4xCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBs aXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK