From owner-freebsd-mips@freebsd.org Fri Sep 16 19:03:02 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2D314BDD8B6 for ; Fri, 16 Sep 2016 19:03:02 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 00279C5D for ; Fri, 16 Sep 2016 19:03:01 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id B5AFBB0EB; Fri, 16 Sep 2016 19:03:00 +0000 (UTC) Date: Fri, 16 Sep 2016 19:03:00 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <17227ff5cee59ab31c13030b2aea797d@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcQeQ= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_17227ff5cee59ab31c13030b2aea797d" X-Mailman-Approved-At: Fri, 16 Sep 2016 19:25:37 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 19:03:02 -0000 --b1_17227ff5cee59ab31c13030b2aea797d Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkwLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgUHVsbCBpbiBDSEVSSSBjaGFuZ2UgdG8gZml4IGNvbXBpbGUgdGltZSBl cnJvcnMuICBVcGRhdGUgYW5kIGNvbXBpbGUKICB0ZXN0ZWQgd29ybGQva2VybmVsIHZpYSBtaXBz NjQgdGFyZ2V0IGFuZCBNQUxUQTY0IHVuZGVyIHFlbXUuCiAgCiAgcmVmOgogIGh0dHBzOi8vZ2l0 aHViLmNvbS9DVFNSRC1DSEVSSS9jaGVyaWJzZC9jb21taXQvY2E4OTI0NTQ2ZmFmZjQxMWQyNTM5 YzRjZDMwYmQxNWFhYTIzMjgyNCNkaWZmLTFmMzdhNmY4YjY5Njc4Yjc3MDBhYmNjZjBkNTFmYWNi CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBM QVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz0yMDM4NyZp ZD0yMDM5MAoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Qy NTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJrdm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2Zp bGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1pcHMKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFt LmgKICBzeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBz eXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlw cy9taXBzL2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMv bWlwcy9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9t aXBzL21pcHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMv bWlwcy9zd3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5j CiAgc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVw LmMKICBzeXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3 cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVu bywgc3NvbgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxp c3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K --b1_17227ff5cee59ab31c13030b2aea797d Content-Type: text/x-patch; charset=utf-8; name="D2535.20390.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20390.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5 IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0 ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7 CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT LCBQQUdFX1NJWkUsIDApKQpAQCAtNjIsMTIgKzY2LDE4IEBACiAJCQlpZiAod2FpdCAmIE1fTk9X QUlUKQogCQkJCXJldHVybiAoTlVMTCk7CiAJCQllbHNlCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisJCQkJcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCk7CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLwogCQkJCVZNX1dBSVQ7CisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8K IAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKIAlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlp ZiAoKHdhaXQgJiBNX05PRFVNUCkgPT0gMCkKKwkJZHVtcF9hZGRfcGFnZShwYSk7CiAJdmEgPSAo dm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1QocGEpOwogCWlmICgod2FpdCAmIE1fWkVSTykgJiYg KG0tPmZsYWdzICYgUEdfWkVSTykgPT0gMCkKIAkJYnplcm8odmEsIFBBR0VfU0laRSk7CmRpZmYg LS1naXQgYS9zeXMvbWlwcy9taXBzL3RyYXAuYyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCi0tLSBh L3N5cy9taXBzL21pcHMvdHJhcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCkBAIC04MSw2 ICs4MSw3IEBACiAjaW5jbHVkZSA8bWFjaGluZS9taXBzX29wY29kZS5oPgogI2luY2x1ZGUgPG1h Y2hpbmUvZnJhbWUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3JlZ251bS5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvdGxiLmg+CiAjaW5jbHVkZSA8bWFjaGluZS90bHMuaD4KIAogI2lmZGVmIEREQgpAQCAt MjY0LDcgKzI2NSw3IEBACiAJInJlc2VydmVkIDIxIiwKIAkicmVzZXJ2ZWQgMjIiLAogCSJ3YXRj aCIsCi0JInJlc2VydmVkIDI0IiwKKwkibWFjaGluZSBjaGVjayIsCiAJInJlc2VydmVkIDI1IiwK IAkicmVzZXJ2ZWQgMjYiLAogCSJyZXNlcnZlZCAyNyIsCkBAIC02MzIsNiArNjMzLDMzIEBACiAj ZW5kaWYKIAkJcGFuaWMoIk1DSEVDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgVF9NQ0hFQ0sgKyBU X1VTRVI6CisJCXsKKwkJCXVpbnQzMl90IHN0YXR1cyA9IG1pcHNfcmRfc3RhdHVzKCk7CisKKwkJ CWlmIChzdGF0dXMgJiBNSVBTX1NSX1RTKSB7CisJCQkJLyoKKwkJCQkgKiBNYWNoaW5lIENoZWNr IGV4Y2VwdGlvbiBjYXVzZWQgYnkgVExCCisJCQkJICogZGV0ZWN0aW5nIGEgbWF0Y2ggZm9yIG11 bHRpcGxlIGVudHJpZXMuCisJCQkJICoKKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1 c2hpbmcgdGhlIHVzZXIgVExCCisJCQkJICogYW5kIHJlc2V0dGluZyB0aGUgc3RhdHVzIGJpdC4K KwkJCQkgKi8KKwkJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgaW4gVXNlciAtIER1cCBUTEIgZW50 cnkuICIKKwkJCQkgICAgIlJlY292ZXJpbmcuLi5cbiIpOworCQkJCXBtYXAgPSAmcC0+cF92bXNw YWNlLT52bV9wbWFwOworCQkJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCQkJCW1p cHNfd3Jfc3RhdHVzKHN0YXR1cyAmIH5NSVBTX1NSX1RTKTsKKworCQkJCXJldHVybiAodHJhcGZy YW1lLT5wYyk7CisJCQl9IGVsc2UgeworI2lmZGVmIEREQgorCQkJCWtkYl90cmFwKHR5cGUsIDAs IHRyYXBmcmFtZSk7CisjZW5kaWYKKwkJCQlwYW5pYygiTUNIRUNLXG4iKTsKKwkJCX0KKwkJfQor CQlicmVhazsKIAljYXNlIFRfVExCX01PRDoKIAkJLyogY2hlY2sgZm9yIGtlcm5lbCBhZGRyZXNz ICovCiAJCWlmIChLRVJOTEFORCh0cmFwZnJhbWUtPmJhZHZhZGRyKSkgewpAQCAtNjk0LDEwICs3 MjIsMjMgQEAKIAogCWNhc2UgVF9UTEJfTERfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9Q Uk9UX1JFQUQ7Ci0JCWdvdG8gZG9mYXVsdDsKKwkJZ290byBjaGVja3JlZmJpdDsKIAogCWNhc2Ug VF9UTEJfU1RfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9QUk9UX1dSSVRFOworCitjaGVj a3JlZmJpdDoKKwkJLyoKKwkJICogV2FzIHRoaXMgdHJhcCBjYXVzZWQgYnkgdGhlIFBURV9WUiBi aXQgbm90IGJlaW5nIHNldD8KKwkJICovCisJCWlmIChwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZCgm cC0+cF92bXNwYWNlLT52bV9wbWFwLAorCQkgICAgdHJhcGZyYW1lLT5iYWR2YWRkcikgPT0gMCkg eworCQkJaWYgKCF1c2VybW9kZSkgeworCQkJCXJldHVybiAodHJhcGZyYW1lLT5wYyk7CisJCQl9 CisJCQlnb3RvIG91dDsKKwkJfQorCiBkb2ZhdWx0OgogCQl7CiAJCQl2bV9vZmZzZXRfdCB2YTsK QEAgLTE0MTEsOSArMTQ1MiwxNiBAQAogCXN0cnVjdCBwcm9jICpwID0gY3VycHJvYzsKIAogCXBk ZXAgPSAoJihwLT5wX3Ztc3BhY2UtPnZtX3BtYXAucG1fc2VndGFiWyh2YSA+PiBTRUdTSElGVCkg JiAoTlBERVBHIC0gMSldKSk7Ci0JaWYgKCpwZGVwKQotCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBf dm1zcGFjZS0+dm1fcG1hcCwgdmEpOwotCWVsc2UKKwlpZiAoKnBkZXApIHsKKyNpZiBWTV9OUkVT RVJWTEVWRUwgPiAwCisJCXBkX2VudHJ5X3QgKnBkZSA9ICZwZGVwWyh2YSA+PiBQRFJTSElGVCkg JiAoTlBERVBHIC0gMSldOworCisJCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpCisJCQlwdGVw ID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKyNlbmRpZiAvKiBWTV9OUkVTRVJWTEVWRUwg PiAwICovCisJCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwgdmEpOwor CX0gZWxzZQogCQlwdGVwID0gKHB0X2VudHJ5X3QgKikwOwogCiAJKnBkZXBwID0gcGRlcDsKZGlm ZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdGxiLmMgYi9zeXMvbWlwcy9taXBzL3RsYi5jCi0tLSBh L3N5cy9taXBzL21pcHMvdGxiLmMKKysrIGIvc3lzL21pcHMvbWlwcy90bGIuYwpAQCAtNDAsMTAg KzQwLDE0IEBACiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rs Yi5oPgogCisjaW5jbHVkZSAib3B0X3ZtLmgiCisKICNpZiBkZWZpbmVkKENQVV9DTk1JUFMpCiAj ZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTEyOAogI2VsaWYgZGVmaW5lZChDUFVfTkxNKQog I2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkoMjA0OCArIDEyOCkKKyNlbGlmIGRlZmluZWQo Q1BVX0NIRVJJKQorI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxNDQKICNlbHNlCiAjZGVm aW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTY0CiAjZW5kaWYKQEAgLTEwMiwyMCArMTA2LDMxIEBA CiB7CiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3QgczsKKwl1aW50MzJfdCBwYWdlbWFz azsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNpemU7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCUtB U1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlMCkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUxKSks CisJICAgICgiJXM6IHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24ndCBtYXRjaCIsIF9fZnVu Y19fKSk7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUwKTsKKwltYXNrID0gKHVuc2lnbmVkIGxvbmcpcGFn ZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93ZXIgMTIgYml0cyAqLworCXNpemUg PSBtYXNrICsgMTsKKworCXZhICY9IH5tYXNrOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFz aWQgPSBtaXBzX3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAogCW1pcHNfd3JfaW5k ZXgoaSk7Ci0JbWlwc193cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNr KTsKIAltaXBzX3dyX2VudHJ5aGkoVExCSElfRU5UUlkodmEsIDApKTsKIAltaXBzX3dyX2VudHJ5 bG8wKHB0ZTApOwogCW1pcHNfd3JfZW50cnlsbzEocHRlMSk7CiAJdGxiX3dyaXRlX2luZGV4ZWQo KTsKIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWlu dHJfcmVzdG9yZShzKTsKIH0KIApAQCAtMTM3LDcgKzE1Miw2IEBACiAJaSA9IG1pcHNfcmRfaW5k ZXgoKTsKIAlpZiAoaSA+PSAwKQogCQl0bGJfaW52YWxpZGF0ZV9vbmUoaSk7Ci0KIAltaXBzX3dy X2VudHJ5aGkoYXNpZCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQpAQCAtMjk4LDI5ICszMTIsNTMg QEAKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOwogCWludCBpOworCXVpbnQzMl90 IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKKwlwdF9lbnRyeV90IHB0ZTAs IHB0ZTE7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUpOworCW1hc2sgPSAodW5zaWduZWQgbG9uZylwYWdl bWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBiaXRzICovCisJc2l6ZSA9 IG1hc2sgKyAxOwogCi0JdmEgJj0gflBBR0VfTUFTSzsKKwl2YSAmPSB+bWFzazsKIAlwdGUgJj0g flRMQkxPX1NXQklUU19NQVNLOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFzaWQgPSBtaXBz X3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAotCW1pcHNfd3JfcGFnZW1hc2soMCk7 CisJbWlwc193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VO VFJZKHZhLCBwbWFwX2FzaWQocG1hcCkpKTsKIAl0bGJfcHJvYmUoKTsKIAlpID0gbWlwc19yZF9p bmRleCgpOwogCWlmIChpID49IDApIHsKIAkJdGxiX3JlYWQoKTsKKwkJcHRlMCA9IG1pcHNfcmRf ZW50cnlsbzAoKTsKKwkJcHRlMSA9IG1pcHNfcmRfZW50cnlsbzEoKTsKKwkJS0FTU0VSVCgoVExC TE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRlMCkgJiYKKwkJICAgIFRM QkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9fSURYKHB0ZTEpKSwKKwkJCSgiJXM6 IHB0ZSwgcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0IG1hdGNoIiwgX19mdW5jX18pKTsK IAotCQlpZiAoKHZhICYgUEFHRV9TSVpFKSA9PSAwKSB7CisJCWlmICgodmEgJiBzaXplKSA9PSAw KSB7CiAJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZSk7CisJCQlpZiAocGFnZW1hc2sgJiB+UEFHRV9N QVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJcHRlMSA9IChwdGUxICYgfihQVEVfVlIg fCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVfRCkpOworCQkJCW1pcHNfd3JfZW50cnls bzEocHRlMSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZSk7CisJ CQlpZiAocGFnZW1hc2sgJiB+UEFHRV9NQVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJ cHRlMCA9IChwdGUwICYgfihQVEVfVlIgfCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVf RCkpOworCQkJCW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CisJCQl9CiAJCX0KIAkJdGxiX3dyaXRl X2luZGV4ZWQoKTsKIAl9CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlwc193cl9wYWdl bWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21p cHMvc3d0Y2guUyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwotLS0gYS9zeXMvbWlwcy9taXBzL3N3 dGNoLlMKKysrIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCkBAIC0zMTUsMzYgKzMxNSw5MSBAQAog ICogTk9URTogVGhpcyBpcyBoYXJkIGNvZGVkIHRvIFVQQUdFUyA9PSAyLgogICogQWxzbywgdGhl cmUgc2hvdWxkIGJlIG5vIFRMQiBmYXVsdHMgYXQgdGhpcyBwb2ludC4KICAqLwotCU1UQzAJdjAs IE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExC X0hJCSMgVlBOID0gdmEKIAlIQVpBUkRfREVMQVkKIAl0bGJwCQkJCQkjIHByb2JlIFZQTgogCUhB WkFSRF9ERUxBWQotCW1mYzAJczAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJbWZjMAkJczAsIE1J UFNfQ09QXzBfVExCX0lOREVYCiAJSEFaQVJEX0RFTEFZCiAKLQlQVFJfTEkJdDEsIE1JUFNfS1NF RzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKLQlibHR6CXMwLCBlbnRyeTBzZXQKKwkj IE1JUFNfS1NFRzBfU1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8w X1RMQl9ISQorCVBUUl9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIg ZW50cnkKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWJsdHoJCXMwLCBpbnZhbF9ueHQxCisj ZWxzZQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKyNlbmRpZgogCW5vcAotCXNsbAlzMCwgUEFHRV9T SElGVCArIDEKLQlhZGR1CXQxLCBzMAotCU1UQzAJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJc2xs CQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQUREVQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19D T1BfMF9UTEJfSEkKIAlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlQVEVfTVRD MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9Q R19NQVNLCiAJSEFaQVJEX0RFTEFZCiAJdGxid2kKIAlIQVpBUkRfREVMQVkKLQlNVEMwCXYwLCBN SVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf UEFHRQorLyoKKyAqIFdpdGggYSBLU1RBQ0tfUEFHRV9TSVpFIG9mIDE2SyBhbmQgUEFHRV9TSVpF IG9mIDRLIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAqIGEgc2Vjb25kIFRMQiBlbnRyeSBpcyBjdXJy ZW50bHkgbWFwcGluZyB0aGUga2VybmVsIHRocmVhZCBzdGFjayBhcyBhCisgKiByZWd1bGFyIDRL IHNpemVkIHBhZ2UocykuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kLCBpZiBzbywgaW52YWxpZGF0 ZQorICogdGhhdCBUTEIgZW50cnkgYXMgd2VsbC4KKyAqLworI2lmIChQQUdFX1NJWkUgIT0gNDA5 NikgJiYgKEtTVEFDS19QQUdFX1NJWkUgIT0gMTYzODQpCisjZXJyb3IgUEFHRV9TSVpFIGlzIG5v dCA0SyBvciBLU1RBQ0tfUEFHRV9TSVpFIGlzIG5vdCAxNksuCisjZW5kaWYKK2ludmFsX254dDE6 CisJbW92ZQkJdjEsIHYwCisJUFRSX0FERFUJdjEsIFBBR0VfU0laRSAqIDIKKwlNVEMwCQl2MSwg TUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlIQVpBUkRfREVMQVkKKwl0bGJwCQkJCQkJ IyBwcm9iZSBWUE4KKwlIQVpBUkRfREVMQVkKKwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5E RVgKKwlIQVpBUkRfREVMQVkKKworCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQ QUdFX1NJWkUpIC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9T VEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKwlub3AK KwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1UQzAJCXQxLCBN SVBTX0NPUF8wX1RMQl9ISQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMAorCVBU RV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBf VExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKwl0bGJ3aQorCUhBWkFSRF9ERUxBWQorI2VuZGlm CS8qIEtTVEFDS19MQVJHRV9QQUdFICovCiAKIGVudHJ5MHNldDoKKwlNVEMwCQl2MCwgTUlQU19D T1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2FpbgorCUhBWkFSRF9ERUxBWQogLyogU01QISEgLSBX b3JrcyBvbmx5IGZvciAgdW5zaGFyZWQgVExCIGNhc2UgLSBpLmUuIG5vIHYtY3B1cyAqLwotCW10 YzAJemVybywgTUlQU19DT1BfMF9UTEJfSU5ERVgJCSMgVExCIGVudHJ5ICMwCisJbXRjMAkJemVy bywgTUlQU19DT1BfMF9UTEJfSU5ERVgJIyBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKIAlQ VEVfTVRDMAlhMSwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIHVwdGVbMF0KIAlIQVpBUkRfREVMQVkK IAlQVEVfTVRDMAlhMiwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIHVwdGVbMV0KKyNpZmRlZiBLU1RB Q0tfTEFSR0VfUEFHRQorCUhBWkFSRF9ERUxBWQorCWxpCQl0MSwgS1NUQUNLX1RMQk1BU0tfTUFT SworCU1UQzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCiAJSEFaQVJEX0RFTEFZCisjZWxz ZQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNl bmRpZgogCXRsYndpCQkJCQkjIHNldCBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKKworI2lm ZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT SworCUhBWkFSRF9ERUxBWQorI2VuZGlmCiAvKgogICogTm93IHJ1bm5pbmcgb24gbmV3IHUgc3Ry dWN0LgogICovCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMgYi9zeXMv bWlwcy9taXBzL3BtYXBfbWlwczY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVs bAorKysgYi9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKQEAgLTAsMCArMSw1NTI0IEBACisv KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo dCAoYykgMjAwMyBQZXRlciBXZW1tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp Z2h0IChjKSAyMDA1LTIwMTAgQWxhbiBMLiBDb3ggPGFsY0Bjcy5yaWNlLmVkdT4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RhY2V5IEQuIFNvbiA8c3Nv bkAuLi4+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJp dmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIHRoZSBTeXN0 ZW1zIFByb2dyYW1taW5nIEdyb3VwIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggQ29tcHV0ZXIK KyAqIFNjaWVuY2UgRGVwYXJ0bWVudCBhbmQgV2lsbGlhbSBKb2xpdHogb2YgVVVORVQgVGVjaG5v bG9naWVzIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5 IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0 aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZl cnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNl ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdh cmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJV VE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENP TlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJ TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZ LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbToJ QCgjKXBtYXAuYwk3LjcgKEJlcmtlbGV5KQk1LzEyLzkxCisgKglmcm9tOiBzcmMvc3lzL2kzODYv aTM4Ni9wbWFwLmMsdiAxLjI1MC4yLjggMjAwMC8xMS8yMSAwMDowOToxNCBwcworICoJSk5QUjog cG1hcC5jLHYgMS4xMS4yLjEgMjAwNy8wOC8xNiAxMTo1MTowNiBnaXJpc2gKKyAqLworCisvKgor ICoJTWFuYWdlcyBwaHlzaWNhbCBhZGRyZXNzIG1hcHMuCisgKgorICoJU2luY2UgdGhlIGluZm9y bWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUgaXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBs b2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUsCisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cg YXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55 IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25zCisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2Fs IG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJcmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVy IHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRlY3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1 YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVzIGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxl IG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVjZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9u cyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUgYWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRo aXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3JtYXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nl c3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGljaCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5 c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVjdC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlICJvcHRfZGRiLmgiCisj aW5jbHVkZSAib3B0X3BtYXAuaCIKKyNpbmNsdWRlICJvcHRfdm0uaCIKKworI2luY2x1ZGUgPHN5 cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rdHIuaD4K KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8 c3lzL21zZ2J1Zi5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9wY3B1 Lmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5j bHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5oPgorI2Vs c2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3lzY3Rs Lmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1ZGUgPGRk Yi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9w YXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+ CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5j bHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1 ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNsdWRlIDx2 bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUv Y2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1hY2hpbmUv dGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9TVElDKQor I2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9JTkxJTkUK KyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNkZWZpbmUg UFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZfU1RBVCh4 KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJKChwYSkg Pj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9pbmRleChw YSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBIWVNfVE9f UFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkgJSBOUFZf TElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2tw LCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlcCisJc3Ry dWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0gUEhZU19U T19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkgewkJCVwK KwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3ApOwkJXAor CQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJCVwKKwl9 CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZN X1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBW TV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3Ap CQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJCQkJCQlc CisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2NrcCk7CQkJ XAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm aW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNUX0xPQ0so Vk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIv a2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2KQkoKCh2 KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2luZGV4KHYp CSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wdGVfaW5k ZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5lCXBtYXBf cGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJKE5QREVQ RyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykKKworI2Rl ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K Kworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdfUkQsIDAs ICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9IDA7CitT WVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxBR19SRFRV TiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBsYXJnZSBw YWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VSVkVECTAK Kwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVTUzsKKwor c3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGljIHN0cnVj dCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBmb3IgdGhl IHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9IRUFEKHBj aCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZfY2h1bmtz KTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1Y3Qgcnds b2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBtZF9wYWdl ICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZfY2h1bmsg KnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2VudHJ5X3Qg cHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qg cndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5rKHBtYXBf dCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBf cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFnZV90IHBt YXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRp YyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90IG1wdGUs ICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9lbnRyaWVz KHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz dGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZV9s b2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3BkZShw bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsK K3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9jayAqKmxv Y2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0 YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGlj IHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt X3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBt YXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRlKTsKK3N0 YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFn ZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9wdF9wYWdl KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3Byb21vdGVf cGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShwbWFwX3Qg cG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0IHNwZ2xp c3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3Zl X3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpw bWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7CitzdGF0aWMg Ym9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMg dm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRfZW50 cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCk7 CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsKKworc3Rh dGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxv Y3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCByd2xvY2sg Kipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwg cGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBpbml0X3B0 ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCk7CisK K3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworc3Rh dGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOworc3RhdGlj IHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAqIFBhZ2Ug dGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNlZ21lbnQg ZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19pbmxp bmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9 CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdtZW50IHRh YmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgor cG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlw ZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAo JnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBkaXJlY3Rv cnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19p bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7 CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBf cGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRy eSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg X19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAqcGRlLCB2 bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRfZW50cnlf dCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQorCisvKiBS ZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRyZXNz LiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKHBk ZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRlKTsKKwl9 IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitzdGF0aWMg X19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAsIGludCBj b3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBtYXAtPnBt X3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9p ZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkKK3sKKwor CVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+cG1fc3Rh dHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVudCBjb3Vu dCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf Y291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gY291bnQ7 Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhlIHZpcnR1 YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZzZXRfdAor cG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBiYW5rX3Np emUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CisJ YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUgKHNpemUg PiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsg Ml07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJdOworCQkJ cGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlzX2F2YWls W2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZhaWxbMF0p CisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJYmFua19z aXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBwaHlzX2F2 YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJF Q1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsKK30KKwor LyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1l bW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVl biBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5lbF9wYWdl dGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJcHRfZW50 cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7CisJaW50 IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtl cm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVt b3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBwYWdlIHRh YmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5QREVQRyk7 CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJbmtwdCA9 IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CisK KwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2Jh bCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAy IHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh bCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBh bmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkg KiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRh ZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisK Kwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdt YXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChw ZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBH ICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRy ICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQTUFQX0xP Q0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9z ZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxRX0lOSVQo Jmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lk ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7 CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCit2b2lk CitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8KK2FnYWlu OgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkvKgor CQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJ cGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNfYXZhaWxb aSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkgPCAyKQor CQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsK KwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFpbFtpICsg MF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2YWlsW2kg KyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2 YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJCXBoeXNf YXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyoK KwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5n IG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9 IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOworCQlwaHlz bWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVtID0gYXRv cChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQ aHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp ICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNpemUgPSBw aHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhqeCAtICUj MDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf YXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAxLAorCQkJ ICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUpOworCQl9 CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1heG1lbSkp OworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5p bmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBtYXBfc3Rl YWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVmc2l6ZSk7 CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtT VEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJRlQpOwor CWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIpKTsKKwor CXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9lbmQgPSBW TV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFsIHNvbWUg dmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLworCXZpcnR1 YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsKKwlwY3B1 cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCArPSBQQUdF X1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50cnkgbWFw cGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBVcCB1bnRp bCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVwJyBmb3Ig dGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcwIHNvIHRo ZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNwdV90bGJf aW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoInBjcHUg aXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNlbmRpZgor CisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBWTU5V TV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOworCisJ LyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLworCXJ3X2lu aXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisgKiBJbml0 aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwordm9pZAor cG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5tZC5wdl9s aXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQorCisvKgor ICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5pdCwgdG8g aW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMg dG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkKK3sKKwlp bnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0aWFsaXpl IHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVua3NfbXV0 ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJICogSW5p dGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkg PCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ldLCAicHYg bGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhlYWQgdGFi bGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV07 IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAyKSArIDFd KSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBoZWFkIHRh YmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcgKiBzaXpl b2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJsZSA9IChz dHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAgTV9XQUlU T0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJTFFfSU5J VCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm1fcG1h cCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFwcGluZyBj b3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZU0NUTF9V TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQsCisgICAg JnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitzdGF0aWMg dV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3BkZSwgT0lE X0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5ncywgMCwg IjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9mYWlsdXJl czsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVzLCBDVExG TEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9u IGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsKK1NZU0NU TF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFHX1JELAor ICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIpOworCisv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBM b3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBfX2lubGlu ZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQgKCpmbiko dm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNwdXNldF90 IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXAp KSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3RvIG91dDsK Kwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQVV9GT1JF QUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUpKQorCQkJ cG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQoY3B1aWQp OworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgorCSAqIFRh a2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBhcmUgaWdu b3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNzIG9uIGlu YWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsKKwlzZWxm ID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQsICZhY3Rp dmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1IGlzIHRo ZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykpIHsKKwkJ aWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJQ1BVX1NF VChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3RpdmVfY3B1 cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7Cit9Cisj ZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2 ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlp bnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJnKTsKKwkJ cmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9JU1NFVChj cHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdlbiA9IDA7 CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMgdm9pZAor cG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9vbl9hY3Rp dmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0ZV9hbGxf dXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBt YXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfaW52 YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0 ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+cG1hcCwg cC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg YXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2FsbF9vbl9h Y3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcpOworfQor CitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1f b2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFw X2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHAtPnBt YXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9y YW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJ c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFw OworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZl X2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9CisKK3N0 cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zmc2V0X3Qg dmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFn ZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAqcCA9 IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisKK3N0YXRp YyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRf ZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFy Zy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBtYXBfY2Fs bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFyZyk7Cit9 CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVfaXNfMW1f c3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNpZmljIDJt YiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2YSAmIH5Q RFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2UgaWYgKCFw dGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBmbHVzaCBl dmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRoZXJlIGFy ZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52YWxpZGF0 ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246IGZsdXNo IGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRpbmcgYW55 IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsKCk7 CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJ dm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOwor fTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0KQorewor CXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3VwZGF0ZV9w ZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30KKworc3Rh dGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3BkZSk7Cit9 CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1 YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxpdHkgb2Yg dGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNhbWUgdmly dHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0aWMgdm9p ZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlf dCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2Fy ZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBkZSA9IHBk ZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3JlKHBtYXAs IHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRh dGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91dGluZToJ cG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdl IGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2FkZHJl c3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZt X29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFw X3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwYSA9 IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7CisJCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0gVExCTE9f UFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1h cCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5k X2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUg cGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVz cyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24u CisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9l bnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3BhZ2VfdCBt OworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBNQVBfTE9D SyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZXAg IT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk ZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAocHJvdCAm IFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9fUEEoKnBk ZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVs b2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0gUEhZU19U T19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9IGVsc2Ug eworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRlcCAhPSBO VUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlKSAmJgor CQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3QgJiBWTV9Q Uk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsK KwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJICAgICZw YSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0ZV9wYSk7 CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFfVU5MT0NL X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qLQor ICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUg cGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJlc3MuCisg Ki8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1h cHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICov CisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQor CQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tT RUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9U T19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNf S1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkg KiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQURE UkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCWlm IChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBfcGRlKCZj dXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5VTEwgfHwg KnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBh Z2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJldHVybiAo VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsKKwkJCX0K KwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXApIHsKKwkJ CQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQQUdFX01B U0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNob3VsZCBi ZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBlZCA9ICh2 YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1hcHBlZCA9 IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtTRUdfRU5E KTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkgeworCQlw ZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRoZSBrZXJu ZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9wbWFwLT5w bV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdl ICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09 IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18x bV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJ CXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0sp KTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0 ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEg JiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBhbmljKCIl cyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAqKXZhKTsK K30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQgYSB3aXJl ZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0 X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj ZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7 CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVfUkVGIHwg UFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0ZV9pc192 YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90IHZhLCB2 bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwKKwkJKCJw bWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9sb25nKXBh KSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQorCisvKi0K KyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLworIC8qIFBN QVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9l bnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9tIHRoZSBw YWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4 KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKKwlw dGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVsX3BtYXAs IHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVz c2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJVGhlIHZh bHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IK KyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEgZGlyZWN0 LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0aGUgYXBw cm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcqdmlydCcg dW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBwYWdlcyBz dGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUgZmlyc3Qg dXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAqCVVzZSBY S1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29mZnNldF90 ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3QpCit7CisK KwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisgKiBBZGQg YSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBpcyBvbmx5 IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90IG5lZWQg dG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRlZC4KKyAq IE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVyLiAgVGhl IHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9vZmZzZXRf dCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zmc2V0X3Qg b3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwbWFwX2Zs dXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BIWVMobVtp XSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Vf aW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMgcm91dGlu ZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMgbWVhbnQg b25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1vdmUodm1f b2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0 X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNhY2hlX3di aW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0gdmE7CisJ ZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3RvcmUocHRl LCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJ cG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30KKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFn ZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lk CitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2bV9wYWdl X3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7CisJCVNM SVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUgdGhlIHBh Z2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJfQorfQor CisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUgcGFnZSB0 byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBzcGVjaWZp ZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBwaHlzaWNh bCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisgKi8KK3N0 YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9wYWdlX3Qg bSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJPKQorewor CisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UKKwkJbS0+ ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxpbmtzLnMu c3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBp bnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJs ZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNwb25zaWJs ZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4g IFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1YWwgYWRk cmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRfcHRfcGFn ZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBt YXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1fcm9vdCwg bXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1hcHBpbmcg dGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxMIGlmIHRo ZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lm aWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdAorcG1h cF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwlQTUFQ X0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xvb2t1cCgm cG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICogUmVtb3Zl cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVjaWZpZWQg cGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3MgY29sbGVj dGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3BhZ2UocG1h cF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBN QV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5waW5kZXgp OworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUgY291bnQs IHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBhZ2UgdGFi bGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICogZHJvcHMg dG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0dXJucyBU UlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFMU0Ugb3Ro ZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vud2lyZV9w dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0IHNwZ2xp c3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0g MCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfcG1h cF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHN0 cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdl X3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8qCisJICog dW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBOVVBERSkg eworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lk ZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1l bnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChwZF9lbnRy eV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1fUEFHRShN SVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIHBk cGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJ KnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0KKworCS8q CisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBpdC4KKwkg KiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9yZSB1bm1h cHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1lZCBiZWZv cmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1YnRyYWN0 X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdlIG9uIGEg bGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNob290ZG93 biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZyZWUsIFRS VUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlz IHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQg bWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNl X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUsCisgICAg c3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAodmEgPj0g Vk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRlICE9IDAs ICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9fVk1fUEFH RShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndpcmVfcHRw KHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBtYXBfdCBw bWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+cG1fc2Vn dGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsKKwlmb3Ig KGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lkID0gUE1B UF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQorCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmspOworCWJ6 ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwordm9pZAor cG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCkKK3sKKworCXZtX3BhZ2VvdXRfZ3Jvd19jYWNo ZSgzLCAwLCBNSVBTX1hLUEhZU19MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90 CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sK Kwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNU X0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJPKTsKKwlp ZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAmIFBHX1pF Uk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5kZXg7CisJ cmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVkIGFuZCB6 ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ugc3RydWN0 dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3Qg cHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0 aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9j X2RpcmVjdF9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIFZNX0FMTE9D X05PUk1BTCkpID09IE5VTEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hl KCk7CisJfQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhw dGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pF Uk8oJnBtYXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJ CXBtYXAtPnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1f YXNpZFtpXS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwli emVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4g KDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBw YWdlIHRhYmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19w bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQ TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJy aWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkog fCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2Nr cCAhPSBOVUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlU OworCQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CX0KKworCQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGlu ZywgdGhlIHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJ ICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAw KQorCQlwbWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFn ZSBpbnRvIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFk eSB0aGVyZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3Rh YltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJ cGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChT RUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQ RyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2Vn aW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBh IG5ldyBwZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsg c2VnaW5kZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQs IHJlbGVhc2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3Vi dHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVy byhtKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJl ZmVyZW5jZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19E SVJFQ1RfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBO ZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtw ZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3Vu dF9pbmMocG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90Citw bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9w YWdlX3QgbTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICov CisJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0 IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEp OworCisJLyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8g YQorCSAqIG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNf MW1fc3VwZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkp KSB7CisJCSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkp IHsKKwkJCSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBt YXkgaGF2ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5n IFBEIHBhZ2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICog SWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBo b2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAm JiAqcGQgIT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BI WVMoKHB0X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkv KgorCQkgKiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBi ZWVuCisJCSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAs IHB0ZXBpbmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJ CQlnb3RvIHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVh bGxvY2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBi eSB0aGUgZ2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxp emVkIGJ5IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBj YWxsZWQgaWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAor cG1hcF9yZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3Bh Z2VfdCBwdGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0g MCwKKwkgICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAor CSAgICBwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlk YXRlIGFueSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUg YXNpZC4KKwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1f b2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNf RElSRUNUX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWlj X3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3pl cm8ocHRkcGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0 YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29m ZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRw ZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFw LT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsK KwlpZiAoYWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5l bF9tYXAtPm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBk cGUgPSBwbWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJ CW5rcGcgPSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJ CQkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOwor CQkJaWYgKG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtl cm5lbCIsIF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVCgKKwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRy eSBhZ2FpbiAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3Zt X2VuZCk7CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3Zt X2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtl cm5lbF9tYXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+ bWF4X29mZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK KwkJICogVGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlu a3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkg ICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlp ZiAoIW5rcGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBr ZXJuZWwiKTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVChWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAg c3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5z bGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVz IGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkg KiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp bGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICov CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1f ZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJu ZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4 X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGlu ZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworCitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RB U1NFUlQoX05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9f aW5saW5lIHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQorewor CisJcmV0dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJf dClQQUdFX01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYp LT5wY19wbWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVm aW5lCVBDX0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAw MDAwZmZmZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01d ID0geyBQQ19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUwor c3RhdGljIGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVl cywgcGNfY2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBj X2NodW5rX2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJl bnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lE X0FVVE8sIHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwK KyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lT Q1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAm cGNfY2h1bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5r cyBmcmVlcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZh aWwsIENUTEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGlt ZXMgdHJpZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9u ZyBwdl9lbnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRp YyBpbnQgcHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywg cHZfZW50cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3Vy cmVudCBudW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBP SURfQVVUTywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAw LAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05H KF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRy eV9jb3VudCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RM X0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZf ZW50cnlfc3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMi KTsKKyNlbmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRp dGlvbi4gIFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMg c28gd2UgY2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJl dHVybnMgTlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmll ZCBwbWFwLgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNl IHN1YnNlcXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMg dW50aWwgcmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNo b3J0YWdlIG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFp bV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sK KwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlf dCAqcGRlOworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2Vu dHJ5X3QgcHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0 IHNwZ2xpc3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQs IGlkeDsKKworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBf TE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5V TEwsICgicmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsK KwltX3BjID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFp bCk7CisJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJ UlNUKCZwdl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlM UV9SRU1PVkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5r c19tdXRleCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBO VUxMKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBs b2NrZWRfcG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMt PnBjX3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9j a3ApOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRf cG1hcCAmJiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJ TFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZf Y2h1bmtzX211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERl c3Ryb3kgZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJ CSAqLworCQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVs ZCsrKSB7CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb ZmllbGRdOworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJ CQliaXQgPSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2Up ICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0g cHYtPnB2X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBk ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsK KwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlp ZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNf a2VybmVsX3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpw dGUgPSAwOworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BU RV9UT19QQShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJ CQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19G SUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAg cGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBH QV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFV TCA8PCBiaXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJ CWZyZWVkKys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211 dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9y IGEgNCBLQiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7 CisJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJ UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NU QVQoYXRvbWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlM UV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19t YXBbMF0gPT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAg cGMtPnBjX21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3Rf aW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZw Y19jaHVua19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBp dC4gKi8KKwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJ CSAgICAodm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRk cik7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxR X0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVu a3NfbXV0ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3Vm ZmljaWVudC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJ VEFJTFFfQ09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlk YXRlX2FsbChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9D SyhwbWFwKTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7 CisJCW1fcGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVl LCBwbGlua3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICov CisJCW1fcGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2ly ZV9jb3VudCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4g KG1fcGMpOworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBs aXN0CisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRy eV90IHB2KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsK KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B U1NFUlQocG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRy eV9mcmVlcywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAx KSk7CisJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsK KwlwYyA9IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsK KwlmaWVsZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChz aXplb2YodV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7 CisJaWYgKHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19G UkVFMSB8fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0 aGUgdGltZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYg KF9fcHJlZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7 CisJCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJ cmV0dXJuOworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwlmcmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmso c3RydWN0IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9j aHVua3NfbXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwlt dHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu a19mcmVlcywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwlt ID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7 CisJZHVtcF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9J TkFDVElWRSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQ ViBlbnRyeSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgor ICogbmVlZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxp c3QgbG9jayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZy b20gYW4gYXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgor ICoKKyAqIFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0 aWMgcHZfZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoq bG9ja3ApCit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVj dCBwdl9jaHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxf bG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQ Vl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlw YyA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgewor CQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5w Y19tYXBbZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBm aWVsZCAqIHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAm cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJp dCk7CisJCQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8K KwkJCWlmIChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkg ICAgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNo dW5rLCBwYywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9s b25nKCZwdl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50 KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8g ZnJlZSBpdGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxM T0NfV0lSRUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJ CVBWX1NUQVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJ bSA9IHJlY2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJ Z290byByZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQs IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlk dW1wX2FkZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQ U19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1h cDsKKwlwYy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0 IDAgKi8KKwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZS RUUyOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZw dl9jaHVua3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJ cHYgPSAmcGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2 Y2h1bmssIHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlf Y291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05Q Q1BWIC0gMSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVy IG9mIG9uZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQor eworCWludCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5n IHRoZSBvbmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVu dCB0eXBpY2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8K Kwljb3VudCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291 bnQrKzsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1i ZXIgb2Ygc3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAq IGV4Y2VlZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYg bGlzdCBsb2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZf ZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQor eworCXN0cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZh aWwsIGZyZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJU KGxvY2twICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoK KwkgKiBOZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0 ZSBsaXN0IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBi ZWVuIGFsbG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQg cmVjeWNsZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1 bmtzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRB SUxRX0lOSVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNI KHBjLCAmcG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNf bWFwX2VsZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0o cGMtPnBjX21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21h cFsyXSk7CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJ aWYgKGF2YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVk ZWQ7IGF2YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9B TExPQ19OT1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJ CWlmIChtID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK KwkJCWlmIChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21p Y19hZGRfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50 KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOwor CQlwYyA9IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZS RUUwOworCQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19G UkVFMjsKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RB VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRB SUxRX0VNUFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJ CVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxv Y2soJnB2X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhl biByZW1vdmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwK KyAqIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBl bnRyeSBpZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2Fu IGJlIHBlcmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2Ug bWFwcGluZ3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0 IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5 X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlM UV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBW X1BNQVAocHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2 X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQor CX0KKwlyZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIg cGFnZSBtYXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2 IGVudHJ5IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYK KyAqIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0 aWMgdm9pZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1k X3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1f b2Zmc2V0X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3 X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIl czogcGEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElT VF9MT0NLX1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFn ZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2 IGxpc3QuICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICog bXVzdCBub3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50 aWF0ZWQuCisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2 YSk7CisJcHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAh PSBOVUxMLCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZN X1BBR0UocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4 dCk7CisJbS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRF UEcgLSAxIHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5 X2FsbG9jcywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpF OworCWZvciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJ CUtBU1NFUlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkg ICAgcGMtPnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsK KwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChw Yy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0g MTsKKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBj LT5wY19wdmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJ CQlwdi0+cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBP X1VOTUFOQUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg X19mdW5jX18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQor CQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmss IHBjLCBwY19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+ cGNfbWFwWzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgm cG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1h cC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9u ZygmcHZfZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBw cm9tb3Rpb24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2Ug bWFwcGluZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdl IG1hcHBpbmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBp bmcuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap Cit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90 IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBh IGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9D S19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdl J3MgcHYgZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0 LiAgQXNpZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5 KCksCisJICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2Vu dHJ5KCkgY2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9j aHVuaygpIHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJv bW90ZWQuCisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBh Z2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NF UlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBw YV90b19wdmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9u ZXh0KTsKKwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx IHB2IGVudHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8g eworCQltKys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBt YXAsIHZhKTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmlu ZCBhbmQgdGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFu ZCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBv biBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8K K3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBw bWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2 aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZo X2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BB R0VfVE9fUEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAg ICAodV9sb25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBD b25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBp ZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9y dGluZyB0byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5z ZXJ0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisg ICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3Nl cnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxM KSB7CisJCXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo bG9ja3AsIG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l eHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0 dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50 cnkgZm9yIGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4g YmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0 aWMgYm9vbGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1 Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9i YWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwkvKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVj bGFtYXRpb24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVM TCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv Y2twLCBwYSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZw dmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEg cGFnZSB0YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFn ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRl LCBwdF9lbnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9 IGZpcnN0cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5l d3B0ZTsKKwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9 CisKKy8qCisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rp b24gZmFpbHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLwor c3RhdGljIGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90 ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVh bl90IHJ2OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBt YXAsIHBkZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxv Y2spOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBk ZTsKKwkgcHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90 IG1wdGVwYTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkg UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9s ZHB0ZSA9IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdl KCZvbGRwdGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBp cyBub3Qgc3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lz X3JlZigmb2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAh PQorCSAgICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVs c2UgeworCQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6 IHBhZ2UgdGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAg IF9fZnVuY19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGlu ZyBhbmQgcmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFj Y2Vzc2VkIG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFn ZSBmYWlscy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBk aXJlY3QgbWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkg ICogdGhlIHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3Nz aWJsZQorCQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRo ZSBwcmlvcml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxs b2NhdGVkIGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mg c3BhY2UsIHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBv ZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhl cmUuCisJCSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3Bh Z2VfYWxsb2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlO X0tFUk5FTF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9D X0lOVEVSUlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwg Vk1fQUxMT0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkg cG1hcF9yZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkg ICAgIGxvY2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZt X29mZnNldF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5Q RFJNQVNLKSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkg Q1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJ ICAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkg aWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5j KHBtYXAsIDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3 cGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0 ZSA9IG5ld3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczog b2xkcHRlIGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rl c3QoJm9sZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAo IiVzOiBvbGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9s ZHB0ZSAmIH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUg cGFnZSBpcyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3Vu dCA9PSAxKSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0 cChmaXJzdHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmly c3RwdGUpID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUg YW5kIG5ld3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1 bmNfXykpOworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0 ZXMsIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgq Zmlyc3RwdGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0sp KQorCQkgcG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRo ZSBzcGFyZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhl CisJICAqIG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhl cndpc2UsIHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBi ZSBpbmNvbnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVu aygpIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3Jvbmcg UFYgbGlzdCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBl Y3RlZAorCSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWlu ZyBkZW1vdGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkK KwkJIHJlc2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoK KwkgICogRGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQg UERFIGhhcworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xl YXIsIGl0IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdl ciBvZiBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0 dGluZyBvZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3Zl IGFuZCB0aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEs IHBkZSwgKHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3Rh bGUgcmVjdXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlm ICh2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFw LCAodm1fb2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUg dGhlIFBWIGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VE KSkgeworCQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xk cGRlKSwgbG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25z LCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQor CisvKgorICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFn ZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFw X3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90 IGRvaW5nIGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2Vy bmVsX3BkZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitz dGF0aWMgaW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwg dm1fb2Zmc2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2Nr ICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsK Kwl2bV9vZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBX cml0ZSBiYWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBw ZWQuCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNL KSwgTkJQRFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VS VCgoc3ZhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBu b3QgMm1wYWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9s ZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRl X2xvYWRfc3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlw bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChw ZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCBzdmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdF X1NJWkUpOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hB TkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7 CisJICAgIHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBt YXBfcHZoX2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkg ICAgZm9yICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xk cGRlKSk7CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBk ZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJ CSAgICB2bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9S RUYpKQorCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZf bGlzdCkpCisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkg ICAgfQorCX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJu ZWxfcGRlKHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBf cHRfcGFnZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92 ZV9wdF9wYWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwg MSk7CisJCQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1h cF9yZW1vdmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2ly ZV9jb3VudCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBG QUxTRSk7CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsK KwkJfQorCX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAo cG1hcCwgc3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUg dGhpbmdzIHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1h cF9yZW1vdmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNl dF90IHZhLAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3Ry dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlf dCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X TkVEKTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFn ZSBiZWluZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2 YSwgUEFHRV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt YXApKQorCQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVz dCgmb2xkcHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisK KwlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0 ZSwgUFRFX01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BB KG9sZHB0ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJU KCFwdGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBu b3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQg Kil2YSwgKHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJ aWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVG RVJFTkNFRCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJ CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+ bWQucHZfbGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsK KwkJCXB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VN UFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRF QUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUs IGZyZWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNz IGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0 IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlz dHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7 CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShw bWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8g cHRlIGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192 YWxpZChwdGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92 ZV9wdGUocG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5V TEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEp OworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0 aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFu ZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3Zv aWQKK3BtYXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90 IGV2YSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0 OworCXBkX2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOwor CXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3Jt IGFuIHVuc3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLwor CWlmIChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlh bnl2YWxpZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcg b2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBl YXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9T SVpFKSA9PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVf aXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAm ZnJlZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBz dmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50 X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh KTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29u dGludWU7CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFi bGUuCisJCSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAo dmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3Rv X3BkZShwZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91 dCBpbnZhbGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNv bnRpbnVlOworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBk ZV9pc18xbV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92 aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBw aW5nIGFuZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9u ZXh0ICYmIGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZv ciBhIFBURV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9w ZGUoKS4KKwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJ CWFueXZhbGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZm cmVlLCAmbG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBz dXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBl bHNlIHsKKwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0 IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBi eSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAq IHJhbmdlIGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZh X25leHQgPSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3Rv X3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdF X1NJWkUpIHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFf bmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJ CXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90 ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9u ZXh0KQorCQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2 YSwgcHRwYWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0la RTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK KwkJcndfd3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VO TE9DSyhwbWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglS b3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBw aHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNp ZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAq CU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkK KyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1h cF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3Qg bSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBt YXA7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZz ZXRfdCB2YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMg bm90IG1hbmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdv dG8gc21hbGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7 CisJd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92 YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUo cG1hcCwgcGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdz OgorCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsK KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICog SWYgaXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUg cGFnZSBiZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0 KSA9PSBOVUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQ QUdFX1NJWkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUg PSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpw ZGUgIT0gMCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1 cGVycGFnZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJw YWdlIGluIHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNf a2VybmVsX3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwg UFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBV cGRhdGUgdGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlp ZiAocHRlX2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJF TkNFRCk7CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf dGVzdCgmdHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0 YWJsZTogdmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+ cHZfdmEsICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlw bWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZf bGlzdCwgcHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShw bWFwLCBwdik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xl YXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlw bWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8K K3N0YXRpYyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5 X3QgKnBkZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90 IG5ld3BkZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJ Ym9vbGVhbl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVE KTsKKwlLQVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90 IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRy eToKKwlvbGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVf TUFOQUdFRCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQ SFlTX1RPX1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7 IHZhICs9IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAm JgorCQkJICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHko bSk7CisJfQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgm bmV3cGRlLCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAo bmV3cGRlICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlf dCAqKXBkZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkK KwkJCWdvdG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFw X2ludmFsaWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJV RTsKKwl9CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNp Y2FsIHByb3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMg cmVxdWVzdGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRf dCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0 ZTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90 ICYgVk1fUFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwg c3ZhLCBldmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJ cmV0dXJuOworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdl ZCA9IEZBTFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9 IHZhX25leHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYg KHZhX25leHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJ CXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3Zh KQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2 YSk7CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlm ICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3Vw ZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoK KwkJCSAqIEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJ CQkgKiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYg KHN2YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJ CSAqIFRoZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0 ZWQgYnkgcG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3Rf cGRlKHBtYXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJ Y29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJ CXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xv YmFsX2xvY2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRh dGVfYWxsKAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJ fQorCQkJCX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJ CQkJLyoKKwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJ CSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQg b3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5 IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICog cmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEp CisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFw X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEg Kz0gUEFHRV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJ CQl2bV9wYWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxp ZCgmcGJpdHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2 YV9uZXh0KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJ CQkJdmEgPSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQo JnBiaXRzLCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJ cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9N QU5BR0VEKSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQ SFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlp ZiAodmEgPT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJ CQkJICogVW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGlu ZyAic3ZhIiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0 IGJlIGludmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJ CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0 OworCQkJCX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4 dCkKKwkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFu eWNoYW5nZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xv Y2tlZCkgeworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9D SyhwbWFwKTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3Vv dXMgNEtCIHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRh YmxlIHBhZ2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8K KyAqIG9jY3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBt YXBwaW5ncyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkg YW5kICgyKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hh cmFjdGVyaXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBk b25lIGluIHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFy ZHdhcmUgYXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisg KiBUTEIgZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9u IHRoYXQgdGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRp YyB2b2lkCitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZt X29mZnNldF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90 IG5ld3BkZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9v ZmZzZXRfdCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBz cGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwg dW51c2VkLCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICog d2l0aGluIGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVu Y18ybXBhZ2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICov CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3Bk ZSkgfHwgIXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor CX0KKwlpZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwg UFRFX1JPKSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9S TyBjYW4gYmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJ aWYgKCFhdG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3Bk ZSB8CisJCSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87 CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNw ZWNpZmllZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0 S0IgcGh5c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3Rl cmlzdGljcyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5l d3BkZSkgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBH IC0gMTsgcHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7 CisJCWlmIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9s b25nKCZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFp bHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXAp OworCQkJcmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFw dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsIG9sZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0 ZSB8PSBQVEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRM QkxPX1BURV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6 IHByb3RlY3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0 ZXZhLCBwbWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5l d3BkZSAmIFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVf cF9mYWlsdXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj bHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsK KwkJfQorCQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRh YmxlIHBhZ2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcg dGhlIHN1cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVz dHJveWVkIGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BB R0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2Vf YXJyYXkgJiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0s CisJICAgICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykp OworCUtBU1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgi JXM6IHBhZ2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYg KHBtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZw bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0 dXJuOworCX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAo cHRlX3Rlc3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBt YXAsIHZhLCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAg dGhlIHN1cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3 cGRlIHwgUFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9u cywgMSk7CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBn aXZlbiBwaHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl c3MgKHYpIGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9u IHJlcXVlc3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQg ZG93biwgbWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWlt ZWQuCisgKgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBs YXp5LWV2YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0 aW5lIG11c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFw IE5PVy4KKyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNp bmQgX191bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZt X3BhZGRyX3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9l bnRyeV90ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAg ICBwdl9lbnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJv b2xlYW5fdCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAg IEtBU1NFUlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2Jp ZyIpKTsKKyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8 fCB2YSA8IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEs CisgICAgICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNs ZWFuIHN1Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9 PSAwICYmICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FT U0VSVF9MT0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAg ICBsb2NrID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAg ICAgIFBNQVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2Fz ZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAg ICAqIGNyZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBp ZiB0aGUgcHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAg ICAgICAgICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAg ICAgIG5vc2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAg ICAgICAgICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDog JmxvY2spOworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAg IHJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQ TUFQX1VOTE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9S RVNPVVJDRV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJ cGFuaWMoIiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7 CisJfQorCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAg ICAgICAgKiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEg bmV3IFBUIHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAg ICAgICAgICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBw ZGlyPSVwLCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2Vn dGFiLCAodm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19Q SFlTKG0pOworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9w YSA9IFRMQkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19Q QV9UT19QRk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8q CisgICAgICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2lt dWxhdGVkIGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8g YXZvaWQgYSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUp OworICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFw KSkKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNo ZWFibGVfbWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09 IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg ICAgICAgICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAg ICAgIGlmICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAg ICAgICAgbmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf Tk9TVE9SRVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNl bmRpZgorCisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVh YmxlIG1hcHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2Fu dCB0byB0YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3Ig dGhlc2UgbWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh PSAwKSB7CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQ VEVfRDsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5n ZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAg ICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0 ZSBzdGF0cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcg UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAg ICAgICAgICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2Vy IHBhZ2UgaXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBh bHNvLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm bmV3cHRlLCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAg ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAg ICAgIGVsc2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdw dGUsCisgICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IHBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJU KCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAg ICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAor ICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmln cHRlKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0 aGUgZXh0cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRl LT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndp cmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjog bWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYg KHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0 ZSB8PSBQVEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJ CQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlk YXRlOworCX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5n IGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisg ICAgICAgICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291 bnQtLTsKKworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFH RUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEp OworICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdF KCZsb2NrLCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92 ZSgmb20tPm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IGlmIChtcHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVf Y291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3Vu dCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5n IHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIgdmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg fSBlbHNlCisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7 CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBv ZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFn cyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF X01BTkFHRUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2 ID0gZ2V0X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEg PSB2YTsKKyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ss IHBhKTsKKyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwg cHYsIHB2X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAg ICAgICAgIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAg ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVs c2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAg ICAgLyoKKyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAg ICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBt X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAg ICAgICAgcHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2 YSwgKHZvaWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1h cHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAg ICAgICogdXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUg JiB+IChQVEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRl IHw9IFBURV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkg IT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAg ICAgICAgICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgYm9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRf c3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19y ZWYoJm9yaWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0 ZSwgUFRFX0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01B TkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2Vf ZGlydHkob20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBW TV9QUk9UX1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGludmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYK KwkJCSAgICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlM UV9FTVBUWSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAg fSBlbHNlCisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAg LyoKKyAgICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2Vy dmF0aW9uIGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJv bW90aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+ d2lyZV9jb3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9s ZXZlbF9pZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRl KHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkg JiBEIGNhY2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAg ICAgICAgICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3Ro ZXJ3aXNlLCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgor ICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9 PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBW TV9QUk9UX0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQor ICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2 aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1 cm4gKEtFUk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFK T1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAy LiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFn ZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9p ZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2Vf dCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CSh2b2lkKXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAm bG9jayk7CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMg dm1fcGFnZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZt X3BhZGRyX3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWku Y2xlYW5fc3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQ T19VTk1BTkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhl IGNsZWFuIHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgor CSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3 ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwor CQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBp bmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXgg PT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJ LyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFn ZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5k IGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlm IChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0 ZSA9IFBIWVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7 CisJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBh c3MgTlVMTCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNh dXNlIHdlIGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBf YWxsb2NwdGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQor CQkJCQlyZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7 CisJfQorCisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRl KSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQlt cHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIg b24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYg KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNl cnRfcHZfZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7 CisJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEs IG1wdGUsICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJ CQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOwor CQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMK KwkgKi8KKwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFH RV9UT19QSFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHBy b3RlY3Rpb24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwg UFRFX1ZBTElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3 cHRlIHw9IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlm IChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9 IGVsc2UKKwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYg KGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9z ZXQoJm5ld3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRl X3N0b3JlKHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0 aGlzIG9ubHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQg cHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBv Y2N1ci4KKwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAp IHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQ QUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJ CX0KKwl9CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBN YWtlIGEgdGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMg b25seSBpbnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNl IFhLUEhZUyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2 bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVS Uk9SISEhIE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1h cHBpbmcgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1J UFNfUEhZU19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5 X2ZyZWUodm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAq LworCXJldHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5k ZXhfdCBwZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90 IG1wdGUgPSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToK KwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAo KnBkcGUgIT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4g Ki8KKwkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkp OworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBw ZCBwYWdlLiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJ CQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5k ZXggPj4gTlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShw bWFwLCBOVVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxv Y2twICE9IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOwor fQorCisvKgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMg VFJVRSBpZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEp IGEgcGFnZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tp bmcsICgyKSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFs IGFkZHJlc3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhv dXQgcmVjbGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90Citw bWFwX2VudGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2 bV9wcm90X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlf dCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBz cGdsaXN0IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFs X2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK KwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwg cG1hcCBmb3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNs eCBpbiBwbWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJ CXJldHVybiAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZh LCBOVUxMKSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZh ICUjbHggaW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4g KEZBTFNFKTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChw ZF9lbnRyeV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOwor CXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJ S0FTU0VSVChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNv dW50IGlzIHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNU UjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5j X18sCisJCSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BB R0VfVE9fUEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZO KHBhKSB8IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkp IHsKKwkJaWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJ CW5ld3BkZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NB Q0hFOworCX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKwor CQkvKgorCQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBi ZSBjcmVhdGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZN X1BBR0VfVE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7 CisJCQlpZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlw bWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4 IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZB TFNFKTsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBw bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoK KwkgICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0 b3JlKHBkZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1 dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25n cyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJs ZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkg JiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90 ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNh Y2hlX3N5bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2 YSwgTkJQRFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmco JnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0 dXJuIChUUlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdl cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3 aXRoIHRoZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0 aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMK KyAqIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0 IGJ5IHRoZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFy dCB3aXRoaW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBp cyB0aGUgcGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQg Y2FuIGJlIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisg KiB2aXJ0dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0 YXJ0IGFuZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVu dCBwYWdlIGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0 YXJ0IGFyZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0 YXJ0LCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNl dF90IHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOwor CisJVk1fT0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0g YXRvcChlbmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgp IDwgcHNpemUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJN QVNLKSA9PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYm IHBnX3NwX2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90 LCAmbG9jaykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJ bXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAg IG1wdGUsICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9j ayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0 X3B0IHByZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3Bl Y2lmaWVkIHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0 cyBvbiBwcm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoK KyAqIFRoaXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQor ICogcHJvY2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICog YXJlIHRha2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2lu aXRfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwK KyAgICB2bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3Qg KnBkZTsKKwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9t ZW1hdHRyX3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOwor CUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBP QkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0Iikp OworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2Vy bmVsIHBtYXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBE UiAtIDEpKSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19z cF9lbmFibGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3Qs IHBpbmRleCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdl X2xvb2t1cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9C SVRTX0FMTCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJ CW1lbWF0dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBw aW5nIGlmIHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8g YSAyTUIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHAp OworCQlpZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBT a2lwIHRoZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkg KiB0aGUgcGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJp bmcKKwkJICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBs aXN0cSk7CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7 CisJCSAgICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFH RV9CSVRTX0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkp OworCQkJaWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0g cC0+bWQucHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0 cSk7CisJCX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAy TSBhbGlnbmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJ CVBNQVBfTE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsg cGEgKz0gTkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwp OworCQkJaWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9m IG1hcHBpbmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBh Z2UgZGlyZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxv Y2tpbmcsCisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhh bgorCQkJCSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29u dGludWU7CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1Qo CisJCQkgICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVf aW5kZXgoYWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7 CisJCQkJcHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAg UFRFX1BTXzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2Nh Y2hlYWJsZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJ CSAgICBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FD SEVEOworCQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNl CisJCQkJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5l d3B0ZSk7CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpF KTsKKwkJCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxz ZSB7CisJCQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLwor CQkJCXBkcGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAw LAorCQkJCSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJ CQkJICAgICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRk ciArPSBOQlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglD bGVhciB0aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lm aWVkIHJhbmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxp ZCBtYXBwaW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJp YnV0ZSBzZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUg dGhlIHdpcmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhl IHdpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2Fy ZSBmZWF0dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIg ZW50cmllcy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRf ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3Rz X2xvY2tlZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9D SyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBw bWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4 dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ CXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5C UERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7 CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVM TCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlp ZiAoIXBkZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUj anggaXMgbWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgor CQkJICogQXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkg KiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2 YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xl YXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndp cmVkX2NvdW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNl IHsKKwkJCQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBU UlVFOworCQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJ IFBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor CQkJCQkJIC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJ CQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5p YygicG1hcF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9u ZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19w dGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9T SVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYg KCFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4 IGlzIG1pc3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJ ICogUFRFX1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAor CQkJICogbG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3Nv cgorCQkJICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50 bHkuCisJCQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5w bV9zdGF0cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsK KwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7 Cit9CisKKy8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisg Kglmcm9tIHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRo ZSBkZXN0aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkg YW5kIG5lZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3Qg ZHN0X3BtYXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1f c2l6ZV90IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBU aGlzIGRvZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9y ZSBvdmVyaGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1 c2luZyBmYXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAq bG9jazsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRy LCB2YV9uZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlp ZiAoUENQVV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRy ID0gc3JjX2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBk ZWFkbG9jay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0 X3BtYXApOworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhz cmNfcG1hcCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3Jj X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAq c3JjX3B0ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRl OworCQlwZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRy eV90IHNyY3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKwor CQlzcmNfcGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBl ID09IE5VTEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VH KSAmIH5TRUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUg Y29weSByYW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29w eSBhbGwgbWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAo dmFfbmV4dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJ CX0KKworCQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25l eHQgPCBhZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3Bk cGVfdG9fcGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3Jj X3BkZSA9PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRl OworCisJCWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1 cGVycGFnZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBO QlBEUiA+IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2Nw ZGUoZHN0X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQli cmVhazsKKworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJ CWRzdF9wZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1f UEFHRV9UT19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9p bmRleChhZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVz dCgmc3JjcHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0 X3BtYXAsIGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsK KwkJCQkqZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBf cmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7 CisJCQl9IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJ fQorCisJCXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21w dGUgPSBQSFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVf Y291bnQgPiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMg dW51c2VkIikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5k IG9mIHRoZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUg cGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkg Ki8KKwkJaWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKwor CQkvKgorCQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRo ZSBtYW5hZ2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3Bk ZV90b19wdGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1J UFNfUEhZU19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9w dGVfaW5kZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0g MCkKKwkJCWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZh X25leHQpIHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsK KworCisJCQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1 YWwgY29weSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwg UFRFX01BTkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICov CisJCQkJcGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRo ZSBwYWdlIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3Bt YXAsIGFkZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7 CisJCQkJCWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9U T19QSFlTKCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJ CQkJaWYgKGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRl cGluZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBq dXN0CisJCQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRz dG1wdGUtPndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUg cGFnZSB0YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2Nh dGVkLgorCQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJ CQkJCSAgICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5n IG1lbW9yeSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5 IHRoZSBwYWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09 IE5VTEwpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3 ZSBoYXZlIGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisK KwkJCQkvKiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9w dGUgPSAocHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlW TV9QQUdFX1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0 ZV9pbmRleChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICov CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJ CWlmICgqZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShk c3RfcG1hcCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBv cHVsYXRlIHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2Rp ZmllZCwgYW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1 cmluZyB0aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cg fCBQVEVfRCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOwor CQkJCQkvKiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRz dF9wbWFwLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJ aWYgKHBtYXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZm cmVlKSkgeworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAg YWRkcik7CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJ Z290byBvdXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3 ZSdyZSBkb25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndp cmVfY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlz cmNfcHRlKys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9j ayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNy Y19wbWFwKTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30K KworLyoKKyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFn ZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xl YXIgaXRzIGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3Zv aWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZt X3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RP X0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9T SVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91 bnBpbigpOworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lm aWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVz aW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5 IG5vdCBjb3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2 b2lkCitwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkK K3sKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMo bSk7CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJ Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKK3ZvaWQKK3Bt YXBfemVyb19wYWdlX2lkbGUodm1fcGFnZV90IG0pCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1f cGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBQQUdFX1NJ WkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCXNjaGVkX3Vu cGluKCk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAo bWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZp cnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1h Y2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBm b3IgNjQgYml0LgorICovCisjZGVmaW5lCVBNQVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRp YyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3Qg ZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFk ZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9fUEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19k c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBh Y2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgorCSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRo YXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGlu IFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8KKwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2 Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpFKTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElS RUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsK KyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxhZ3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlf YmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxz ZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0Vf U0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0la RSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0 aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRseSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBw YWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24td3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChl LmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20gVk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlz IG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQgdG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5 c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFncykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8K KyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQK K3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFw X2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRzdCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkK K3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Modm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkK K3sKKworCXBtYXBfY29weV9wYWdlX2ludGVybmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7 Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVkX2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAor cG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29m ZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVy c2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIgKmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20s IGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29mZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJf dCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhm ZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNldCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlj bnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0laRSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFb YV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJCWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20p OworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250 LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0Vf U0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdFX1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9w dmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19U T19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBBR0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1J UFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSArIGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIg KilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVf Q0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9DT1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2Nw LCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxzZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsK KyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250 KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQliX29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09 IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5 X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFnZ2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisg KiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9w YWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltd LAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2Nv cHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zmc2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAw KTsKK30KKworI2lmZGVmIENQVV9DSEVSSQordm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1f cGFnZV90IG1hW10sIHZtX29mZnNldF90IGFfb2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2 bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhmZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2Vz X2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIsIGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1B UF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBt YXAncyBwdiBpcyBvbmUgb2YgdGhlIGZpcnN0CisgKiAxNiBwdnMgbGlua2VkIHRvIGZyb20gdGhp cyBwYWdlLiAgVGhpcyBjb3VudCBtYXkKKyAqIGJlIGNoYW5nZWQgdXB3YXJkcyBvciBkb3dud2Fy ZHMgaW4gdGhlIGZ1dHVyZTsgaXQKKyAqIGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdHJ1ZSBiZSBy ZXR1cm5lZCBmb3IgYSBzbWFsbAorICogc3Vic2V0IG9mIHBtYXBzIGZvciBwcm9wZXIgcGFnZSBh Z2luZy4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrKHBtYXBfdCBwbWFw LCB2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXN0cnVjdCByd2xvY2sg KmxvY2s7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbG9vcHMgPSAwOworCWJvb2xlYW5fdCBydjsK KworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgiJXM6 IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBfX2Z1bmNfXywgbSkpOworCXJ2ID0gRkFMU0U7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CisJCQlydiA9IFRS VUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQli cmVhazsKKwl9CisJaWYgKCFydiAmJiBsb29wcyA8IDE2ICYmIChtLT5mbGFncyAmIFBHX0ZJQ1RJ VElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJ CVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCWlmIChQVl9Q TUFQKHB2KSA9PSBwbWFwKSB7CisJCQkJcnYgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkJ bG9vcHMrKzsKKwkJCWlmIChsb29wcyA+PSAxNikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyd19y dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChy dik7Cit9CisKKy8qCisgKglwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3M6CisgKgorICoJUmV0dXJu IHRoZSBudW1iZXIgb2YgbWFuYWdlZCBtYXBwaW5ncyB0byB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFn ZQorICoJdGhhdCBhcmUgd2lyZWQuCisgKi8KK2ludAorcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdz KHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK KwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGNvdW50LCBtZF9nZW47CisK KwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCisJCXJldHVybiAoMCk7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwljb3VudCA9IDA7CisJVEFJTFFf Rk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAo cHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJbWRfZ2VuID0gbS0+bWQucHZf Z2VuOworCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3Js b2NrKGxvY2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJcHRlID0gcG1hcF9w dGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQorCQkJY291 bnQrKzsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwKSB7CisJCXN0cnVjdCBtZF9wYWdlICpwdmggPSBwYV90b19wdmgoVk1fUEFH RV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4 dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOworCQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkp IHsKKwkJCQlpbnQgcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCW1kX2dlbiA9IG0tPm1kLnB2 X2dlbjsKKwkJCQlyd19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQly d19ybG9jayhsb2NrKTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAg ICBwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJcGRfZW50cnlfdCAqcGRlID0gcG1hcF9w ZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChwdGVfdGVzdCgocHRfZW50cnlfdCAqKXBkZSwg UFRFX1cpKQorCQkJCWNvdW50Kys7CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJfQorCX0KKwly d19ydW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJu IChjb3VudCk7Cit9CisKKy8qCisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlz IG1hcHBlZCBpbmRpdmlkdWFsbHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndp c2UsIHJldHVybnMgRkFMU0UuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKwor CWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElT VF9MT0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5w dl9saXN0KSB8fAorCSAgICAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkh VEFJTFFfRU1QVFkoJnBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJ cndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy biAocnYpOworfQorCisvKgorICogRGVzdHJveSBhbGwgbWFuYWdlZCwgbm9uLXdpcmVkIG1hcHBp bmdzIGluIHRoZSBnaXZlbiB1c2VyLXNwYWNlCisgKiBwbWFwLiAgVGhpcyBwbWFwIGNhbm5vdCBi ZSBhY3RpdmUgb24gYW55IHByb2Nlc3NvciBiZXNpZGVzIHRoZQorICogY2FsbGVyLgorICoKKyAq IFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCBwbWFwLiAgTW9y ZW92ZXIsIGl0CisgKiBpcyBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgSXQgaXMgb25s eSB0byBiZSB1c2VkIGR1cmluZworICogcHJvY2VzcyB0ZXJtaW5hdGlvbi4gIENvbnNlcXVlbnRs eSwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHdheXMKKyAqIHRoYXQgbWFrZSBpdCBmYXN0ZXIg dGhhbiBwbWFwX3JlbW92ZSgpLiAgRmlyc3QsIGl0IGNhbiBtb3JlIHF1aWNrbHkKKyAqIGRlc3Ry b3kgbWFwcGluZ3MgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIHBtYXAncyBjb2xsZWN0aW9uIG9mIFBW CisgKiBlbnRyaWVzLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIHBhZ2UgdGFibGUuICBTZWNv bmQsIGl0IGRvZXNuJ3QKKyAqIGhhdmUgdG8gdGVzdCBhbmQgY2xlYXIgdGhlIHBhZ2UgdGFibGUg ZW50cmllcyBhdG9taWNhbGx5LCBiZWNhdXNlCisgKiBubyBwcm9jZXNzb3IgaXMgY3VycmVudGx5 IGFjY2Vzc2luZyB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGEg cGFnZSB0YWJsZSBlbnRyeSdzIGRpcnR5IGJpdCB3b24ndCBjaGFuZ2Ugc3RhdGUgb25jZQorICog dGhpcyBmdW5jdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBf dCBwbWFwKQoreworCXBkX2VudHJ5X3QgcHRlcGRlLCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZSwg dHB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZ2VfdCBtLCBtcHRlLCBtdDsKKwlw dl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpw YywgKm5wYzsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWludCBiaXQ7CisJdWludDY0X3QgaW51 c2UsIGJpdG1hc2s7CisJaW50IGFsbGZyZWUsIGZpZWxkLCBmcmVlZCwgaWR4OworCWJvb2xlYW5f dCBzdXBlcnBhZ2U7CisJdm1fcGFkZHJfdCBwYTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgdGhl IGdpdmVuIHBtYXAgaXMgb25seSBhY3RpdmUgb24gdGhlIGN1cnJlbnQKKwkgKiBDUFUuICBVbmZv cnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYmxvY2sgYW5vdGhlciBDUFUgZnJvbQorCSAqIGFjdGl2YXRp bmcgdGhlIHBtYXAgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisJICovCisJS0FT U0VSVChwbWFwID09IHZtc3BhY2VfcG1hcChjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfdm1zcGFjZSks CisJICAgICgiJXM6IG5vbi1jdXJyZW50IHBtYXAgJXAiLCBfX2Z1bmNfXywgcG1hcCkpOworCisJ bG9jayA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwYywgJnBtYXAt PnBtX3B2Y2h1bmssIHBjX2xpc3QsIG5wYykgeworCQlhbGxmcmVlID0gMTsKKwkJZnJlZWQgPSAw OworCQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaW51c2Ug PSB+cGMtPnBjX21hcFtmaWVsZF0gJiBwY19mcmVlbWFza1tmaWVsZF07CisJCQl3aGlsZSAoaW51 c2UgIT0gMCkgeworCQkJCWJpdCA9IGZmc2woaW51c2UpIC0gMTsKKwkJCQliaXRtYXNrID0gMVVM IDw8IGJpdDsKKwkJCQlpZHggPSBmaWVsZCAqIHNpemVvZihpbnVzZSkgKiBOQkJZICsgYml0Owor CQkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQkJaW51c2UgJj0gfmJpdG1hc2s7CisK KwkJCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCBwdi0+cHZfdmEpOworCQkJCXB0ZXBkZSA9ICpw ZGU7CisJCQkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZGUsIHB2LT5wdl92YSk7CisJCQkJaWYg KHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJCQlzdXBlcnBhZ2UgPSBUUlVFOworCQkJ CQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlcnBhZ2Ug PSBGQUxTRTsKKwkJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQl9CisJCQkJdHB0ZSA9ICpwdGU7CisJCQkJaWYgKCFwdGVf aXNfdmFsaWQocHRlKSkgIHsKKwkJCQkJcGFuaWMoIiVzOiBiYWQgJXMgcHRlIHZhICVseCBwdGUg JWx4IiwKKwkJCQkJICAgIF9fZnVuY19fLCBzdXBlcnBhZ2UgPyAic3VwZXJwYWdlIiA6CisJCQkJ CSAgICAiIiwgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCQl9CisKKy8qCisgKiBXZSBjYW5ub3QgcmVt b3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQorICov CisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfVykpIHsKKwkJCQkJYWxsZnJlZSA9IDA7CisJ CQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHRwdGUpOwor CQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXBhICY9IH5QRFJNQVNLOworCQkJCW0gPSBQSFlTX1RP X1ZNX1BBR0UocGEpOworCQkJCUtBU1NFUlQobS0+cGh5c19hZGRyID09IHBhLAorCQkJCSAgICAo IiVzOiB2bV9wYWdlX3QgJXAgcGh5c19hZGRyIG1pc21hdGNoICIKKwkJCQkgICAgIiUwMTZqeCAl MDE2angiLCBfX2Z1bmNfXywgbSwKKwkJCQkgICAgKHVpbnRtYXhfdCltLT5waHlzX2FkZHIsICh1 aW50bWF4X3QpdHB0ZSkpOworCisJCQkJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSAhPSAwIHx8CisJCQkJICAgIG0gPCAmdm1fcGFnZV9hcnJheVt2bV9wYWdlX2FycmF5X3NpemVd LAorCQkJCSAgICAoIiVzOiBiYWQgdHB0ZSAlI2p4IiwgX19mdW5jX18sCisJCQkJICAgICh1aW50 bWF4X3QpdHB0ZSkpOworCisJCQkJLyogQ2xlYXIgUFRFICovCisJCQkJaWYgKHN1cGVycGFnZSkK KwkJCQkJcHRlX3N0b3JlKHB0ZSwgMCk7CisJCQkJZWxzZQorCQkJCQlwdGVfc3RvcmUocHRlLCBp c19rZXJuZWxfcG1hcChwbWFwKSA/CisJCQkJCSAgICBQVEVfRyA6IDApOworCisJCQkJLyoKKwkJ CQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMKKwkJCQkg Ki8KKwkJCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3Qo JnRwdGUsIFBURV9STykpIHsKKwkJCQkJaWYgKHN1cGVycGFnZSkgeworCQkJCQkJdm1fcGFnZV90 IG10OworCisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10 KyspCisJCQkJCQkJdm1fcGFnZV9kaXJ0eShtdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJdm1fcGFn ZV9kaXJ0eShtKTsKKwkJCQl9CisKKwkJCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo JmxvY2ssIG0pOworCisJCQkJLyogTWFyayBmcmVlICovCisJCQkJcGMtPnBjX21hcFtmaWVsZF0g fD0gYml0bWFzazsKKwkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291 bnRfZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwkJCQkJcHZoID0gcGFfdG9fcHZoKFRM QkxPX1BURV9UT19QQSh0cHRlKSk7CisJCQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw diwgcHZfbmV4dCk7CisJCQkJCXB2aC0+cHZfZ2VuKys7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgm cHZoLT5wdl9saXN0KSkgeworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1bTkJQRFIgLyBQQUdF X1NJWkVdOyBtdCsrKQorCQkJCQkJCWlmIChUQUlMUV9FTVBUWSgmbXQtPm1kLnB2X2xpc3QpKQor CQkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG10LCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQor CQkJCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCQlp ZiAobXB0ZSAhPSBOVUxMKSB7CisJCQkJCQlwbWFwX3JlbW92ZV9wdF9wYWdlKHBtYXAsIG1wdGUp OworCQkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJCQkJCQlLQVNTRVJU KG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJCQkJICAgICgiJXM6IHB0ZSBwYWdlIHdp cmUgY291bnQgZXJyb3IiLAorCQkJCQkJICAgIF9fZnVuY19fKSk7CisJCQkJCQltcHRlLT53aXJl X2NvdW50ID0gMDsKKwkJCQkJCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG1wdGUsICZmcmVl LCBGQUxTRSk7CisJCQkJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50 LCAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVj KHBtYXAsIDEpOworCQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0 KTsKKwkJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRF QUJMRSkgIT0gMCAmJgorCQkJCQkgICAgVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJ CQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCQlwdmggPSBw YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkKKwkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUp OworCQkJCQl9CisJCQkJfQorCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCBwdGVw ZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCVBWX1NUQVQoYXRvbWljX2Fk ZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfYWRkX2lu dCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xv bmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlpZiAoYWxsZnJlZSkgeworCQkJVEFJTFFf UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCQlmcmVlX3B2X2NodW5r KHBjKTsKKwkJfQorCX0KKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor CXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcndfcnVu bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9 CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGUgYW5kIG1vZGlmaWVkIGJpdHMgaW4gZWFjaCBvZiB0 aGUgZ2l2ZW4gcGFnZSdzIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3JlbW92ZV93cml0ZSh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXZtX29mZnNldF90IHZhOwor CXB2X2VudHJ5X3QgbmV4dF9wdjsKKwlpbnQgcHZoX2dlbjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1 Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwg KnB0ZTsKKwlwdl9lbnRyeV90IHB2OworCWludCBtZF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdl ICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3Qg ZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQR0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIHNldCBi eSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMsCisJICog aWYgUEdBX1dSSVRFQUJMRSBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBlbnRyaWVzIG5lZWQgdXBk YXRpbmcuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYg KCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDAp CisJCXJldHVybjsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFH RV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyht KSk7CityZXRyeV9wdl9sb29wOgorCXJ3X3dsb2NrKGxvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQ R19GSUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVB Q0hfU0FGRShwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRy eV9wdl9sb29wOworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3Bk ZShwbWFwLCB2YSk7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkgJiYgIXBkZV90ZXN0 KHBkZSwgUFRFX1JPKSkKKwkJCSh2b2lkKXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRl LCB2YSwgJmxvY2spOworCQlLQVNTRVJUKGxvY2sgPT0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0so bSksCisJCSAgICAoImluY29uc2lzdGVudCBwdiBsb2NrICVwICVwIGZvciBwYWdlICVwIiwKKwkJ ICAgIGxvY2ssIFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLCBtKSk7CisJCVBNQVBfVU5MT0NL KHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5w dl9saXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RS WUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9IG0t Pm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuIHx8CisJCQkg ICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRyeV9wdl9sb29wOworCQkJfQorCQl9CisJ CXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBl cnBhZ2UocGRlKSwKKwkJICAgICgiJXM6IGZvdW5kIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw diBsaXN0IiwKKwkJICAgIF9fZnVuY19fLCBtKSk7CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw ZGUsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQocHRlICE9IE5VTEwgJiYgcHRlX2lzX3ZhbGlkKHB0 ZSksCisJCSAgICAoIiVzOnBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIiwgX19mdW5jX18pKTsK K3JldHJ5OgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9S TykpIHsKKwkJCWlmICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwgb2xkcHRlLAorCQkJICAgICgo b2xkcHRlICYgflBURV9EKSB8IFBURV9STykpKQorCQkJCWdvdG8gcmV0cnk7CisJCQlpZiAocHRl X3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXAp OworCX0KKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxv Y2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworI2RlZmluZQlQ TUFQX1RTX1JFRkVSRU5DRURfTUFYCTUKKworLyotCisgKglwbWFwX3RzX3JlZmVyZW5jZWQ6Cisg KgorICogIFJldHVybiBhIGNvdW50IG9mIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQs IGFuZCByZXNldCB0aGUKKyAqICByZWZlcmVuY2UgYml0LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBm b3IgZXZlcnkgcmVmZXJlbmNlIGJpdCB0byBiZQorICogIHJlc2V0LCBidXQgaXQgaXMgbmVjZXNz YXJ5IHRoYXQgMCBvbmx5IGJlIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlCisgKiAgdHJ1bHkgaGF2 ZSBiZWVuIHBhZ2VzIHJlZmVyZW5jZWQuCisgKgorICogIFhYWDogVGhlIGV4YWN0IG51bWJlciBv ZiBmbGFncyB0byBjaGVjayBhbmQgcmVzZXQgaXMgYSBtYXR0ZXIgdGhhdAorICogIHNob3VsZCBi ZSB0ZXN0ZWQgYW5kIHN0YW5kYXJkaXplZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgZm9y CisgKiAgb3B0aW1hbCBhZ2luZyBvZiBzaGFyZWQgcGFnZXMuCisgKi8KK2ludAorcG1hcF90c19y ZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50 cnlfdCBwdiwgcHZmOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRf ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9w YWRkcl90IHBhOworCWludCBjbGVhcmVkLCBtZF9nZW4sIG5vdF9jbGVhcmVkLCBwdmhfZ2VuOwor CisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFw X3RzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJY2xlYXJlZCA9 IDA7CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisJbG9jayA9IFBIWVNfVE9fUFZfTElTVF9M T0NLKHBhKTsKKwlwdmggPSBwYV90b19wdmgocGEpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv Y2spOworCXJ3X3dsb2NrKGxvY2spOworcmV0cnk6CisJbm90X2NsZWFyZWQgPSAwOworCWlmICgo bS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAhPSAwIHx8CisJICAgIChwdmYgPSBUQUlMUV9GSVJT VCgmcHZoLT5wdl9saXN0KSkgPT0gTlVMTCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlwdiA9 IHB2ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJdmEgPSBw di0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVf aXNfcmVmKChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIHRoaXMgcmVm ZXJlbmNlIGJpdCBpcyBzaGFyZWQgYnkgNTEyIDRLQgorCQkJICogcGFnZXMsIGl0IHNob3VsZCBu b3QgYmUgY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzCisJCQkgKiB0ZXN0ZWQuICBBcHBseSBhIHNp bXBsZSAiaGFzaCIgZnVuY3Rpb24gb24gdGhlCisJCQkgKiBwaHlzaWNhbCBwYWdlIG51bWJlciwg dGhlIHZpcnR1YWwgc3VwZXJwYWdlIG51bWJlciwKKwkJCSAqIGFuZCB0aGUgcG1hcCBhZGRyZXNz IHRvIHNlbGVjdCBvbmUgNEtCIHBhZ2Ugb3V0IG9mCisJCQkgKiB0aGUgNTEyIG9uIHdoaWNoIHRl c3RpbmcgdGhlIHJlZmVyZW5jZSBiaXQgd2lsbAorCQkJICogcmVzdWx0IGluIGNsZWFyaW5nIHRo YXQgcmVmZXJlbmNlIGJpdC4gIFRoaXMKKwkJCSAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGF2 b2lkIHRoZSBzZWxlY3Rpb24gb2YgdGhlCisJCQkgKiBzYW1lIDRLQiBwYWdlIGZvciBldmVyeSAy TUIgcGFnZSBtYXBwaW5nLgorCQkJICoKKwkJCSAqIE9uIGRlbW90aW9uLCBhIG1hcHBpbmcgdGhh dCBoYXNuJ3QgYmVlbiByZWZlcmVuY2VkCisJCQkgKiBpcyBzaW1wbHkgZGVzdHJveWVkLiAgVG8g YXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGEKKwkJCSAqIHN1YnNlcXVlbnQgcGFnZSBmYXVsdCBv biBhIGRlbW90ZWQgd2lyZWQgbWFwcGluZywKKwkJCSAqIGFsd2F5cyBsZWF2ZSBpdHMgcmVmZXJl bmNlIGJpdCBzZXQuICBNb3Jlb3ZlciwKKwkJCSAqIHNpbmNlIHRoZSBzdXBlcnBhZ2UgaXMgd2ly ZWQsIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJCQkgKiBpdHMgcmVmZXJlbmNlIGJpdCB3b24ndCBh ZmZlY3QgcGFnZSByZXBsYWNlbWVudC4KKwkJCSAqLworCQkJaWYgKCgoKHBhID4+IFBBR0VfU0hJ RlQpIF4gKHB2LT5wdl92YSA+PiBQRFJTSElGVCkgXgorCQkJICAgICh1aW50cHRyX3QpcG1hcCkg JiAoTlBURVBHIC0gMSkpID09IDAgJiYKKwkJCSAgICAhcGRlX3Rlc3QocGRlLCBQVEVfVykpIHsK KwkJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1JFRik7CisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCQljbGVhcmVkKys7CisJ CQl9IGVsc2UKKwkJCQlub3RfY2xlYXJlZCsrOworCisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7 CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeS4g Ki8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgIT0gTlVMTCkg eworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxR X0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJfQorCQlpZiAoKGNs ZWFyZWQgKyBub3RfY2xlYXJlZCkgPj0gUE1BUF9UU19SRUZFUkVOQ0VEX01BWCkKKwkJCWdvdG8g b3V0OworCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBwdmYp Oworc21hbGxfbWFwcGluZ3M6CisJaWYgKChwdmYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz dCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCXB2ID0gcHZmOworCWRvIHsKKwkJaWYgKHB2ZiA9 PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQ X1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9 IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7 CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmICgKKwkJCSAgICBwdmhfZ2VuICE9IHB2aC0+cHZf Z2VuIHx8CisJCQkgICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NL KHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKworCQlwZGUgPSBwbWFwX3BkZShw bWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAg ICAoInBtYXBfdHNfcmVmZXJlbmNlZDogZm91bmQgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBwdiBs aXN0IiwKKwkJICAgIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3Zh KTsKKwkJaWYgKHB0ZV9pc19yZWYocHRlKSkgeworCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2Vu dHJ5X3QgKilwZGUsIFBURV9SRUYpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYt PnB2X3ZhKTsKKwkJCWNsZWFyZWQrKzsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyog Um90YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlp ZiAocHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlU QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQltLT5tZC5wdl9nZW4rKzsK KwkJfQorCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgIT0gcHZm ICYmIGNsZWFyZWQgKworCSAgICBub3RfY2xlYXJlZCA8IFBNQVBfVFNfUkVGRVJFTkNFRF9NQVgp Oworb3V0OgorCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlyZXR1cm4gKGNsZWFyZWQgKyBub3RfY2xlYXJlZCk7Cit9CisKK3N0YXRpYyBib29sZWFu X3QKK3BtYXBfcGFnZV90ZXN0X21hcHBpbmdzKHZtX3BhZ2VfdCBtLCBib29sZWFuX3QgYWNjZXNz ZWQsIGJvb2xlYW5fdCBtb2RpZmllZCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2Vu dHJ5X3QgcHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdF9lbnRyeV90ICpwdGU7CisJcG1h cF90IHBtYXA7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9 IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RP X1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6CisJVEFJTFFfRk9S RUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYp OworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJIG1kX2dlbiA9IG0tPm1kLnB2X2dl bjsKKwkJCSByd19ydW5sb2NrKGxvY2spOworCQkJIFBNQVBfTE9DSyhwbWFwKTsKKwkJCSByd19y bG9jayhsb2NrKTsKKwkJCSBpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCSBQTUFQ X1VOTE9DSyhwbWFwKTsKKwkJCQkgZ290byByZXN0YXJ0OworCQkJIH0KKwkJfQorCQlwdGUgPSBw bWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlpZiAobW9kaWZpZWQpIHsKKwkJCXJ2ID0gcHRl X3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKTsKKwkJCWlmIChhY2Nl c3NlZCkKKwkJCQlydiA9IHJ2ICYmIHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19yZWYocHRl KTsKKwkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAm JiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCWlmIChydikK KwkJCWdvdG8gb3V0OworCX0KKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkg eworCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFD SChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOwor CQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47 CisJCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQkJ UE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmIChtZF9nZW4gIT0g bS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4pIHsKKwkJCQkJ UE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAobW9k aWZpZWQpIHsKKwkJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVf dGVzdChwdGUsIFBURV9STyk7CisJCQkJaWYgKGFjY2Vzc2VkKQorCQkJCQlydiA9IHJ2ICYmIHB0 ZV9pc192YWxpZChwdGUpICYmCisJCQkJCSAgICBwdGVfaXNfcmVmKHB0ZSk7CisJCQl9IGVsc2Ug aWYgKGFjY2Vzc2VkKSB7CisJCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCSAgICBw dGVfaXNfcmVmKHB0ZSk7CisJCQl9CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCWlmIChydikK KwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyd19ydW5sb2NrKGxvY2spOworCXJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChydik7Cit9CisKKworLyoKKyAqCXBt YXBfaXNfbW9kaWZpZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZp ZWQgcGh5c2ljYWwgcGFnZSB3YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor ICovCitib29sZWFuX3QKK3BtYXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfbW9k aWZpZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBw YWdlIGlzIG5vdCBleGNsdXNpdmUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJl CisJICogY29uY3VycmVudGx5IHNldCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMs IGlmIFBHQV9XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBz ZXQuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYgKCF2 bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJ CXJldHVybiAoRkFMU0UpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFwcGluZ3MobSwgRkFM U0UsIFRSVUUpKTsKK30KKworLyoKKyAqCXBtYXBfaXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJl dHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdp YmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFi bGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIpCit7CisJcGRfZW50cnlfdCAqcGRlOwor CXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9IEZBTFNFOworCVBNQVBf TE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlpZiAocGRlICE9IE5V TEwgJiYgKnBkZSAhPSAwKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgYWRkcik7CisJCXJ2ID0gKCpwdGUgPT0gMCkgfHwgKCpwdGUgPT0gUFRFX0cpOworCX0K KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfaXNf cmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBw aHlzaWNhbCBwYWdlIHdhcyByZWZlcmVuY2VkCisgKglpbiBhbnkgcGh5c2ljYWwgbWFwcy4KKyAq LworYm9vbGVhbl90CitwbWFwX2lzX3JlZmVyZW5jZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfcmVm ZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlyZXR1cm4gKHBtYXBfcGFn ZV90ZXN0X21hcHBpbmdzKG0sIFRSVUUsIEZBTFNFKSk7Cit9CisKKy8qCisgKglBcHBseSB0aGUg Z2l2ZW4gYWR2aWNlIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYWRkcmVzc2VzIHdpdGhpbiB0 aGUKKyAqCWdpdmVuIHBtYXAuICBEZXBlbmRpbmcgb24gdGhlIGFkdmljZSwgY2xlYXIgdGhlIHJl ZmVyZW5jZWQgYW5kL29yCisgKgltb2RpZmllZCBmbGFncyBpbiBlYWNoIG1hcHBpbmcgYW5kIHNl dCB0aGUgbWFwcGVkIHBhZ2UncyBkaXJ0eSBmaWVsZC4KKyAqLwordm9pZAorcG1hcF9hZHZpc2Uo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCBpbnQgYWR2aWNl KQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZSwgb2xk cGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXZtX3BhZ2Vf dCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkLCBwdl9saXN0c19sb2NrZWQ7CisKKwlpZiAoYWR2 aWNlICE9IE1BRFZfRE9OVE5FRUQgJiYgYWR2aWNlICE9IE1BRFZfRlJFRSkKKwkJcmV0dXJuOwor CisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZBTFNF OworCVBNQVBfTE9DSyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7 CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgewor CQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwg c3ZhKQorCQkJCXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0g KHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25l eHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCQlvbGRw ZGUgPSAqcGRlOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSAwKQorCQkJY29udGludWU7 CisJCWVsc2UgaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVz dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIXB2X2xpc3Rz X2xvY2tlZCkgeworCQkJCXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJaWYgKCFyd190cnlf cmxvY2soJnB2aF9nbG9iYWxfbG9jaykpIHsKKwkJCQkJaWYgKGFueWNoYW5nZWQpCisJCQkJCQlw bWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCQkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJ CX0KKwkJCWxvY2sgPSBOVUxMOworCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAs IHBkZSwgc3ZhLCAmbG9jaykpIHsKKwkJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCQlyd193dW5s b2NrKGxvY2spOworCisJCQkJLyoKKwkJCQkgKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRl c3Ryb3llZC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVu bGVzcyB0aGUgcGFnZSBtYXBwaW5ncyBhcmUgd2lyZWQsIHJlbW92ZSB0aGUKKwkJCSAqIG1hcHBp bmcgdG8gYSBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVudAorCQkJICogYWNjZXNzIG1h eSByZXByb21vdGUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBwYWdlCisJCQkgKiB0YWJsZSBwYWdl IGlzIGZ1bGx5IHBvcHVsYXRlZCwgdGhpcyByZW1vdmFsIG5ldmVyCisJCQkgKiBmcmVlcyBhIHBh Z2UgdGFibGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykp IHsKKwkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOworCQkJCUtBU1NFUlQocHRl X3Rlc3QocHRlLCBQVEVfVkFMSUQpLAorCQkJCSAgICAoInBtYXBfYWR2aXNlOiBpbnZhbGlkIFBU RSIpKTsKKwkJCQlwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsICpwZGUsIE5VTEwsCisJ CQkJICAgICZsb2NrKTsKKwkJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwkJCX0KKwkJCWlmIChsb2Nr ICE9IE5VTEwpCisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJfQorCQkvKgorCQkgKiBMaW1pdCBv dXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmEgcmVwcmVzZW50ZWQKKwkJICogYnkg dGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBy YW5nZSBiZWluZyB3cml0ZSBwcm90ZWN0ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkK KwkJCXZhX25leHQgPSBldmE7CisKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBz dmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJ CQlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8ICFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEKSkK KwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkg ICAgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQkJCWlmIChhZHZpY2UgPT0gTUFEVl9ET05U TkVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBGdXR1cmUgY2FsbHMgdG8gcG1hcF9pc19tb2RpZmll ZCgpCisJCQkJCSAqIGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyB0aGUgcGFnZQorCQkJCQkgKiBk aXJ0eSBub3cuCisJCQkJCSAqLworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkgICAg VExCTE9fUFRFX1RPX1BBKCpwdGUpKTsKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQl9CisJ CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EIHwgUFRFX1JFRik7CisJCQl9IGVsc2UgaWYg KHB0ZV9pc19yZWYocHRlKSkKKwkJCQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgUFRFX1JFRik7CisJ CQllbHNlCisJCQkJY29udGludWU7CisJCQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRykpCisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJCWVsc2UKKwkJCQlhbnljaGFuZ2Vk ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAoYW55Y2hhbmdlZCkKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs bChwbWFwKTsKKwlpZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9i YWxfbG9jayk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ2xlYXIgdGhl IG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor cG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsK KwlwbWFwX3QgcG1hcDsKKwlwdl9lbnRyeV90IG5leHRfcHYsIHB2OworCXBkX2VudHJ5X3Qgb2xk cGRlLCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXN0cnVjdCByd2xvY2sgKmxv Y2s7CisJdm1fb2Zmc2V0X3QgdmE7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKworCUtBU1NFUlQo KG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2Rp Znk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0FTU0VSVF9XTE9D S0VEKG0tPm9iamVjdCk7CisJS0FTU0VSVCghdm1fcGFnZV94YnVzaWVkKG0pLAorCSAgICAoInBt YXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGV4Y2x1c2l2ZSBidXNpZWQiLCBtKSk7CisKKwkv KgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR0FfV1JJVEVBQkxFLCB0aGVuIG5vIFBURXMgY2Fu IGhhdmUgUFRFX0Qgc2V0LgorCSAqIElmIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBp cyBsb2NrZWQgYW5kIHRoZSBwYWdlIGlzIG5vdAorCSAqIHdyaXRlIGJ1c2llZCwgdGhlbiBQR0Ff V1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgobS0+YWZs YWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd193bG9jayhsb2NrKTsKK3Jlc3RhcnQ6 CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFw cGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBu ZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1h cCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJ CQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9 IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0 OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2 YSk7CisJCW9sZHBkZSA9ICpwZGU7CisJCWlmICghcGRlX3Rlc3QocGRlLCBQVEVfUk8pKSB7CisJ CQlpZiAocG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jaykpIHsKKwkJ CQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCQkvKgorCQkJCQkgKiBXcml0 ZSBwcm90ZWN0IHRoZSBtYXBwaW5nIHRvIGEKKwkJCQkJICogc2luZ2xlIHBhZ2Ugc28gdGhhdCBh IHN1YnNlcXVlbnQKKwkJCQkJICogd3JpdGUgYWNjZXNzIG1heSByZXByb21vdGUuCisJCQkJCSAq LworCQkJCQl2YSArPSBWTV9QQUdFX1RPX1BIWVMobSkgLQorCQkJCQkgICBUTEJMT19QREVfVE9f UEEob2xkcGRlKTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJCQlv bGRwdGUgPSAqcHRlOworCQkJCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9WQUxJRCkpIHsK KwkJCQkJCXdoaWxlICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwKKwkJCQkJCSAgICBvbGRwdGUs CisJCQkJCQkgICAgKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKQorCQkJCQkJCW9sZHB0ZSA9 ICpwdGU7CisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcCwgdmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHBt YXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxP Q0socG1hcCkpIHsKKwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXB2aF9nZW4gPSBwdmgt PnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQly d193bG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8IG1kX2dlbiAh PSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3Rh cnQ7CisJCQl9CisJCX0KKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT U0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUpLCAoInBtYXBfY2xlYXJfbW9kaWZ5OiBmb3VuZCIK KwkJICAgICIgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLCBtKSk7CisJCXB0ZSA9 IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVzdChwdGUsIFBU RV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgUFRFX0QpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0 IHJvdXRpbmVzIGZvbGxvdworICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVt b3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1 cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBp bnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVh bCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hlZCBmb3IgNjQgYml0LgorICovCit2 b2lkICoKK3BtYXBfbWFwZGV2KHZtX3BhZGRyX3QgcGEsIHZtX3NpemVfdCBzaXplKQoreworCisJ cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1RfVU5DQUNIRUQocGEpKTsKK30KKwor dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7CisK KwkvKiBOb3RoaW5nIHRvIGRvIGZvciBtaXBzNjQuICovCit9CisKKy8qCisgKiBTZXRzIHRoZSBt ZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBf cGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCS8qCisJ ICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQg aW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBjcmVhdGVkLgorCSAqLworCW0tPm1kLnB2 X21lbWF0dHIgPSBtYTsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rp b24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCSAqIGFyZSBlc3RhYmxpc2hl ZC4gIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisJICog bmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBtYWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1h cHBpbmdzCisJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3aXRoIG1pcHNfaWNhY2hl X3N5bmNfYWxsKCkgYW5kCisJICogbWlwc19kY2FjaGVfd2JpbnZfYWxsKCkpIGFuZCBtb3N0IGxp a2VseSBpbnZhbGlkYXRlIFRMQiBlbnRyaWVzIGZvcgorCSAqIGFueSBvZiB0aGUgY3VycmVudCBt YXBwaW5ncyBpdCBtb2RpZmllcy4KKwkgKi8KKwlpZiAoVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xp c3QpICE9IE5VTEwpCisJCXBhbmljKCJDYW4ndCBjaGFuZ2UgbWVtYXR0ciBvbiBwYWdlIHdpdGgg ZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBm b3IgbWluY29yZQorICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgYWRkciwgdm1fcGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXBkX2VudHJ5X3QgKnBkZXA7CisJ cHRfZW50cnlfdCAqcHRlcCwgcHRlOworCXZtX3BhZGRyX3QgcGE7CisJaW50IHZhbDsKKworCVBN QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlp ZiAocGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJ CQlwdGUgPSAocHRfZW50cnlfdCkqcGRlcDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7 CisJCQl2YWwgPSBNSU5DT1JFX1NVUEVSOworCQl9IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRl X3RvX3B0ZShwZGVwLCBhZGRyKTsKKwkJCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAw OworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9IDA7CisJCX0KKwl9IGVs c2UgeworCQlwdGUgPSAwOworCQlwYSA9IDA7CisJCXZhbCA9IDA7CisJfQorCWlmIChwdGVfaXNf dmFsaWQoJnB0ZSkpIHsKKwkJdmFsIHw9IE1JTkNPUkVfSU5DT1JFOworCQlpZiAocHRlX3Rlc3Qo JnB0ZSwgUFRFX0QpKQorCQkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBNSU5DT1JFX01PRElG SUVEX09USEVSOworCQlpZiAocHRlX2lzX3JlZigmcHRlKSkKKwkJCXZhbCB8PSBNSU5DT1JFX1JF RkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1J TkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAg ICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYK KwkgICAgcHRlX3Rlc3QoJnB0ZSwgUFRFX01BTkFHRUQpKSB7CisJCS8qIEVuc3VyZSB0aGF0ICJQ SFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdlLiAqLworCQlpZiAodm1f cGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJCQlnb3RvIHJldHJ5Owor CX0gZWxzZQorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3BhKTsKKwlQTUFQX1VOTE9DSyhwbWFw KTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBfYWN0aXZhdGUoc3RydWN0IHRocmVh ZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJc3RydWN0IHByb2MgKnAgPSB0ZC0+ dGRfcHJvYzsKKwl1X2ludCBjcHVpZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlwbWFwID0g dm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1cnBtYXAp OworCWNwdWlkID0gUENQVV9HRVQoY3B1aWQpOworCisJaWYgKG9sZHBtYXApCisJCUNQVV9DTFJf QVRPTUlDKGNwdWlkLCAmb2xkcG1hcC0+cG1fYWN0aXZlKTsKKwlDUFVfU0VUX0FUT01JQyhjcHVp ZCwgJnBtYXAtPnBtX2FjdGl2ZSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0ZCA9 PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsKKwkJ bWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbY3B1aWRdLmFzaWQpOworCX0KKworCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKwordm9pZAorcG1hcF9z eW5jX2ljYWNoZShwbWFwX3QgcG0sIHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc3opCit7Cit9 CisKKy8qCisgKglJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBn aXZlbiBtYXBwaW5nIGlmIGEKKyAqCWRpZmZlcmVudCBhbGlnbm1lbnQgbWlnaHQgcmVzdWx0IGlu IG1vcmUgc3VwZXJwYWdlIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX2FsaWduX3N1cGVycGFn ZSh2bV9vYmplY3RfdCBvYmplY3QsIHZtX29vZmZzZXRfdCBvZmZzZXQsCisgICAgdm1fb2Zmc2V0 X3QgKmFkZHIsIHZtX3NpemVfdCBzaXplKQoreworCXZtX29mZnNldF90IHN1cGVycGFnZV9vZmZz ZXQ7CisKKwlpZiAoc2l6ZSA8IE5CU0VHKQorCQlyZXR1cm47CisJaWYgKG9iamVjdCAhPSBOVUxM ICYmIChvYmplY3QtPmZsYWdzICYgT0JKX0NPTE9SRUQpICE9IDApCisJCW9mZnNldCArPSBwdG9h KG9iamVjdC0+cGdfY29sb3IpOworCXN1cGVycGFnZV9vZmZzZXQgPSBvZmZzZXQgJiBTRUdNQVNL OworCWlmIChzaXplIC0gKChOQlNFRyAtIHN1cGVycGFnZV9vZmZzZXQpICYgU0VHTUFTSykgPCBO QlNFRyB8fAorCSAgICAoKmFkZHIgJiBTRUdNQVNLKSA9PSBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQly ZXR1cm47CisJaWYgKCgqYWRkciAmIFNFR01BU0spIDwgc3VwZXJwYWdlX29mZnNldCkKKwkJKmFk ZHIgPSAoKmFkZHIgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0OworCWVsc2UKKwkJKmFk ZHIgPSAoKCphZGRyICsgU0VHTUFTSykgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor fQorCisjaWZkZWYgRERCCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7 CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9j ICpwOworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisK KwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsK KwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7 CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNl ID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJ cmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBl bHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6 JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIs IHBtYXAtPnBtX2FzaWRbMF0uYXNpZCwKKwkgICAgcG1hcC0+cG1fYXNpZFswXS5nZW4pOworCWZv ciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9lbnRyeV90ICpwZHBlOworCQlwdF9l bnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJCXBkcGUgPSAocGRfZW50cnlfdCAq KXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwor CQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsKKwkJZm9yIChqID0gMDsgaiA8IE5Q REVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAqKXBkcGVbal07CisJCQlpZiAocGRl ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmludGYoIlx0WyU0ZF0gJXBcbiIsIGos IHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKKwkJCQlwdGUgPSBwZGVb a107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfaXNfdmFsaWQoJnB0ZSkpCisJCQkJCWNvbnRp bnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylp IDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChrIDw8IFBBR0VfU0hJRlQpOworCQkJ CWRiX3ByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAlOGp4IHBhOiVqeFxuIiwKKwkJCQkg ICAgICAgaywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClwdGUsICh1aW50bWF4X3QpcGEpOworCQkJ fQorCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9p ZCBwYWRzKHBtYXBfdCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKwor LyogcHJpbnQgYWRkcmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBf dCBwbSkKK3sKKwl1bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYg KHBtID09IGtlcm5lbF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQlpZiAocG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7 IGorKykgeworCQkJCXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJ CQkJaWYgKHBtID09IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVl OworCQkJCWlmIChwbSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VS X0FERFJFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOwor CQkJCWlmIChwdGVfaXNfdmFsaWQocHRlcCkpCisJCQkJCXByaW50ZigiJXg6JXggIiwgdmEsICoo aW50ICopcHRlcCk7CisJCQl9CisKK30KKwordm9pZAorcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3Qg cGEpCit7CisJcmVnaXN0ZXIgcHZfZW50cnlfdCBwdjsKKwl2bV9wYWdlX3QgbTsKKworCXByaW50 ZigicGEgJXgiLCBwYSk7CisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJZm9yIChwdiA9IFRB SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbGlzdCkpIHsKKwkJcHJpbnRmKCIgLT4gcG1hcCAlcCwgdmEgJXgiLCAodm9pZCAqKXB2LT5w dl9wbWFwLCBwdi0+cHZfdmEpOworCQlwYWRzKHB2LT5wdl9wbWFwKTsKKwl9CisJcHJpbnRmKCIg Iik7Cit9CisKKy8qIE4vQyAqLworI2VuZGlmCisKKworLyoKKyAqIEFsbG9jYXRlIFRMQiBhZGRy ZXNzIHNwYWNlIHRhZyAoY2FsbGVkIEFTSUQgb3IgVExCUElEKSBhbmQgcmV0dXJuIGl0LgorICog SXQgdGFrZXMgYWxtb3N0IGFzIG11Y2ggb3IgbW9yZSB0aW1lIHRvIHNlYXJjaCB0aGUgVExCIGZv ciBhCisgKiBzcGVjaWZpYyBBU0lEIGFuZCBmbHVzaCB0aG9zZSBlbnRyaWVzIGFzIGl0IGRvZXMg dG8gZmx1c2ggdGhlIGVudGlyZSBUTEIuCisgKiBUaGVyZWZvcmUsIHdoZW4gd2UgYWxsb2NhdGUg YSBuZXcgQVNJRCwgd2UganVzdCB0YWtlIHRoZSBuZXh0IG51bWJlci4gV2hlbgorICogd2UgcnVu IG91dCBvZiBudW1iZXJzLCB3ZSBmbHVzaCB0aGUgVExCLCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRp b24gY291bnQKKyAqIGFuZCBzdGFydCBvdmVyLiBBU0lEIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGtl cm5lbCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2FzaWRfYWxsb2MocG1hcCkKKwlwbWFw X3QgcG1hcDsKK3sKKwlpZiAocG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgIT0g UE1BUF9BU0lEX1JFU0VSVkVEICYmCisJICAgIHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQp XS5nZW4gPT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSk7CisJZWxzZSB7CisJCWlmIChQQ1BV X0dFVChuZXh0X2FzaWQpID09IHBtYXBfbWF4X2FzaWQpIHsKKwkJCXRsYl9pbnZhbGlkYXRlX2Fs bF91c2VyKE5VTEwpOworCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLAorCQkJICAgIChQQ1BV X0dFVChhc2lkX2dlbmVyYXRpb24pICsgMSkgJiBBU0lER0VOX01BU0spOworCQkJaWYgKFBDUFVf R0VUKGFzaWRfZ2VuZXJhdGlvbikgPT0gMCkgeworCQkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlv biwgMSk7CisJCQl9CisJCQlQQ1BVX1NFVChuZXh0X2FzaWQsIDEpOwkvKiAwIG1lYW5zIGludmFs aWQgKi8KKwkJfQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCA9IFBDUFVf R0VUKG5leHRfYXNpZCk7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSBQ Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pOworCQlQQ1BVX1NFVChuZXh0X2FzaWQsIFBDUFVfR0VU KG5leHRfYXNpZCkgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyBwdF9lbnRyeV90Citpbml0X3B0ZV9w cm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlw dF9lbnRyeV90IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BST1RfV1JJVEUpKQorCQlydyA9IFBU RV9WQUxJRCB8IFBURV9STzsKKwllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkg PT0gMCkgeworCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisJCQlydyA9IFBU RV9WQUxJRCB8IFBURV9EOworCQllbHNlCisJCQlydyA9IFBURV9WQUxJRDsKKwl9IGVsc2Ugewor CQkvKgorCQkgKiBOZWVkbid0IGVtdWxhdGUgYSByZWZlcmVuY2UvbW9kaWZpZWQgYml0IGZvciB1 bm1hbmFnZWQKKwkJICogcGFnZXMuCisJCSAqLworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwor CQlwdGVfcmVmX3NldCgmcncpOworCX0KKworCXJldHVybiAocncpOworfQorCisvKgorICogcG1h cF9lbXVsYXRlX21vZGlmaWVkIDogZG8gZGlydHkgYml0IGVtdWxhdGlvbgorICoKKyAqIE9uIFNN UCwgdXBkYXRlIGp1c3QgdGhlIGxvY2FsIFRMQiwgb3RoZXIgQ1BVcyB3aWxsIHVwZGF0ZSB0aGVp cgorICogVExCcyBmcm9tIFBURSBsYXppbHksIGlmIHRoZXkgZ2V0IHRoZSBleGNlcHRpb24uCisg KiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNlc3MsIDEgaWYgdGhlIHBhZ2UgaXMgcmVhZCBvbmx5 IGFuZCB3ZQorICogbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfbW9kaWZp ZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlw dF9lbnRyeV90ICpwdGU7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1h cCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCXB0ZSA9IChwdF9lbnRy eV90ICopcGRlOworCWVsc2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlm IChwdGUgPT0gTlVMTCkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu ZCBQVEUiKTsKKyNpZmRlZiBTTVAKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg Q1BVIGNoYW5nZWQgbS1iaXQgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0 KHB0ZSwgUFRFX0QpKSB7CisJCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZQorCWlmICghcHRlX2lzX3ZhbGlk KHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwg KnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgor CWlmIChwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJl dHVybiAoMSk7CisJfQorCXB0ZV9hdG9taWNfc2V0KHB0ZSwgUFRFX0QpOyAvKiBtYXJrIGl0IHJl ZmVyZW5jZWQgYW5kIG1vZGlmaWVkICovCisJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7CisJdGxi X3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VE KSkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogdW5tYW5hZ2VkIHBhZ2UiKTsKKwlQ TUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcG1hcF9lbXVsYXRl X3JlZmVyZW5jZWQ6IGRvIHJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisgKgorICogUmV0dXJucyAw IGluIGNhc2Ugb2Ygc3VjY2Vzcy4gIFJldHVybnMgMSBpZiB3ZSBuZWVkIHRvIGZhdWx0LgorICov CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKQorCQlyZXR1cm4gKDEpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gTlVMTCkg eworCQkvKiBJbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQor CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilw ZGU7CisJfSBlbHNlCisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRl ID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIHRhYmxlLiAqLworCQlnb3RvIGRvZmF1bHQ7 CisJfQorCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJLyogSW52YWxpZCBQVEUuICovCisJ CWdvdG8gZG9mYXVsdDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGFscmVhZHkgbWFya2VkIGJ5 IG90aGVyIENQVS4gICovCisJaWYgKCFwdGVfaXNfcmVmKHB0ZSkpCisJCXB0ZV9yZWZfYXRvbWlj X3NldChwdGUpOworCisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJUE1BUF9VTkxPQ0so cG1hcCk7CisKKwlyZXR1cm4gKDApOworCitkb2ZhdWx0OgorCVBNQVBfVU5MT0NLKHBtYXApOwor CXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSkK K3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3IgKHB2ID0gVEFJ TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbmV4dCkpIHsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwg UEFHRV9TSVpFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcC5j IGIvc3lzL21pcHMvbWlwcy9wbWFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9wbWFwLmMKKysrIGIv c3lzL21pcHMvbWlwcy9wbWFwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJv Yy5oPgogI2luY2x1ZGUgPHN5cy9yd2xvY2suaD4KICNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNp bmNsdWRlIDxzeXMvX3R5cGVzLmg+CiAjaWZkZWYgU01QCiAjaW5jbHVkZSA8c3lzL3NtcC5oPgog I2Vsc2UKQEAgLTIzMiw3ICsyMzMsNyBAQAogCXN5c20gPSAmc3lzbWFwX2xtZW1bY3B1XTsKIAlz eXNtLT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YSA9IHN5c20tPmJhc2U7Ci0JbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRF X1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAkqcHRl ID0gbnB0ZTsKIAlzeXNtLT52YWxpZDEgPSAxOwpAQCAtMjU0LDEwICsyNTUsMTAgQEAKIAlzeXNt LT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YTEgPSBzeXNtLT5iYXNlOwogCXZhMiA9IHN5c20tPmJh c2UgKyBQQUdFX1NJWkU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19D QUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBo eXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdmExKTsKIAkqcHRlID0gbnB0ZTsKLQlucHRlID0gVExCTE9f UEFfVE9fUEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBU RV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YTIpOwogCSpw dGUgPSBucHRlOwogCXN5c20tPnZhbGlkMSA9IDE7CkBAIC01NTYsOSArNTU3LDE1IEBACiAJbXNn YnVmaW5pdChtc2didWZwLCBtc2didWZzaXplKTsKIAogCS8qCi0JICogU3RlYWwgdGhyZWFkMCBr c3RhY2suCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2suICBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKiBYWFggVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSBv ZiBnZXR0aW5nIGFsaWduZWQgbWVtb3J5CisJICogd2l0aCBwbWFwX3N0ZWFsX21lbW9yeSgpLgog CSAqLwotCWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9T SElGVCk7CisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgKyBLU1RB Q0tfR1VBUkRfUEFHRVMpIFwKKwkJCQkJPDwgUEFHRV9TSElGVCk7CisJa3N0YWNrMCA9IHJvdW5k dXAyKGtzdGFjazAsIChLU1RBQ0tfUEFHRV9TSVpFICogMikpOwogCiAJdmlydHVhbF9hdmFpbCA9 IFZNX01JTl9LRVJORUxfQUREUkVTUzsKIAl2aXJ0dWFsX2VuZCA9IFZNX01BWF9LRVJORUxfQURE UkVTUzsKQEAgLTYwNSw2ICs2MTIsNyBAQAogCiAJVEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7 CiAJbS0+bWQucHZfZmxhZ3MgPSAwOworCW0tPm1kLnB2X21lbWF0dHIgPSBWTV9NRU1BVFRSX0RF RkFVTFQ7CiB9CiAKIC8qCkBAIC04MDEsNyArODA5LDcgQEAKIAlwdGVwID0gcG1hcF9wdGUocG1h cCwgdmEpOwogCWlmIChwdGVwICE9IE5VTEwpIHsKIAkJcHRlID0gKnB0ZXA7Ci0JCWlmIChwdGVf dGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CisJCWlmIChw dGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpICYmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAog CQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgewogCQkJcHRlX3BhID0gVExCTE9f UFRFX1RPX1BBKHB0ZSk7CiAJCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcHRlX3Bh LCAmcGEpKQpAQCAtODM0LDkgKzg0Miw5IEBACiAKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdmEpOwogCW9wdGUgPSAqcHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0 ciB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8 IGF0dHIgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCSpwdGUgPSBucHRlOwotCWlmIChw dGVfdGVzdCgmb3B0ZSwgUFRFX1YpICYmIG9wdGUgIT0gbnB0ZSkKKwlpZiAocHRlX3Rlc3QoJm9w dGUsIFBURV9WQUxJRCkgJiYgb3B0ZSAhPSBucHRlKQogCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5l bF9wbWFwLCB2YSwgbnB0ZSk7CiB9CiAKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCQkJaWYgKG0t Pm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQ R0FfUkVGRVJFTkNFRCk7CiAJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX1JFRjsKLQkJ CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJCQlUQUlMUV9S RU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJTFFfRU1QVFko Jm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFC TEUpOwogCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBiaXQ7CkBAIC0xNjI3LDkgKzE2 MzUsOSBAQAogCXB2X2VudHJ5X3QgcHY7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkg eworCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKHBt YXAgPT0gUFZfUE1BUChwdikgJiYgdmEgPT0gcHYtPnB2X3ZhKSB7Ci0JCQlUQUlMUV9SRU1PVkUo JnB2aC0+cHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xp c3QsIHB2LCBwdl9uZXh0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTY3MSw3ICsxNjc5LDcg QEAKIAlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAlpZiAoKHB2ID0gZ2V0X3B2 X2VudHJ5KHBtYXAsIFRSVUUpKSAhPSBOVUxMKSB7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQlyZXR1cm4gKFRSVUUpOwog CX0gZWxzZQogCQlyZXR1cm4gKEZBTFNFKTsKQEAgLTE3NDQsNyArMTc1Miw3IEBACiAJLyoKIAkg KiBJZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRoaXMgYWRkcmVzcywganVzdCBza2lwIGl0IQogCSAq LwotCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVikpCisJaWYgKCFwdGVfdGVzdChwdHEsIFBURV9W QUxJRCkpCiAJCXJldHVybjsKIAogCSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZh LCAqcGRlKTsKQEAgLTE4MTAsNyArMTgxOCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJ CSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7 CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2YSAhPSB2YV9u ZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKIAkJCQkJ dmEgPSB2YV9uZXh0OwpAQCAtMTg2OCw3ICsxODc2LDcgQEAKIAkJICogSWYgaXQncyBsYXN0IG1h cHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKIAkJICogdGhlIHBhZ2UgYmVpbmcgZGVz dHJveWVkCiAJIAkgKi8KLQkJaWYgKFRBSUxRX05FWFQocHYsIHB2X2xpc3QpID09IE5VTEwpCisJ CWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBOVUxMKQogCQkJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCiAJCXBtYXAtPnBtX3N0YXRz LnJlc2lkZW50X2NvdW50LS07CkBAIC0xODk3LDcgKzE5MDUsNyBAQAogCQl9CiAJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CiAKLQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOwogCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSk7CiAJCWZy ZWVfcHZfZW50cnkocG1hcCwgcHYpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKQEAgLTE5NTksNyAr MTk2Nyw3IEBACiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9 IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewogCQkJcGJpdHMgPSAq cHRlOwotCQkJaWYgKCFwdGVfdGVzdCgmcGJpdHMsIFBURV9WKSB8fCBwdGVfdGVzdCgmcGJpdHMs CisJCQlpZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdCgmcGJpdHMs CiAJCQkgICAgUFRFX1JPKSkgewogCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKQEAgLTIwNzEsNyArMjA3OSw3IEBACiAJ LyoKIAkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwgbXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdp cmluZyBjaGFuZ2UuCiAJICovCi0JaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikgJiYgb3Bh ID09IHBhKSB7CisJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQpICYmIG9wYSA9PSBw YSkgewogCQkvKgogCQkgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0cy4gV2UgZG9u J3Qgd29ycnkgYWJvdXQKIAkJICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lk ZW50IGFzIGxvbmcgYXMgdGhlcmUKQEAgLTIxMzUsNyArMjE0Myw3IEBACiAJCWlmIChwdiA9PSBO VUxMKQogCQkJcHYgPSBnZXRfcHZfZW50cnkocG1hcCwgRkFMU0UpOwogCQlwdi0+cHZfdmEgPSB2 YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJbmV3cHRl IHw9IFBURV9NQU5BR0VEOwogCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9STykpCiAJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKQEAgLTIxNjAsNyArMjE2OCw3IEBA CiAJICovCiAJaWYgKG9yaWdwdGUgIT0gbmV3cHRlKSB7CiAJCSpwdGUgPSBuZXdwdGU7Ci0JCWlm IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1ZBTElEKSkgewogCQkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkgJiYg b3BhICE9IHBhKSB7CiAJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKIAkJ CQkJdm1fcGFnZV9hZmxhZ19zZXQob20sIFBHQV9SRUZFUkVOQ0VEKTsKQEAgLTIyNjgsNyArMjI3 Niw3IEBACiAJfQogCiAJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOwotCWlmIChwdGVfdGVzdChw dGUsIFBURV9WKSkgeworCWlmIChwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpIHsKIAkJaWYgKG1w dGUgIT0gTlVMTCkgewogCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwogCQkJbXB0ZSA9IE5VTEw7CkBA IC0yMjk4LDcgKzIzMDYsNyBAQAogCS8qCiAJICogTm93IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBS TyBwcm90ZWN0aW9uCiAJICovCi0JKnB0ZSA9IFBURV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkg fCBQVEVfVjsKKwkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJ RDsKIAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApCiAJCSpwdGUgfD0gUFRF X01BTkFHRUQ7CiAKQEAgLTIzNTYsNyArMjM2NCw3IEBACiAJCWNwdSA9IFBDUFVfR0VUKGNwdWlk KTsKIAkJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCQkvKiBTaW5jZSB0aGlzIGlzIGZvciB0 aGUgZGVidWdnZXIsIG5vIGxvY2tzIG9yIGFueSBvdGhlciBmdW4gKi8KLQkJbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwYSkgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfAorCQlucHRlID0g VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfAog CQkgICAgUFRFX0c7CiAJCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCBzeXNtLT5iYXNlKTsK IAkJKnB0ZSA9IG5wdGU7CkBAIC0yNDg0LDcgKzI0OTIsNyBAQAogCQkJdmFfbmV4dCA9IGV2YTsK IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwg UFRFX1YpKQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJY29udGludWU7 CiAJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQogCQkJCXBhbmljKCJwbWFwX3Vud2lyZTog cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI3MTksNyArMjcyNyw3IEBACiAJICAgICgi cG1hcF9wYWdlX2V4aXN0c19xdWljazogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKIAly diA9IEZBTFNFOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKIAkJCXJ2 ID0gVFJVRTsKIAkJCWJyZWFrOwpAQCAtMjc3Miw3ICsyNzgwLDcgQEAKIAkJCQlLQVNTRVJUKHBk ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKIAkJCQkgICAgKCJwbWFwX3JlbW92ZV9wYWdlczogcGRl IikpOwogCQkJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7Ci0JCQkJaWYg KCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElE KSkKIAkJCQkJcGFuaWMoInBtYXBfcmVtb3ZlX3BhZ2VzOiBiYWQgcHRlIik7CiAJCQkJdHB0ZSA9 ICpwdGU7CiAKQEAgLTI4MDIsNyArMjgxMCw3IEBACiAJCQkJcHZfZW50cnlfY291bnQtLTsKIAkJ CQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNrOwogCQkJCXBtYXAtPnBtX3N0YXRzLnJlc2lk ZW50X2NvdW50LS07Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlz dCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCQkJ aWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJCQkJdm1fcGFnZV9hZmxhZ19jbGVh cihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwg KnBkZSk7CkBAIC0yODMzLDcgKzI4NDEsNyBAQAogCQlyZXR1cm4gKHJ2KTsKIAogCXJ3X2Fzc2Vy dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VEKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+ bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0 LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwog CQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg2Myw3ICsyODcxLDcgQEAK IAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCiAJCXJldHVybiAoY291bnQp OwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5t ZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3Qs IHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJ CXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODk3LDExICsyOTA1LDExIEBA CiAJaWYgKCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUp ID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYs ICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1B UF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwotCQlLQVNT RVJUKHB0ZSAhPSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1YpLAorCQlLQVNTRVJUKHB0ZSAh PSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKIAkJICAgICgicGFnZSBvbiBwdl9s aXN0IGhhcyBubyBwdGUiKSk7CiAJCXBiaXRzID0gKnB0ZTsKIAkJaWYgKHB0ZV90ZXN0KCZwYml0 cywgUFRFX0QpKSB7CkBAIC0zMDQwLDcgKzMwNDgsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZv ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr LAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9N QU5BR0VEIHwgUFRFX1YpKSB7CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQgfCBQ VEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlk YXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25leHQ7CkBAIC0zMTA2LDcg KzMxMTQsNyBAQAogCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKIAkJcmV0 dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZt LT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7 CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0zMjA4LDcgKzMyMTYsNyBA QAogcmV0cnk6CiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIGFkZHIpOwogCXB0ZSA9IChwdGVwICE9 IE5VTEwpID8gKnB0ZXAgOiAwOwotCWlmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKSB7CisJaWYg KCFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKSB7CiAJCXZhbCA9IDA7CiAJCWdvdG8gb3V0Owog CX0KQEAgLTMzNDUsNyArMzM1Myw3IEBACiAjZW5kaWYKIAkJCWZvciAoayA9IDA7IGsgPCBOUFRF UEc7IGsrKykgewogCQkJCXB0ZSA9IHBkZVtrXTsKLQkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90 ZXN0KCZwdGUsIFBURV9WKSkKKwkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90ZXN0KCZwdGUsIFBU RV9WQUxJRCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7 CiAJCQkJdmEgPSAoKHVfbG9uZylpIDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChr IDw8IFBBR0VfU0hJRlQpOwpAQCAtMzM5MywxNSArMzQwMSwxNSBAQAogCXB0X2VudHJ5X3Qgcnc7 CiAKIAlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCi0JCXJ3ID0gUFRFX1YgfCBQVEVfUk87 CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX1JPOwogCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9f VU5NQU5BR0VEKSA9PSAwKSB7CiAJCWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK LQkJCXJ3ID0gUFRFX1YgfCBQVEVfRDsKKwkJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJCWVs c2UKLQkJCXJ3ID0gUFRFX1Y7CisJCQlydyA9IFBURV9WQUxJRDsKIAl9IGVsc2UKIAkJLyogTmVl ZG4ndCBlbXVsYXRlIGEgbW9kaWZpZWQgYml0IGZvciB1bm1hbmFnZWQgcGFnZXMuICovCi0JCXJ3 ID0gUFRFX1YgfCBQVEVfRDsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAlyZXR1cm4gKHJ3 KTsKIH0KIApAQCAtMzQyNCwxMyArMzQzMiwxMyBAQAogCQlwYW5pYygicG1hcF9lbXVsYXRlX21v ZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwogI2lmZGVmIFNNUAogCS8qIEl0IGlzIHBvc3NpYmxl IHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdlZCBtLWJpdCAqLwotCWlmICghcHRlX3Rlc3QocHRl LCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwg UFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgewogCQl0bGJfdXBkYXRlKHBtYXAs IHZhLCAqcHRlKTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CiAJCXJldHVybiAoMCk7CiAJfQogI2Vs c2UKLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQor CWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQog CQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBpbnZhbGlkIHB0ZSIpOwogI2VuZGlmCiAJ aWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewpAQCAtMzQ0Niw2ICszNDU0LDE4IEBACiB9CiAK IC8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZAorICoKKyAqIFJlZmVyZW5jZSBiaXQgZW11 bGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbWFwIGltcGxlbWVudGF0aW9uLgorICov CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSkKK3sKKworCQlyZXR1cm4gKDEpOworfQorCisvKgogICoJUm91dGluZToJcG1hcF9rZXh0cmFj dAogICoJRnVuY3Rpb246CiAgKgkJRXh0cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFz c29jaWF0ZWQKQEAgLTM1MjIsMTcgKzM1NDIsMjYgQEAKIAogCWlmIChtICE9IE5VTEwpIHsKIAkJ Zm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9IFRB SUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25l eHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0Vf U0laRSk7CiAJCX0KIAl9CiB9CiAKKy8qCisgKiBTZXRzIHRoZSBtZW1vcnkgYXR0cmlidXRlIGZv ciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KIHZvaWQKIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2 bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQogewogCiAJLyoKKwkgKiBTZXQgdGhlIG1lbWF0 dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkgKiBQVEUg YXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9IG1hOwor CisJLyoKIAkgKiBJdCBhcHBlYXJzIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxs ZWQgYmVmb3JlIGFueSBtYXBwaW5ncwogCSAqIGZvciB0aGUgcGFnZSBhcmUgZXN0YWJsaXNoZWQu ICBJZiB0aGlzIGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKIAkgKiBuZWVkIHRvIHdhbGsg dGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKZGlmZiAt LWdpdCBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9t aW5pZHVtcF9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMK KysrIGIvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMKQEAgLTE3OSw3ICsxNzksNyBA QAogCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCQlLQVNTRVJUKHB0ZSAhPSBO VUxMLCAoInB0ZSBmb3IgJWp4IGlzIE5VTEwiLCAodWludG1heF90KXZhKSk7CiAJCWZvciAoaSA9 IDA7IGkgPCBOUFRFUEc7IGkrKykgewotCQkJaWYgKHB0ZV90ZXN0KCZwdGVbaV0sIFBURV9WKSkg eworCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlW2ldKSkgewogCQkJCXBhID0gVExCTE9fUFRFX1RP X1BBKHB0ZVtpXSk7CiAJCQkJaWYgKGlzX2R1bXBhYmxlKHBhKSkKIAkJCQkJZHVtcF9hZGRfcGFn ZShwYSk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYyBiL3N5cy9taXBzL21p cHMvbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jCisrKyBiL3N5cy9taXBz L21pcHMvbWFjaGRlcC5jCkBAIC0yODMsOSArMjgzLDkgQEAKICNlbmRpZgogCXByb2NfbGlua3Vw MCgmcHJvYzAsICZ0aHJlYWQwKTsKIAotCUtBU1NFUlQoKGtzdGFjazAgJiBQQUdFX01BU0spID09 IDAsCi0JCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnk6IDB4JTBs eCIsCi0JCShsb25nKWtzdGFjazApKTsKKwlLQVNTRVJUKChrc3RhY2swICYgKChLU1RBQ0tfUEFH RV9TSVpFICogMikgLSAxKSkgPT0gMCwKKwkJKCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEg cGFnZSAoMHglMGx4KSBib3VuZGFyeTogMHglMGx4IiwKKwkJKGxvbmcpKEtTVEFDS19QQUdFX1NJ WkUgKiAyKSwgKGxvbmcpa3N0YWNrMCkpOwogCXRocmVhZDAudGRfa3N0YWNrID0ga3N0YWNrMDsK IAl0aHJlYWQwLnRkX2tzdGFja19wYWdlcyA9IEtTVEFDS19QQUdFUzsKIAkvKiAKQEAgLTQ1OSw3 ICs0NTksNyBAQAogCSAqIFdlIHVzZSBhIHdpcmVkIHRsYiBpbmRleCB0byBkbyB0aGlzIG9uZS10 aW1lIG1hcHBpbmcuCiAJICovCiAJcGEgPSB2dG9waHlzKHBjcHUpOwotCXB0ZSA9IFBURV9EIHwg UFRFX1YgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOworCXB0ZSA9IFBURV9EIHwgUFRFX1ZBTElEIHwg UFRFX1JFRiB8IFBURV9HIHwgUFRFX0NfQ0FDSEU7CiAJdGxiX2luc2VydF93aXJlZChQQ1BVX1RM Ql9FTlRSWSwgKHZtX29mZnNldF90KXBjcHVwLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSkgfCBw dGUsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhICsgUEFHRV9TSVpFKSB8IHB0ZSk7CmRpZmYgLS1n aXQgYS9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMK LS0tIGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCisrKyBiL3N5cy9taXBzL21pcHMvZ2VuYXNz eW0uYwpAQCAtMTAyLDYgKzEwMiw5IEBACiBBU1NZTShUREZfQVNUUEVORElORywgVERGX0FTVFBF TkRJTkcpOwogQVNTWU0oTUFYQ09NTEVOLCBNQVhDT01MRU4pOwogQVNTWU0oTURURF9DT1AyVVNF RCwgTURURF9DT1AyVVNFRCk7CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKK0FTU1lNKEtTVEFD S19UTEJNQVNLX01BU0ssIEtTVEFDS19UTEJNQVNLX01BU0spOworI2VuZGlmCiAKIEFTU1lNKE1J UFNfS1NFRzBfU1RBUlQsIE1JUFNfS1NFRzBfU1RBUlQpOwogQVNTWU0oTUlQU19LU0VHMV9TVEFS VCwgTUlQU19LU0VHMV9TVEFSVCk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2V4Y2VwdGlv bi5TIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwotLS0gYS9zeXMvbWlwcy9taXBzL2V4Y2Vw dGlvbi5TCisrKyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKQEAgLTg1LDYgKzg1LDI4IEBA CiAgKi8KICNkZWZpbmUJSU5UUkNOVF9DT1VOVAkyNTYKIAorLyoKKyAqIEdlbmVyYWwgTUlQUyBD UFUgc3RhdGUgZm9yIGV4Y2VwdGlvbnM6CisgKgorICogRVBDIFJlZ2lzdGVyIHdpbGwgcG9pbnQg dG8gdGhlIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIGZhdWx0LCB1bmxlc3MgdGhlCisgKiBmYXVs dGluZyBpbnN0cnVjdGlvbiB3YXMgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4gIEluIHRoYXQgY2Fz ZSwgaXQgd2lsbAorICogcG9pbnQgdG8gdGhlIGJyYW5jaCBiZWZvcmUgdGhlIGJyYW5jaCBkZWxh eSBzbG90IGluc3RydWN0aW9uLgorICoKKyAqIFRoZSBjYXVzZSByZWdpc3RlciB3aWxsIGNvbnRh aW4gd2hhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiBhbmQgc29tZSBzdGF0ZQorICogYWJvdXQgdGhl IGludGVycnVwdC4KKyAqCisgKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNvbnRhaW5zIGluZm9ybWF0 aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIENQVSBzdWNoCisgKiBhczogS2VybmVsL1VzZXIg bW9kZSBiaXQsIGludGVycnVwdCBlbmFibGUgYml0LgorICoKKyAqIFRoZSBCYWRWYWRkciByZWdp c3RlciBjb250YWlucyB0aGUgdmlydHVhbCBhZGRyZXNzIHRoYXQgY2F1c2UgdGhlIGxhc3QKKyAq IGV4Y2VwdGlvbi4KKyAqCisgKiBUaGUgQ29udGV4dCByZWdpc3RlciBjb250YWlucyB0aGUgbG93 ZXIgMjIgYml0cyBvZiB0aGUgVlBOIChzdGFydGluZyBhdAorICogYml0IDQpIHRoYXQgY2F1c2Ug dGhlIGxhc3QgZXhjZXB0aW9uIGV4Y2VwdCBiaXQwIGFuZCBiaXQxIGFyZSB6ZXJvLiBUaGUKKyAq IHVwcGVyIGJpdHMgKGJpdHMgMjMgdG8gMzEgZm9yIE1JUFMzMiBhbmQgYml0cyAyMyB0byA2Mykg YXJlIHNldCB1bmRlcgorICoga2VybmVsIGNvbnRyb2wgKGkuZS4gcG9pbnQgdG8gdGhlIHBhZ2Ug dGFibGUpLiBUaGUgQ29udGV4dC9YQ29udGV4dAorICogcmVnaXN0ZXJzIGFyZSBub3QgY3VycmVu dGx5IHVzZWQgYnkgRnJlZUJTRC4KKyAqLwogCiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBA IC0xMTAsMTMgKzEzMiwyNyBAQAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIE1p cHNEb1RMQk1pc3MgLS0KKyAqIE1pcHNEb1RMQk1pc3MgLS0gIChVVExCIG1pc3MpCiAgKgotICog VGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuCisgKiBUaGlzIGlzIHRoZSBy ZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4gIEEgbWlzcyB3YXMgZ2VuZXJhdGVkIHdoZW4gdGhl CisgKiBhY2Nlc3MgaXMgdG8ga3VzZWcgYW5kIHRoZXJlIHdhcyBub3QgbWF0Y2hpbmcgbWFwcGlu ZyBsb2FkZWQgaW50byB0aGUgVExCLgogICogJ3NlZ2Jhc2UnIHBvaW50cyB0byB0aGUgYmFzZSBv ZiB0aGUgc2VnbWVudCB0YWJsZSBmb3IgdXNlciBwcm9jZXNzZXMuCiAgKgorICogVGhlIENQVSBk b2VzIHRoZSBmb2xsb3dpbmcgZm9yIGFuIFVUTEIgbWlzczoKKyAqIC0gU2V0cyB0aGUgRVBDIHJl Z2lzdGVyLgorICogLSBTZXRzIHRoZSBDYXVzZSByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgU3Rh dHVzIHJlZ2lzdGVyLiBTaGlmdHMgSy9VIGFuZCBJRSBiaXRzIG92ZXIgb25lIGFuZCBjbGVhcnMK KyAqICAgdGhlIGN1cnJlbnQgS2VybmVsL1VzZXIgYW5kIEludGVycnVwdCBFbmFibGUgYml0cy4g U28gdGhlIHByb2Nlc3NvcgorICogICBpcyBpbiBrZXJuZWwgbW9kZSB3aXRoIHRoZSBpbnRlcnVw dHMgdHVybmVkIG9mZi4KKyAqIC0gU2V0cyBCYWRWYWRkciByZWdpc3Rlci4KKyAqIC0gU2V0cyB0 aGUgQ29udGV4dC9YQ29udGV4dCByZWdpc3RlcihzKS4KKyAqIC0gU2V0cyB0aGUgVExCIEVudHJ5 SGkgcmVnaXN0ZXIgdG8gY29udGFpbiBWUE4gb2YgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCisgKgog ICogRG9uJ3QgY2hlY2sgZm9yIGludmFsaWQgcHRlJ3MgaGVyZS4gV2UgbG9hZCB0aGVtIGFzIHdl bGwgYW5kCiAgKiBsZXQgdGhlIHByb2Nlc3NvciB0cmFwIHRvIGxvYWQgdGhlIGNvcnJlY3QgdmFs dWUgYWZ0ZXIgc2VydmljZS4KKyAqCisgKiBYWFggVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgY2hh bmdlZCB0byBhIGxpbmVhciBwYWdlIHRhYmxlIGFuZCB1c2UgdGhlCisgKiBDb250ZXh0IGFuZCBY Q29udGV4dCByZWdpc3RlcnMuICBUaGF0IGlzIHJlYWxseSB3aGF0IGl0IHdhcyBkZXNpZ25lZCBm b3IuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogIAkuc2V0IHB1c2gKQEAgLTEzNywyNSAr MTczLDg5IEBACiAjaWZkZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBU UlNISUZUCQkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zm c2V0Ci0JUFRSX0FERFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJf TAkJazEsIDAoazEpCQkJIyBrMT1wZGUgZW50cnkKLQlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURf VkFERFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMg azE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkK IAliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKwlub3AKKworI2lm ZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBB R0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHpl cm8sIG5vdF9zdXBlcnBhZ2UJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAo azApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0 aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMSwgazAsIDAsIDEpCisK KwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhl IFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNf Q09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUg dGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8w KS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBw b3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJ CSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3 IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJp dHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NX QklUUyhrMSkJCQkJIyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09Q XzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRM QiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBh Z2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJ IyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0 byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N QVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0 dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9zdXBlcnBhZ2U6CisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCiAjZW5kaWYKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1i YWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkj MGI6IGswPVZQTiAoYWthIHZhPj4xMCkKIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjMGM6IGsw PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjMGQ6IGsxPXB0ZSBhZGRy ZXNzCi0JUFRFX0wJCWswLCAwKGsxKQkJCSMwZTogazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRF U0laRShrMSkJCQkjMGY6IGsxPWxvMCBwdGUKKworCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxv MCBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlkLgor CSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1bHQg bGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwganVz dCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9WQUxJ RF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMikKKwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRF X01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIzEyOiBsbzAgaXMgbG9hZGVkCiAJQ09QMF9T WU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf TE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkjIGsw PWxvMSBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlk LgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1 bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwg anVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9W QUxJRF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMykKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJ UFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCiAJQ09Q MF9TWU5DCiAJdGxid3IJCQkJCQkjMWE6IHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQogCWVy ZXQJCQkJCQkjMWY6IHJldFVybiBmcm9tIGV4Y2VwdGlvbgorCiAxOglqCQlNaXBzVExCTWlzc0V4 Y2VwdGlvbgkJIzIwOiBrZXJuZWwgZXhjZXB0aW9uCiAJbm9wCQkJCQkJIzIxOiBicmFuY2ggZGVs YXkgc2xvdAogMjoJagkJU2xvd0ZhdWx0CQkJIzIyOiBubyBwYWdlIHRhYmxlIHByZXNlbnQKQEAg LTI2NSw3ICszNjUsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lz dGVyIHN0YXRlLgorICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZSB3aGVuIHRha2lu ZyBhbiBleGNlcHRpb24gaW4ga2VybmVsIG1vZGUuCiAgKgogICogVGhpcyBpcyBzdHJhaWdodGZv cndhcmQgZXhjZXB0IGZvciBzYXZpbmcgdGhlIGV4Y2VwdGlvbiBwcm9ncmFtCiAgKiBjb3VudGVy LiBUaGUgZGRiIGJhY2t0cmFjZSBjb2RlIGxvb2tzIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24K QEAgLTQwNiw2ICs1MDYsNyBAQAogCVNBVkVfUkVHKGExLCBTUiwgc3ApCiAJUkVTVE9SRV9DUFUJ CQkjIHYwIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcy4KIAlzeW5jCisKIAllcmV0CiAJLnNl dAlhdAogRU5EKE1pcHNLZXJuR2VuRXhjZXB0aW9uKQpAQCAtODg0LDIxICs5ODUsNjAgQEAKIAlQ VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1wZGUgb2Zmc2V0IChhbG1vc3Qp CiAJYmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGRlIHRh YgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMD1wZGUgZW50cnkgYWRk cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCiAJLyogVmFsaWRhdGUg cGRlIHRhYmxlIHBvaW50ZXIuICAqLwogCWJlcXoJCWsxLCAzZgogCW5vcAorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90 X3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBk ZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCS8qIFZhbGlkYXRlIHBhZ2UgdGFibGUgZW50cnkuICAq LworCWFuZGkJCWsxLCBQVEVfVlIKKwliZXF6CQlrMSwgM2YKKwlub3AKKworCSMgVGhlIFBERSBp cyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxvMCByZWcu CisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8w CQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZOIGZvciB0 aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdFVF9PRERf MU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24KKworCSMg R2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1wZGUgZW50 cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZsYWcgYml0 cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMgTG9hZCBp dCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSMgQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ IyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCWIJCXRsYl9pbnNlcnRfZW50cnkKKwlub3AKKworbm90 X3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KICNlbmRpZgogCU1GQzAJCWswLCBN SVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlr MCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEVNQVNL CQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUg YWRkcmVzcwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPXRoaXMgUFRFCiAKIAkvKiBWYWxpZGF0 ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQlhbmRpCQlrMCwgUFRFX1YKKwlhbmRpCQlrMCwgUFRF X1ZSCiAJYmVxegkJazAsIDNmCiAJbm9wCiAKQEAgLTkwOCwyNSArMTA0OCwzMSBAQAogCW5vcAog CiAJUFRFX0wJCWswLCAwKGsxKQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkKKwogCUNMRUFSX1BU RV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lO QwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP MQorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQ VEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIAliCQl0bGJfaW5z ZXJ0X2VudHJ5CiAJbm9wCiAKIG9kZF9wYWdlOgogCVBURV9MCQlrMCwgLVBURVNJWkUoazEpCi0J UFRFX0wJCWsxLCAwKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwg TUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQ VEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQVEVfTAkJazAsIDAoazEpCisKKwlD TEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlD T1AwX1NZTkMKIAogdGxiX2luc2VydF9lbnRyeToKQEAgLTkzNiwxMSArMTA4MiwxNSBAQAogCWJs dHoJCWswLCB0bGJfaW5zZXJ0X3JhbmRvbQogCW5vcAogCXRsYndpCisJUFRFX01UQzAJemVybywg TUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCiB0bGJf aW5zZXJ0X3JhbmRvbToKIAl0bGJ3cgorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIApAQCAtMTA1NCwyMSArMTIwNCw2NyBA QAogI2lmZGVmIF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJ IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBU Ul9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAw KGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMgazE9cGRlIGVu dHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkKKworI2lmZGVm IE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0Vf SURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8s IG5vdF9rc3BnCQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMg azE9cGRlIGVudHJ5IChkZWxheSBzbG90KQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRp b24KKworCSMgVGhlIFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBp biB0aGUgVExCIGxvMCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwg TUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29t cHV0ZSB0aGUgUEZOIGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRM QiBsbzApLgorCUdFVF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4g UFRFIHBvc3Rpb24KKworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAo azApCQkJIyBrMD1wZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMg azA9aHcgVExCIGZsYWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdm bGcgYml0cworCSMgTG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9Q VEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNXIEJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQ U19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0 aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJ CSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdf TUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdy aXRlIHRvIHRsYgorCUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC X1BHX01BU0sJIyB6ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJ IyByZXR1cm4gZnJvbSBleGNlcHRpb24KKworbm90X2tzcGc6CisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCisKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk cmVzcyAoYWdhaW4pCiAgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09 MCAtLSBubyBwYWdlIHRhYmxlCiAjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBU RVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIyBrMD1wYWdlIHRhYiBv ZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUgYWRkcmVzcworCiAJUFRFX0wJ CWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkJCQkjIGsx PWxvMSBwdGUKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKIAlDTEVBUl9QVEVf U1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxv YWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1J UFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUo azEpCQkJIyBrMD1sbzEgcHRlCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWsw LCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndy CQkJCQkjIHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMv bWlwcy9jcHUuYyBiL3N5cy9taXBzL21pcHMvY3B1LmMKLS0tIGEvc3lzL21pcHMvbWlwcy9jcHUu YworKysgYi9zeXMvbWlwcy9taXBzL2NwdS5jCkBAIC0zMTMsNiArMzEzLDI1IEBACiAJY3B1aW5m by0+bDIuZGNfc2l6ZSA9IGNwdWluZm8tPmwyLmRjX2xpbmVzaXplCiAJICAgICogY3B1aW5mby0+ bDIuZGNfbnNldHMgKiBjcHVpbmZvLT5sMi5kY19ud2F5czsKICNlbmRpZgorCisJLyoKKwkgKiBQ cm9iZSBQYWdlTWFzayByZWdpc3RlciB0byBzZWUgd2hhdCBzaXplcyBvZiBwYWdlcyBhcmUgc3Vw cG9ydGVkCisJICogYnkgd3JpdGluZyBhbGwgb25lJ3MgYW5kIHRoZW4gcmVhZGluZyBpdCBiYWNr LgorCSAqLworCW1pcHNfd3JfcGFnZW1hc2sofjApOworCWNwdWluZm8tPnRsYl9wZ21hc2sgPSBt aXBzX3JkX3BhZ2VtYXNrKCk7CisJbWlwc193cl9wYWdlbWFzayhNSVBTM19QR01BU0tfNEspOwor CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlpZiAoKGNwdWluZm8tPnRsYl9wZ21hc2sgJiBN SVBTM19QR01BU0tfMTZLKSA9PSAwKQorCQlwYW5pYygiJXM6IDE2SyBzaXplZCBwYWdlcyBhcmUg bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q IEtTVEFDS19MQVJHRV9QQUdFICovCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJaWYgKChjcHVp bmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKSA9PSAwKQorCQlwYW5pYygiJXM6IDFN IHNpemVkIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1 bmNfXyk7CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCiB9CiAKIHZvaWQKQEAgLTM4OSw2 ICs0MDgsMzAgQEAKIAkJCXByaW50ZigiRml4ZWQgbWFwcGluZyIpOwogCQl9CiAJCXByaW50Zigi LCAlZCBlbnRyaWVzICIsIGNwdWluZm8udGxiX25lbnRyaWVzKTsKKwkJaWYgKGNwdWluZm8udGxi X3BnbWFzaykgeworCQkJcHJpbnRmKCIoIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYg TUlQUzNfUEdNQVNLX01BU0tYKQorCQkJCXByaW50ZigiMUsgIik7CisJCQlwcmludGYoIjRLICIp OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNkspCisJCQkJcHJp bnRmKCIxNksgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0 SykKKwkJCQlwcmludGYoIjY0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBT M19QR01BU0tfMjU2SykKKwkJCQlwcmludGYoIjI1NksgIik7CisJCQlpZiAoY3B1aW5mby50bGJf cGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKQorCQkJCXByaW50ZigiMU0gIik7CisJCQlpZiAoY3B1 aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzRNKQorCQkJCXByaW50ZigiNE0gIik7CisJ CQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2TSkKKwkJCQlwcmludGYo IjE2TSAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRNKQor CQkJCXByaW50ZigiNjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18yNTZNKQorCQkJCXByaW50ZigiMjU2TSAiKTsKKwkJCXByaW50ZigicGcgc2l6ZXMpIik7 CisJCX0KKwkJcHJpbnRmKCJcbiIpOwogCX0KIAogCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsK ZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVk ZS92bXBhcmFtLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmgKKysrIGIvc3lzL21p cHMvaW5jbHVkZS92bXBhcmFtLmgKQEAgLTEwMCwxNSArMTAwLDQ3IEBACiAjZGVmaW5lCUZSRUVC U0QzMl9VU1JTVEFDSwkoKCh2bV9vZmZzZXRfdCkweDgwMDAwMDAwKSAtIFBBR0VfU0laRSkKICNl bmRpZgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCiAvKgotICogRGlzYWJsZSBzdXBlcnBhZ2Ug cmVzZXJ2YXRpb25zLiAobm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAotICogSSBjb3BpZWQgaXQg ZnJvbSBBUk0pCisgKiBFbmFibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9uczogMSBsZXZlbC4KKyAq CisgKiBWTV9OUkVTRVJWTEVWRUwgc3BlY2lmaWVzIGEgbnVtYmVyIG9mIHByb21vdGlvbiBsZXZl bHMgZW5hYmxlZC4KKyAqIEN1cnJlbnRseSBtaXBzNjQgb25seSBzdXBwb3J0cyBvbmUgc2l6ZSBv ciBsZXZlbCAoVk1fTEVWRUxfMF9PUkRFUikgb2YKKyAqIHN1cGVycGFnZXMgKDJNQikKKyAqLwor I2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKKyNkZWZpbmUJVk1fTlJFU0VSVkxFVkVMCQkJMQorI2Vu ZGlmCisKKy8qCisgKiBMZXZlbCAwIHJlc2VydmF0aW9ucyBjb25zaXN0IG9mIDUxMiAoMl45KSBw YWdlcyAoMk1CKS4KKyAqLworI2lmbmRlZglWTV9MRVZFTF8wX09SREVSCisjZGVmaW5lCVZNX0xF VkVMXzBfT1JERVIJCTkKKyNlbmRpZgorCisvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBz aXplIGlzIDRNQi4KKyAqLworI2RlZmluZQlWTV9ORlJFRU9SREVSCQkJMTEKKworI2Vsc2UgLyog ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworLyoKKyAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0 aW9ucy4KICAqLwogI2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKICNkZWZpbmUJVk1fTlJFU0VSVkxF VkVMCQkwCiAjZW5kaWYKIAogLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAx TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQorCisjZW5kaWYgLyogISBNSVBTNjRf TkVXX1BNQVAgKi8KKworLyoKICAqIEhvdyBtYW55IHBoeXNpY2FsIHBhZ2VzIHBlciBrbWVtIGFy ZW5hIHZpcnR1YWwgcGFnZS4KICAqLwogI2lmbmRlZiBWTV9LTUVNX1NJWkVfU0NBTEUKQEAgLTE3 NywxMSArMjA5LDYgQEAKICNkZWZpbmUJVk1fTE9XTUVNX0JPVU5EQVJZCSgodm1fcGFkZHJfdCkw eDIwMDAwMDAwKQogI2VuZGlmCiAKLS8qCi0gKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUg aXMgMU1CLgotICovCi0jZGVmaW5lCVZNX05GUkVFT1JERVIJCTkKLQogI2RlZmluZQlaRVJPX1JF R0lPTl9TSVpFCSg2NCAqIDEwMjQpCS8qIDY0S0IgKi8KIAogI2lmbmRlZiBfX21pcHNfbjY0CmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUu aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcHRl LmgKQEAgLTI5LDYgKzI5LDEwIEBACiAjaWZuZGVmCV9NQUNISU5FX1BURV9IXwogI2RlZmluZQlf TUFDSElORV9QVEVfSF8KIAorI2lmICFkZWZpbmVkKF9LRVJORUwpCisjaW5jbHVkZSA8bWFjaGlu ZS9wYXJhbS5oPgorI2VuZGlmCisKICNpZm5kZWYgX0xPQ09SRQogI2lmIGRlZmluZWQoX19taXBz X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCiB0eXBl ZGVmCXVpbnQ2NF90IHB0X2VudHJ5X3Q7CkBAIC03MiwyMiArNzYsMjUgQEAKICAqIE5PVEU6IFRo aXMgbWVhbnMgdGhhdCBmb3IgMzItYml0IHVzZSBvZiBDUDAsIHdlIGFyZW4ndCBhYmxlIHRvIHNl dCB0aGUgdG9wCiAgKiBiaXQgb2YgUEZOIHRvIGEgbm9uLXplcm8gdmFsdWUsIGFzIHNvZnR3YXJl IGlzIHVzaW5nIGl0ISAgVGhpcyBwaHlzaWNhbAogICogbWVtb3J5IHNpemUgbGltaXQgbWF5IG5v dCBiZSBzdWZmaWNpZW50bHkgZW5mb3JjZWQgZWxzZXdoZXJlLgorICoKKyAqIFhYWFJXOiBPbiBD SEVSSSwgYml0cyA2MyBhbmQgNjIgYXJlIHVzZWQgZm9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMg dGhhdAorICogcHJldmVudCBsb2FkaW5nIGFuZCBzdG9yaW5nIG9mIGNhcGFiaWxpdGllcywgc28g d2UgaGF2ZSByZWR1Y2VkIHRoZSA1NS1iaXQKKyAqIHNoaWZ0IHRvIDUzIGJpdHMuCiAgKi8KICNp ZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERS XzY0X0JJVCAqLwotI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDU1KQotI2RlZmluZQlUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDkpCi0jZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweDNGRkZG RkZDMFVMTAorI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDUzKQkJLyogWFhYUlc6IFdhcyA1 NS4gKi8KKyNkZWZpbmUJVExCTE9fUkVGX0JJVF9TSElGVAkoNjEpCisjZGVmaW5lCVRMQkxPX1NX QklUU19DTEVBUl9TSElGVAkoMTEpCS8qIFhYWFNTOiBXYXMgOS4gKi8KKyNkZWZpbmUJVExCTE9f UEZOX01BU0sJCTB4RkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCXzFNX1NVUEVSUEFHRV9TSElGVAko UERSU0hJRlQpCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDdGIDw8 IFRMQkxPX1NXQklUU19TSElGVCkKICNlbHNlCiAjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAko MjkpCiAjZGVmaW5lCVRMQkxPX1NXQklUU19DTEVBUl9TSElGVAkoMykKICNkZWZpbmUJVExCTE9f UEZOX01BU0sJCSgweDFGRkZGRkMwKQorI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2Vu dHJ5X3QpMHg3IDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNlbmRpZgogI2RlZmluZQlUTEJMT19Q Rk5fU0hJRlQJCSg2KQotI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3 IDw8IFRMQkxPX1NXQklUU19TSElGVCkKLSNkZWZpbmUJVExCTE9fUEFfVE9fUEZOKHBhKQkoKCgo cGEpID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExCTE9fUEZOX01B U0spCi0jZGVmaW5lCVRMQkxPX1BGTl9UT19QQShwZm4pCSgodm1fcGFkZHJfdCkoKHBmbikgPj4g VExCTE9fUEZOX1NISUZUKSA8PCBUTEJfUEFHRV9TSElGVCkKLSNkZWZpbmUJVExCTE9fUFRFX1RP X1BGTihwdGUpCSgocHRlKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QVEVfVE9f UEEocHRlKQkoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0ZSkpKSkKIAogLyoK ICAqIFhYWCBUaGlzIGNvbW1lbnQgaXMgbm90IGNvcnJlY3QgZm9yIGFueXRoaW5nIG1vcmUgbW9k ZXJuIHRoYW4gUjRLLgpAQCAtMTIxLDI1ICsxMjgsODMgQEAKICNlbmRpZiAvKiBkZWZpbmVkKF9f bWlwc19uNjQpICovCiAKIC8qCisgKiBQVEUgSGFyZHdhcmUgQml0cyAoRW50cnlMbzAtMSByZWdp c3RlciBmaWVsZHMpCisgKgorICogTG93ZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLS0tLS0tLS0tLS0tLS0tIDYgNSAt IDMgIDIgICAxICAgMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgICAgIFBGTiAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAqCisg KiAgNTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gMzQgIDMzIC0tLS0tLS0tLS0tLS0tLS0tLS0gNiA1 IC0gMyAgMiAgIDEgICAwCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICBSZXNlcnZlZCAo WmVybykgICAgIHwgICAgICAgICAgUEZOICAgICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8Cisg KiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFRMQiBmbGFncyBtYW5hZ2VkIGluIGhhcmR3YXJlOgor ICogICAgUEZOOglQYWdlIEZyYW1lIE51bWJlci4KICAqIAlDOglDYWNoZSBhdHRyaWJ1dGUuCiAg KiAJRDoJRGlydHkgYml0LiAgVGhpcyBtZWFucyBhIHBhZ2UgaXMgd3JpdGFibGUuICBJdCBpcyBu b3QKICAqIAkJc2V0IGF0IGZpcnN0LCBhbmQgYSB3cml0ZSBpcyB0cmFwcGVkLCBhbmQgdGhlIGRp cnR5CiAgKiAJCWJpdCBpcyBzZXQuICBTZWUgYWxzbyBQVEVfUk8uCi0gKiAJVjoJVmFsaWQgYml0 LiAgT2J2aW91cywgaXNuJ3QgaXQ/CisgKiAJVlI6CVZhbGlkL1JlZmVyZW5jZSBiaXQuIFNlZSBh bHNvIFBURV9TVi4KICAqIAlHOglHbG9iYWwgYml0LiAgVGhpcyBtZWFucyB0aGF0IHRoaXMgbWFw cGluZyBpcyBwcmVzZW50CiAgKiAJCWluIEVWRVJZIGFkZHJlc3Mgc3BhY2UsIGFuZCB0byBpZ25v cmUgdGhlIEFTSUQgd2hlbgogICogCQlpdCBpcyBtYXRjaGVkLgogICovCiAjZGVmaW5lCVBURV9D KGF0dHIpCQkoKGF0dHIgJiAweDA3KSA8PCAzKQogI2RlZmluZQlQVEVfQ19VTkNBQ0hFRAkJKFBU RV9DKE1JUFNfQ0NBX1VOQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0NfQ0FDSEUJCShQVEVfQyhNSVBT X0NDQV9DQUNIRUQpKQogI2RlZmluZQlQVEVfRAkJCTB4MDQKLSNkZWZpbmUJUFRFX1YJCQkweDAy CisjZGVmaW5lCVBURV9WUgkJCTB4MDIKICNkZWZpbmUJUFRFX0cJCQkweDAxCiAKKyNpZmRlZiBD UFVfQ0hFUkkKKy8qCisgKiBDSEVSSSBFbnRyeUxvIGV4dGVuc2lvbnMgdGhhdCBsaW1pdCBzdG9y aW5nIGxvYWRpbmcgYW5kIHN0b3JpbmcgdGFnZ2VkCisgKiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJ UFRFX1NDCQkJKDB4MVVMTCA8PCA2MykKKyNkZWZpbmUJUFRFX0xDCQkJKDB4MVVMTCA8PCA2MikK KyNlbmRpZgorCiAvKgorICogUFRFIFNvZnR3YXJlIEJpdHMKKyAqCisgKiBVcHBlciBiaXRzIG9m IGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgMzEgICAzMCAgIDI5CisgKiAgICAtLS0tLS0tLS0t LS0tLQorICogICB8IE1OIHwgVyAgfCBSTyB8CisgKiAgICAtLS0tLS0tLS0tLS0tLQorICoKKyAq IFVwcGVyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICAgNjMtNjIgICA2MS02MCAgNTkg ICA1OCAtLSA1NiAgICA1NSAgIDU0ICAgNTMKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgfCAgUkcgIHwgICAgICB8IFNWIHwgUEcgU1ogSURY IHwgTU4gfCBXICB8IFJPIHwKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKgogICogVk0gZmxhZ3MgbWFuYWdlZCBpbiBzb2Z0d2FyZToKKyAqCVJH OglSZWdpb24uCSAoUmVzZXJ2ZWQuIEN1cnJlbnRseSBub3QgdXNlZC4pCisgKglTVjoJU29mdCBW YWxpZCBiaXQuCisgKglQRyBTWiBJRFg6IFBhZ2UgU2l6ZSBJbmRleCAoMC03KS4KKyAqCQlJbmRl eAlQYWdlIE1hc2sgKEJpbmFyeSkJSFcgUGFnZSBTaXplCisgKgkJLS0tLS0JLS0tLS0tLS0tLS0t LS0tLS0tLQktLS0tLS0tLS0tLS0KKyAqCQkwCTAwMDAgMDAwMCAwMDAwIDAwMDAJICA0SworICoJ CTEJMDAwMCAwMDAwIDAwMDAgMDAxMQkgMTZLCisgKgkJMgkwMDAwIDAwMDAgMDAwMCAxMTExCSA2 NEsKKyAqCQkzCTAwMDAgMDAwMCAwMDExIDExMTEJMjU2SworICoJCTQJMDAwMCAwMDAwIDExMTEg MTExMQkgIDFNCisgKgkJNQkwMDAwIDAwMTEgMTExMSAxMTExCSAgNE0KKyAqCQk2CTAwMDAgMTEx MSAxMTExIDExMTEJIDE2TQorICogKE1JUFMgMzopCisgKgkJNwkwMDExIDExMTEgMTExMSAxMTEx CSA2NE0KKyAqCQk4CTExMTEgMTExMSAxMTExIDExMTEJMjU2TSAoTm90IGN1cnJlbnRseSBzdXBw b3J0ZWQpCisgKgogICogCVJPOglSZWFkIG9ubHkuICBOZXZlciBzZXQgUFRFX0Qgb24gdGhpcyBw YWdlLCBhbmQgZG9uJ3QKICAqIAkJbGlzdGVuIHRvIHJlcXVlc3RzIHRvIHdyaXRlIHRvIGl0Lgog ICogCVc6CVdpcmVkLiAgPz8/CkBAIC0xNTEsMTMgKzIxNiwyOTEgQEAKICNkZWZpbmUJUFRFX1JP CQkJKChwdF9lbnRyeV90KTB4MDEgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVf VwkJCSgocHRfZW50cnlfdCkweDAyIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRF X01BTkFHRUQJCSgocHRfZW50cnlfdCkweDA0IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNpZiBk ZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0 X0JJVCAqLworI2RlZmluZQlQVEVfUFNfMTZLCQkoKHB0X2VudHJ5X3QpMHgwOCA8PCBUTEJMT19T V0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NEsJCSgocHRfZW50cnlfdCkweDEwIDw8IFRM QkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzI1NksJCSgocHRfZW50cnlfdCkweDE4 IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzFNCQkoKHB0X2VudHJ5X3Qp MHgyMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU180TQkJKChwdF9lbnRy eV90KTB4MjggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMTZNCQkoKHB0 X2VudHJ5X3QpMHgzMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NE0J CSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BT X0lEWF9NQVNLCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVm aW5lCVBURV9QU0lEWF9OQklUU19UT19MRUZUCQk1CisjZGVmaW5lCVBURV9QU0lEWF9OQklUU19U T19SSUdIVAk1NgorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX0xFRlQJCTExCisjZGVmaW5lCVBU RV9QRk5fTkJJVFNfVE9fUklHSFQJCTYKKyNkZWZpbmUJUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG VAk1OAorI2RlZmluZQlTV19WQUxJRAkJMHg0MAorI2RlZmluZQlQVEVfU1YJCQkoKHB0X2VudHJ5 X3QpU1dfVkFMSUQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Vsc2UKKyNkZWZpbmUJUFRFX1BT X0lEWF9NQVNLCQkwCisjZGVmaW5lCVBURV9TVgkJCTAKKyNlbmRpZgorCisvKgorICogUHJvbW90 aW9uIHRvIGEgNE1CIChQREUpIHBhZ2UgbWFwcGluZyByZXF1aXJlcyB0aGF0IHRoZSBjb3JyZXNw b25kaW5nIDRLQgorICogKFBURSkgcGFnZSBtYXBwaW5ncyBoYXZlIGlkZW50aWNhbCBzZXR0aW5n cyBmb3IgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgKi8KKyNkZWZpbmUJUEdfUFJPTU9URV9NQVNL CShQVEVfRyB8IFBURV9WQUxJRCB8IFBURV9EIHwgUFRFX0NfVU5DQUNIRUQgfCBcCisJCQlQVEVf Q19DQUNIRSB8IFBURV9STyB8IFBURV9XIHwgUFRFX01BTkFHRUQgfCBcCisJCQlQVEVfUkVGKQor CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCVRMQkxPX1BURV9UT19JRFgocHRlKQko KChwdGUpICYgUFRFX1BTX0lEWF9NQVNLKSA+PiA1NikKKyNkZWZpbmUJVExCTUFTS19JRFhfVE9f TUFTSyhpZHgpICgoKDEgPDwgKChpZHgpIDw8IDEpKSAtIDEpIDw8IFRMQk1BU0tfU0hJRlQpCisj ZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJVExCTUFTS19JRFhfVE9fTUFTSyhUTEJMT19Q VEVfVE9fSURYKHB0ZSkpCisjZGVmaW5lCVRMQk1BU0tfNEtfUEFHRQkJVExCTUFTS19JRFhfVE9f TUFTSygwKQorI2RlZmluZQlUTEJNQVNLXzE2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMSkK KyNkZWZpbmUJVExCTUFTS182NEtfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDIpCisjZGVmaW5l CVRMQk1BU0tfMjU2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMykKKyNkZWZpbmUJVExCTUFT S18xTV9QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDQpCisjZGVmaW5lCVRMQk1BU0tfNE1fUEFH RQkJVExCTUFTS19JRFhfVE9fTUFTSyg1KQorI2RlZmluZQlUTEJNQVNLXzE2TV9QQUdFCVRMQk1B U0tfSURYX1RPX01BU0soNikKKyNkZWZpbmUJVExCTUFTS182NE1fUEFHRQlUTEJNQVNLX0lEWF9U T19NQVNLKDcpCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworI2RlZmluZQlUTEJMT19Q VEVfVE9fSURYKHB0ZSkgCTAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX01BU0socHRlKQkwCisjZW5k aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAogLyoKICAqIFBURSBtYW5hZ2VtZW50IGZ1bmN0 aW9ucyBmb3IgYml0cyBkZWZpbmVkIGFib3ZlLgogICovCi0jZGVmaW5lCXB0ZV9jbGVhcihwdGUs IGJpdCkJKCoocHRlKSAmPSB+KGJpdCkpCi0jZGVmaW5lCXB0ZV9zZXQocHRlLCBiaXQpCSgqKHB0 ZSkgfD0gKGJpdCkpCi0jZGVmaW5lCXB0ZV90ZXN0KHB0ZSwgYml0KQkoKCoocHRlKSAmIChiaXQp KSA9PSAoYml0KSkKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9j bGVhcihwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSAmPSAofmJp dCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfc2V0KHB0X2VudHJ5X3QgKnB0ZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l IGludAorcHRlX3Rlc3QocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl dHVybiAoKCpwdGUgJiBiaXQpID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitw ZGVfY2xlYXIocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50 cnlfdCAqKXBkZSAmPSAofmJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwZGVfc2V0 KHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilw ZGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfdGVzdChwZF9lbnRyeV90 ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgoKihwdF9lbnRyeV90ICopcGRl ICYgYml0KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9f UEFfVE9fUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgocGEgPj4gVExCX1BBR0Vf U0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSyk7Cit9CisKK3N0YXRp YyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QRk5fVE9fUEEocHRfZW50cnlfdCBwZm4pCit7 CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PCBUTEJf UEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QVEVf VE9fUEZOKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChwdGUgJiBUTEJMT19QRk5fTUFT Syk7Cit9CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworI2RlZmluZQlQVEVfUkVGCQlQVEVf VlIKKyNkZWZpbmUJUFRFX1ZBTElEIAlQVEVfU1YKKworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJ CQlwdGVfdGVzdCgocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCQlw dGVfY2xlYXIoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0ZSkJCXB0ZV9z ZXQoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFyKHB0ZSkJYXRv bWljX2NsZWFyX2xvbmcoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3Nl dChwdGUpCQlhdG9taWNfc2V0X2xvbmcoKHB0ZSksIFBURV9SRUYpCisKKyNlbHNlIC8qICEgTUlQ UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJUFRFX1JFRgkJMAorI2RlZmluZQlQVEVfVkFMSUQJ UFRFX1ZSCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJMAorI2RlZmluZQlwdGVfcmVmX2Ns ZWFyKHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0b21p Y19jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3NldChwdGUsIGJpdCkKKworI2Vu ZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJcHRlX2lzX3ZhbGlkKHB0ZSkJ CXB0ZV90ZXN0KChwdGUpLCBQVEVfVkFMSUQpCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8 IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0 ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl82NCgocHRlKSwgYml0KQorI2Rl ZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF82NCgocHRlKSwgYml0KQor I2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzY0KHB0 ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClh dG9taWNfcmVhZGFuZHNldF82NChcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKwor I2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF82NChw dGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfbG9u ZyAqKShwdGVwKSA9ICh1X2xvbmcpKHB0ZSk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9z dG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRlcCwgcGRlKQorCisKKyNlbHNlIC8qICEgUEhZ U0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21pY19jbGVhcihwdGUsIGJpdCkJYXRv bWljX2NsZWFyXzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9hdG9taWNfc2V0KHB0ZSwgYml0 KQlhdG9taWNfc2V0XzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9sb2FkX3N0b3JlKHB0ZXAs IHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfMzIocHRlcCwgcHRlKQorI2RlZmluZQlwZGVfbG9hZF9z dG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19yZWFkYW5kc2V0XzMyKFwKKwkJCQkJ CShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5lCXB0ZV9hdG9taWNfc3RvcmUocHRl cCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUgcHRlX3N0b3Jl KHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9pbnQgKikocHRlcCkgPSAodV9pbnQpKHB0ZSk7CVwK K30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9zdG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRl cCwgcGRlKQorCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KKworI2VuZGlmIC8qICEg X0xPQ09SRSAqLworCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2lmbmRlZiBfTE9DT1JFCisvKgorICogQ2hl Y2sgdG8gc2VlIGlmIGEgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIChQYWdlU2l6ZSA+IDRL KSBQVEUuCisgKgorICogT24gX19taXBzX242NCB0aGUga2VybmVsIHVzZXMgdGhlIHZpcnR1YWwg bWVtb3J5IGFkZHJlc3MgcmFuZ2UgZnJvbQorICogVk1fTUlOX0tFUk5FTF9BRERSRVNTICgweGMw MDAwMDAwMDAwMDAwMDApIHRvIFZNX01BWF9LRVJORUxfQUREUkVTUworICogKDB4YzAwMDAwODAw MDAwMDAwMCkuIFRoZXJlZm9yZSwgYSB2YWxpZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIFBERQor ICogKGEgcG9pbnRlciB0byBhIHBhZ2UgdGFibGUpIHdpbGwgaGF2ZSBiaXRzIDYxIHRvIDQwIHNl dCB0byB6ZXJvLiBBCisgKiBzdXBlcnBhZ2Ugd2lsbCBoYXZlIG9uZSBvZiB0aGUgc3VwZXJwYWdl IHNpemUgYml0cyAoYml0cyA1OCB0byA1NikKKyAqIHNldC4KKyAqLworCisvKiBJcyB0aGUgUERF IGEgc3VwZXJwYWdlIG9mIGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcGRlX2lz X3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1cm4gKCgocHRfZW50cnlfdCkq cGRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAwKTsKK30KKworLyogSXMgdGhlIFBURSBhIHN1cGVy cGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc19zdXBlcnBh Z2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU19JRFhfTUFT SykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQREUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRp YyBfX2lubGluZSBpbnQKK3BkZV9pc18xbV9zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFNKTsK K30KKworLyogSXMgdGhlIFBURSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5saW5l IGludAorcHRlX2lzXzFtX3N1cGVycGFnZShwdF9lbnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4g KCgqcHRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisvKiBQaHlzaWNhbCBBZGRy ZXNzIHRvIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFtZSBOdW1iZXIuICovCitzdGF0aWMgX19pbmxp bmUgcHRfZW50cnlfdAorVExCTE9fUEFfVE9fU1BGTih2bV9wYWRkcl90IHBhKQoreworCisJcmV0 dXJuICgoKHBhID4+IFRMQl8xTV9TVVBFUlBBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkg JgorCSAgICBUTEJMT19QRk5fTUFTSyk7Cit9CisKKy8qIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFt ZSBOdW1iZXIgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk cl90CitUTEJMT19TUEZOX1RPX1BBKHB0X2VudHJ5X3Qgc3BmbikKK3sKKworCXJldHVybiAoKHZt X3BhZGRyX3QpKHNwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PAorCSAgICBUTEJfMU1fU1VQRVJQ QUdFX1NISUZUKTsKK30KKworLyogU3VwZXJwYWdlIFBhZ2UgVGFibGUgRW50cnkgdG8gUGh5c2lj YWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUFRFX1RP X1BBKHB0X2VudHJ5X3QgcHRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19Q VEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP X1NQREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BB KFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOworfQorCisKKy8qIEFuIDRLQiBQ YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg dm1fcGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJu IChUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisK KwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2Vsc2UgLyogISBQSFlTQUREUl82 NF9CSVQgKi8KKworI2RlZmluZQlwdGVfaXNfcmVmZXJlbmNlZChwdGUpCQkwCisjZGVmaW5lCXB0 ZV9yZWZlcmVuY2VfcmVzZXQocHRlKQorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3BhZ2UocHRlKQor I2RlZmluZQlwZGVfaXNfc3VwZXJwYWdlKHBkZSkJCTAKKyNkZWZpbmUJcHRlX2lzX3N1cGVycGFn ZShwZGUpCQkwCisjZGVmaW5lIHBkZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisjZGVmaW5lIHB0 ZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5s aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl dHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorI2VuZGlm IC8qICEgX0xPQ09SRSAqLworI2VuZGlmIC8qICEgUEhZU0FERFJfNjRfQklUICovCiAKIC8qIEFz c2VtYmx5IHN1cHBvcnQgZm9yIFBURSBhY2Nlc3MqLwogI2lmZGVmIExPQ09SRQpAQCAtMTY3LDE2 ICs1MTAsMTA0IEBACiAjZGVmaW5lCVBURU1BU0sJCQkweGZmOAogI2RlZmluZQlQVEVTSVpFCQkJ OAogI2RlZmluZQlQVEVfTAkJCWxkCisjZGVmaW5lCVBURV9TCQkJc2QKICNkZWZpbmUJUFRFX01U QzAJCWRtdGMwCi0jZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocHIpCi0jZWxzZQorI2RlZmluZQlD TEVBUl9QVEVfU1dCSVRTKHIpCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworLyogU3VwZXJw YWdlIGFuZCByZWZlcmVuY2VkIGJpdCBlbXVsYXRpb24gQVNNIG1hY3Jvcy4gKi8KKworLyoKKyAq IEdFVF9TVVBFUlBBR0VfSURYKHIpCisgKgorICogR2V0IHRoZSBzdXBlcnBhZ2UgaW5kZXggZnJv bSB0aGUgUFRFIGJ5IHNoaWZ0aW5nIGl0IGxlZnQgYnkKKyAqIFBURV9QU0lEWF9OQklUU19UT19M RUZUIChjbGVhcmluZyB0aGUgdXBwZXIgc29mdGJpdHMpIGFuZCB0aGVuIGJhY2sgdG8gdGhlCisg KiByaWdodCBieSAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RP X1JJR0hUKSBjbGVhcmluZworICogYWxsIHRoZSBsb3dlciBiaXRzIGluIHRoZSBwcm9jZXNzLgor ICovCisjZGVmaW5lIEdFVF9TVVBFUlBBR0VfSURYKHIpCQkJCVwKKwlkc2xsCXIsIChQVEVfUFNJ RFhfTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybDMyCXIsIChQVEVfUFNJRFhfTkJJVFNfVE9fUklH SFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX0hXX1RMQl9G TEFHUyhyKQorICoKKyAqIEdldCB0aGUgbG93ZXIgaGFyZHdhcmUgVExCIGZsYWdzIGJ1dCBzaGlm dGluZyBsZWZ0IHRoZW4gcmlnaHQuCisgKi8KKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFHUyhyKQkJ CQlcCisJZHNsbDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpOwlcCisJZHNy bDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfT0RE XzFNX1BGTl9GUk9NX0VWRU4ocikKKyAqCisgKiBHZXQgdGhlIG9kZCAxTSBQRk4gKFRMQiBsbzEp IGZyb20gdGhlIGV2ZW4gMU0gUFRFLiAgRmlyc3QsIG1hc2sgb3V0IHRoZSBQRk4KKyAqIGZyb20g dGhlIGV2ZW4gUFRFLiBUaGVuIGFkZCAxTSB3b3J0aCBvZiBwYWdlcyB0byBpdCAoMjU2KS4gRmlu YWxseSwgc2hpZnQgaXQKKyAqIGJhY2sgdG8gaXRzIHBvc2l0aW9uIGluIHRoZSBQVEUuCisgKi8K KyNkZWZpbmUgR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCQkJXAorCWRzbGwJciwgKFBURV9Q Rk5fTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybAlyLCAoUFRFX1BGTl9OQklUU19UT19MRUZUICsg UFRFX1BGTl9OQklUU19UT19SSUdIVCk7IFwKKwlkYWRkaXUJciwgciwgKDEwMjQgKiAxMDI0IC8g UEFHRV9TSVpFKTsJXAorCWRzbGwJciwgKFBURV9QRk5fTkJJVFNfVE9fUklHSFQpCisKKy8qCisg KiBJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCisgKgorICogSWYg YSBQREUgaXMgdmFsaWQgdGhlbiBzZXQgdGhlIHJlZmVyZW5jZWQgYml0IChQVEVfVlIpLiAgVGhl IGZpcnN0IHZlcnNpb24KKyAqIGRvZXMgaXQgYXRvbWljYWxseS4KKyAqLworI2RlZmluZSBBVE9N SUNfUkVGQklUX1VQREFURQorI2lmZGVmIEFUT01JQ19SRUZCSVRfVVBEQVRFCisKKyNkZWZpbmUg SUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4g IyMgdW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0g MzIpOwkJXAorCWFuZGkJcjAsIHIwLCBTV19WQUxJRDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlk ICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJbGxkCXIw LCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBURV9WUiA7CQkJXAorCXNjZAly MCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwliZXF6CXIwLCB0cnlfYWdhaW4gIyMgdW5pcXVlIDsJ CVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92YWxpZCAjIyB1bmlxdWUg IyMgOgorCisjZWxzZSAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNkZWZpbmUgSUZf VkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4gIyMg dW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0gMzIp IDsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQgOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQg IyMgdW5pcXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs IHIwLCBQVEVfVlIgOwkJCVwKKwlQVEVfUwlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92 YWxpZCAjIyB1bmlxdWUgIyMgOgorI2VuZGlmIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8K KworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlHRVRfU1VQRVJQQUdF X0lEWChyKQorI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCisjZGVmaW5lCUlGX1ZBTElEX1NF VF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKworI2VuZGlmIC8qICEgTUlQUzY0X05F V19QTUFQICovCisKKyNlbHNlIC8qICEgTE9DT1JFICovCiAjZGVmaW5lCVBURVNISUZUCQkyCiAj ZGVmaW5lCVBURTJNQVNLCQkweGZmOAkvKiBmb3IgdGhlIDItcGFnZSBsbzAvbG8xICovCiAjZGVm aW5lCVBURU1BU0sJCQkweGZmYwogI2RlZmluZQlQVEVTSVpFCQkJNAogI2RlZmluZQlQVEVfTAkJ CWx3CisjZGVmaW5lCVBURV9TCQkJc3cKICNkZWZpbmUJUFRFX01UQzAJCW10YzAKICNkZWZpbmUJ Q0xFQVJfUFRFX1NXQklUUyhyKQlMT05HX1NMTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQ7 IExPTkdfU1JMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVCAvKiByZW1vdmUgc3diaXRzICov CisKKyNkZWZpbmUJSVNfUFRFX1ZBTElEKHIwLCByMSwgb2Zmc2V0LCBsYWJlbCkKKyNkZWZpbmUJ U0VUX1JFRl9CSVQocjAsIHIxLCBvZmZzZXQpCisKICNlbmRpZiAvKiBkZWZpbmVkKF9fbWlwc19u NjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgKi8KIAogI2lmIGRlZmluZWQoX19taXBzX242NCkK QEAgLTIwMSw0ICs2MzIsMTcgQEAKICNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3ZmZlMDAw CiAjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKIAorCisvKiBQYWdlTWFzayBS ZWdpc3RlciAoQ1AwIFJlZ2lzdGVyIDUsIFNlbGVjdCAwKSBWYWx1ZXMgKi8KKyNkZWZpbmUJTUlQ UzNfUEdNQVNLX01BU0tYCTB4MDAwMDE4MDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzRLCQkweDAw MDAwMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNksJMHgwMDAwNjAwMAorI2RlZmluZQlNSVBT M19QR01BU0tfNjRLCTB4MDAwMWUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzI1NksJMHgwMDA3 ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMU0JCTB4MDAxZmUwMDAKKyNkZWZpbmUJTUlQUzNf UEdNQVNLXzRNCQkweDAwN2ZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNk0JMHgwMWZmZTAw MAorI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdN QVNLXzI1Nk0JMHgxZmZmZTAwMAorCiAjZW5kaWYgLyogIV9NQUNISU5FX1BURV9IXyAqLwpkaWZm IC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BtYXAu aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3Bt YXAuaApAQCAtNDgsNiArNDgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CiAj aW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2lmIGRl ZmluZWQoX19taXBzX24zMikgfHwgZGVmaW5lZChfX21pcHNfbjY0KSAvKiBQSFlTQUREUl82NEJJ VCAqLwogI2RlZmluZQlOS1BUCQkyNTYJLyogbWVtID4gNEcsIHZtX3BhZ2Vfc3RhcnR1cCBuZWVk cyBtb3JlIEtQVHMgKi8KQEAgLTYyLDE1ICs2MywyNCBAQAogI2luY2x1ZGUgPHN5cy9fbG9jay5o PgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2lu Y2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAv KgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBzdHJ1Y3QgcHZfY2h1bms7 CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJTFFfSEVBRCgsIHB2X2Vu dHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOworI2lmZGVmIE1JUFM2NF9O RVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCWlu dCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogI2RlZmlu ZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAtODEsMTUgKzkxLDE4IEBA CiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklUUykgLSAxKQogCiBzdHJ1 Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlfdCAqcG1fc2VndGFiOwkv KiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBwdl9jaHVuaykJcG1fcHZj aHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1c2V0X3QJcG1fYWN0aXZl OwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2ludDMyX3QgYXNpZDpBU0lE X0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2ludDMyX3QgZ2VuOkFTSURH RU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAgICAgIHBtX2FzaWRbTUFY U01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRzOwkvKiBwbWFwIHN0YXRp c3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlz dHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFibGUgcGFnZXMgKi8KKyNl bmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IHBtYXAgKnBt YXBfdDsKQEAgLTEyMSw3ICsxMzQsNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBwdl9lbnRyeSB7 CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgbWFwcGluZyAqLwot CVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBw dl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2OSw2ICsxODIsNyBAQAog CiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9tYXBkZXYodm1fcGFkZHJf dCwgdm1fc2l6ZV90KTsKKy8vYm9vbGVhbl90IHBtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90 IG0pOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9zaXplX3QpOwogdm1fb2Zm c2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwogdm9pZCBwbWFwX2tlbnRl cih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgsNiArMTkyLDcgQEAKIHZv aWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBwYSk7CiB2b2lkIHBtYXBf Zmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRy KHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8qIF9LRVJORUwgKi8KZGlm ZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvcGFy YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIvc3lzL21pcHMvaW5jbHVk ZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5lCU1BWERVTVBQR1MJCTEJ CS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf UEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdlIHRoZSBLU1RBQ0tfU0la RSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAo ZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8PCAxNCkJLyogU2luZ2xl IDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NUQUNLX1NJWkUKKyNkZWZp bmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEpCisjZGVmaW5lCUtTVEFD S19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmluZQlLU1RBQ0tfVExCTUFT S19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElGVCAtIDEpKSBcCisJCQkJ CTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdFUwkoKEtTVEFDS19Q QUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBLU1RBQ0tfTEFSR0VfUEFH RSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBiZSBhbGlnbmVkIG9uIGEg KFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtTVEFDS19QQUdFUwkJMgkv KiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShLU1RBQ0tfUEFHRVMgKiBQ QUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lCUtT VEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdF UwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAqLworI2VuZGlmIC8qICEg S1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZlZCBjb252ZXJzaW9uIG1h Y3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsgUEFHRV9NQVNLKSAmIH5Q QUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+UEFHRV9NQVNLKQorI2Rl ZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+UERSTUFTSykKKyNkZWZp bmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNkZWZpbmUJYXRvcCh4KQkJ CSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgoeCkgPDwgUEFHRV9TSElG VCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5cy9jb25mL29wdGlvbnMu bWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lzL2NvbmYvb3B0aW9ucy5t aXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJb3B0X2dsb2JhbC5oCiAK ICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5jbHVkZXMgcmVmZXJlbmNl IGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0LgorIworTUlQUzY0X05FV19Q TUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIE5ldEZQ R0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYxMEJNQUNfNjRCSVQJCQlv cHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUgd2l0aCBQYWdlTWFzayBy ZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdlIChjdXJyZW50bHkgMTZL KSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJHRV9QQUdFICAgCQlvcHRf Z2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgQXRoZXJvcyBTb0MgcGVy aXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYgLS1naXQgYS9zeXMvY29u Zi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9zeXMvY29uZi9maWxlcy5t aXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMxLDggQEAKIG1pcHMvbWlw cy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRlcC5jCQkJb3B0aW9uYWwJ ZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1pcHMvbWlwcy9wbWFwLmMJ CQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFtaXBzNjRfbmV3X3BtYXAK K21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0X25ld19wbWFwCiBtaXBz L21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlwcy9zY19tYWNoZGVwLmMJ CQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0aW9uYWwJZGRiIHwgc3Rh Y2sKZGlmZiAtLWdpdCBhL2xpYi9saWJrdm0va3ZtX21pcHMuaCBiL2xpYi9saWJrdm0va3ZtX21p cHMuaAotLS0gYS9saWIvbGlia3ZtL2t2bV9taXBzLmgKKysrIGIvbGliL2xpYmt2bS9rdm1fbWlw cy5oCkBAIC00OSw3ICs0OSw3IEBACiAjZGVmaW5lCU1JUFM2NF9LU0VHMV9FTkQJMHhmZmZmZmZm ZmJmZmZmZmZmCiAKICNkZWZpbmUJTUlQUzMyX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKLSNkZWZp bmUJTUlQUzY0X1BGTl9NQVNLCQkweDNGRkZGRkZDMAorI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJ CTB4RkZGRkZGQzAKICNkZWZpbmUJTUlQU19QRk5fU0hJRlQJCSg2KQogCiAjZGVmaW5lCU1JUFNf UEZOX1RPX1BBKHBmbikJKCgocGZuKSA+PiBNSVBTX1BGTl9TSElGVCkgPDwgTUlQU19QQUdFX1NI SUZUKQoK --b1_17227ff5cee59ab31c13030b2aea797d--