From owner-freebsd-mips@freebsd.org Fri Sep 16 19:16:54 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 7BFA2BDDD99 for ; Fri, 16 Sep 2016 19:16:54 +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 68F21827 for ; Fri, 16 Sep 2016 19:16:53 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 2D01CB91F; Fri, 16 Sep 2016 19:16:53 +0000 (UTC) Date: Fri, 16 Sep 2016 19:16:53 +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: <8cfbda1353b73aeded57f1b1746022d2@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: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcRSU= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_8cfbda1353b73aeded57f1b1746022d2" X-Mailman-Approved-At: Fri, 16 Sep 2016 19:32:13 +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:16:54 -0000 --b1_8cfbda1353b73aeded57f1b1746022d2 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkxLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgRml4IG1pcHMzMiBidWlsZC4KICAKICBCb290IHRlc3Qga2VybmVsL3dv cmxkIHZpYSBNQUxUQSB1bmRlciBRRU1VIGlzIHN1Y2Nlc3NmdWwKClJFUE9TSVRPUlkKICByUyBG cmVlQlNEIHNyYyByZXBvc2l0b3J5CgpDSEFOR0VTIFNJTkNFIExBU1QgVVBEQVRFCiAgaHR0cHM6 Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1P3ZzPTIwMzkwJmlkPTIwMzkxCgpSRVZJU0lPTiBE RVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFGRkVDVEVEIEZJTEVT CiAgbGliL2xpYmt2bS9rdm1fbWlwcy5oCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25m L29wdGlvbnMubWlwcwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1 ZGUvcG1hcC5oCiAgc3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1w YXJhbS5oCiAgc3lzL21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK ICBzeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5 cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBz eXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMv bWlwcy9taXBzL3RsYi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3Vt YV9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVl LmMKCkVNQUlMIFBSRUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRp bmdzL3BhbmVsL2VtYWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8s IHJ3YXRzb24sIGVtYXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lh aG9vLmNvbSwgbWl6aGthX2dtYWlsLmNvbQo= --b1_8cfbda1353b73aeded57f1b1746022d2 Content-Type: text/x-patch; charset=utf-8; name="D2535.20391.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20391.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 cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI2NjYsNyArMjY3NCw3IEBACiAJS0FTU0VS VChzeXNtLT52YWxpZDEgPT0gMCwgKCJwbWFwX3F1aWNrX2VudGVyX3BhZ2U6IFBURSBidXN5Iikp OwogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwotCSpwdGUgPSBU TEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HIHwKKwkqcHRlID0gVExC TE9fUEFfVE9fUEZOKHBhKSB8IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0cgfAogCSAgICAoaXNf Y2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQVEVfQ19VTkNBQ0hFRCk7CiAJ c3lzbS0+dmFsaWQxID0gMTsKIApAQCAtMjcxOSw3ICsyNzI3LDcgQEAKIAkgICAgKCJwbWFwX3Bh Z2VfZXhpc3RzX3F1aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwogCXJ2ID0gRkFM U0U7CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0t Pm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbmV4dCkgewogCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgewogCQkJcnYgPSBUUlVF OwogCQkJYnJlYWs7CkBAIC0yNzcyLDcgKzI3ODAsNyBAQAogCQkJCUtBU1NFUlQocGRlICE9IE5V TEwgJiYgKnBkZSAhPSAwLAogCQkJCSAgICAoInBtYXBfcmVtb3ZlX3BhZ2VzOiBwZGUiKSk7CiAJ CQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKLQkJCQlpZiAoIXB0ZV90 ZXN0KHB0ZSwgUFRFX1YpKQorCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJ CQlwYW5pYygicG1hcF9yZW1vdmVfcGFnZXM6IGJhZCBwdGUiKTsKIAkJCQl0cHRlID0gKnB0ZTsK IApAQCAtMjgwMiw3ICsyODEwLDcgQEAKIAkJCQlwdl9lbnRyeV9jb3VudC0tOwogCQkJCXBjLT5w Y19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CiAJCQkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291 bnQtLTsKLQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJ TFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBH QV9XUklURUFCTEUpOwogCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsK QEAgLTI4MzMsNyArMjg0MSw3IEBACiAJCXJldHVybiAocnYpOwogCiAJcndfYXNzZXJ0KCZwdmhf Z2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l eHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJCXB0ZSA9 IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODYzLDcgKzI4NzEsNyBAQAogCWlmICgo bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKIAkJcmV0dXJuIChjb3VudCk7CiAJcndf d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4 dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4OTcsMTEgKzI5MDUsMTEgQEAKIAlpZiAo IXZtX3BhZ2VfeGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkK IAkJcmV0dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0so cG1hcCk7CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7Ci0JCUtBU1NFUlQocHRl ICE9IE5VTEwgJiYgcHRlX3Rlc3QocHRlLCBQVEVfViksCisJCUtBU1NFUlQocHRlICE9IE5VTEwg JiYgcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpLAogCQkgICAgKCJwYWdlIG9uIHB2X2xpc3QgaGFz IG5vIHB0ZSIpKTsKIAkJcGJpdHMgPSAqcHRlOwogCQlpZiAocHRlX3Rlc3QoJnBiaXRzLCBQVEVf RCkpIHsKQEAgLTMwNDAsNyArMzA0OCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChwdGUg PSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJCSAg ICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQg fCBQVEVfVikpIHsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WQUxJ RCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu Z2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTMxMDYsNyArMzExNCw3 IEBACiAJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJ cndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2 X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf bmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRl ID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTMyMDgsNyArMzIxNiw3IEBACiByZXRy eToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0ZXAgIT0gTlVMTCkg PyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsKKwlpZiAoIXB0ZV90 ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAt MzM0NSw3ICszMzUzLDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsgaysr KSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0 ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1ZBTElE KSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKIAkJCQl2 YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFH RV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDAxLDE1IEBACiAJcHRfZW50cnlfdCBydzsKIAogCWlm ICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBURV9STzsKKwkJcncg PSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH RUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAhPSAwKQotCQkJcncg PSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAkJZWxzZQotCQkJ cncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkvKiBOZWVkbid0IGVt dWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8KLQkJcncgPSBQVEVf ViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVybiAocncpOwogfQog CkBAIC0zNDI0LDEzICszNDMyLDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6 IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9zc2libGUgdGhhdCBz b21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVzdChwdGUsIFBURV9W KSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFM SUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUocG1hcCwgdmEsICpw dGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAjZWxzZQotCWlm ICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCisJaWYgKCFw dGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCiAJCXBhbmlj KCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5kaWYKIAlpZiAocHRl X3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0NTQsMTggQEAKIH0KIAogLyoKKyAq IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24g aXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24uCisgKi8KK2ludAor cG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQorewor CisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tleHRyYWN0CiAgKglG dW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRl ZApAQCAtMzUyMiwxNyArMzU0MiwyNiBAQAogCiAJaWYgKG0gIT0gTlVMTCkgewogCQlmb3IgKHB2 ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKLQkJICAgIHB2ID0gVEFJTFFfTkVY VChwdiwgcHZfbGlzdCkpIHsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkpIHsK IAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsK IAkJfQogCX0KIH0KIAorLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRyaWJ1dGUgZm9yIHRoZSBz cGVjaWZpZWQgcGFnZS4KKyAqLwogdm9pZAogcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2Vf dCBtLCB2bV9tZW1hdHRyX3QgbWEpCiB7CiAKIAkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVs ZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBw aW5ncyBhcmUgY3JlYXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgog CSAqIEl0IGFwcGVhcnMgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZv cmUgYW55IG1hcHBpbmdzCiAJICogZm9yIHRoZSBwYWdlIGFyZSBlc3RhYmxpc2hlZC4gIElmIHRo aXMgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAogCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZf bGlzdCBhbmQgbWFrZSBlYWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncwpkaWZmIC0tZ2l0IGEv c3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21pbmlkdW1w X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYworKysgYi9z eXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJCUtBU1NFUlQocHRlICE9IE5VTEwsICgi cHRlIGZvciAlanggaXMgTlVMTCIsICh1aW50bWF4X3QpdmEpKTsKIAkJZm9yIChpID0gMDsgaSA8 IE5QVEVQRzsgaSsrKSB7Ci0JCQlpZiAocHRlX3Rlc3QoJnB0ZVtpXSwgUFRFX1YpKSB7CisJCQlp ZiAocHRlX2lzX3ZhbGlkKCZwdGVbaV0pKSB7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRl W2ldKTsKIAkJCQlpZiAoaXNfZHVtcGFibGUocGEpKQogCQkJCQlkdW1wX2FkZF9wYWdlKHBhKTsK ZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9tYWNo ZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy9t YWNoZGVwLmMKQEAgLTI4Myw5ICsyODMsOSBAQAogI2VuZGlmCiAJcHJvY19saW5rdXAwKCZwcm9j MCwgJnRocmVhZDApOwogCi0JS0FTU0VSVCgoa3N0YWNrMCAmIFBBR0VfTUFTSykgPT0gMCwKLQkJ KCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZGFyeTogMHglMGx4IiwKLQkJ KGxvbmcpa3N0YWNrMCkpOworCUtBU1NFUlQoKGtzdGFjazAgJiAoKEtTVEFDS19QQUdFX1NJWkUg KiAyKSAtIDEpKSA9PSAwLAorCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQgb24gYSBwYWdlICgw eCUwbHgpIGJvdW5kYXJ5OiAweCUwbHgiLAorCQkobG9uZykoS1NUQUNLX1BBR0VfU0laRSAqIDIp LCAobG9uZylrc3RhY2swKSk7CiAJdGhyZWFkMC50ZF9rc3RhY2sgPSBrc3RhY2swOwogCXRocmVh ZDAudGRfa3N0YWNrX3BhZ2VzID0gS1NUQUNLX1BBR0VTOwogCS8qIApAQCAtNDU5LDcgKzQ1OSw3 IEBACiAJICogV2UgdXNlIGEgd2lyZWQgdGxiIGluZGV4IHRvIGRvIHRoaXMgb25lLXRpbWUgbWFw cGluZy4KIAkgKi8KIAlwYSA9IHZ0b3BoeXMocGNwdSk7Ci0JcHRlID0gUFRFX0QgfCBQVEVfViB8 IFBURV9HIHwgUFRFX0NfQ0FDSEU7CisJcHRlID0gUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfUkVG IHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKIAl0bGJfaW5zZXJ0X3dpcmVkKFBDUFVfVExCX0VOVFJZ LCAodm1fb2Zmc2V0X3QpcGNwdXAsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhKSB8IHB0ZSwKIAkJ CSBUTEJMT19QQV9UT19QRk4ocGEgKyBQQUdFX1NJWkUpIHwgcHRlKTsKZGlmZiAtLWdpdCBhL3N5 cy9taXBzL21pcHMvZ2VuYXNzeW0uYyBiL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwotLS0gYS9z eXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKKysrIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCkBA IC0xMDIsNiArMTAyLDkgQEAKIEFTU1lNKFRERl9BU1RQRU5ESU5HLCBUREZfQVNUUEVORElORyk7 CiBBU1NZTShNQVhDT01MRU4sIE1BWENPTUxFTik7CiBBU1NZTShNRFREX0NPUDJVU0VELCBNRFRE X0NPUDJVU0VEKTsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorQVNTWU0oS1NUQUNLX1RMQk1B U0tfTUFTSywgS1NUQUNLX1RMQk1BU0tfTUFTSyk7CisjZW5kaWYKIAogQVNTWU0oTUlQU19LU0VH MF9TVEFSVCwgTUlQU19LU0VHMF9TVEFSVCk7CiBBU1NZTShNSVBTX0tTRUcxX1NUQVJULCBNSVBT X0tTRUcxX1NUQVJUKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMgYi9z eXMvbWlwcy9taXBzL2V4Y2VwdGlvbi5TCi0tLSBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK KysrIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwpAQCAtODUsNiArODUsMjggQEAKICAqLwog I2RlZmluZQlJTlRSQ05UX0NPVU5UCTI1NgogCisvKgorICogR2VuZXJhbCBNSVBTIENQVSBzdGF0 ZSBmb3IgZXhjZXB0aW9uczoKKyAqCisgKiBFUEMgUmVnaXN0ZXIgd2lsbCBwb2ludCB0byB0aGUg aW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgZmF1bHQsIHVubGVzcyB0aGUKKyAqIGZhdWx0aW5nIGlu c3RydWN0aW9uIHdhcyBpbiBhIGJyYW5jaCBkZWxheSBzbG90LiAgSW4gdGhhdCBjYXNlLCBpdCB3 aWxsCisgKiBwb2ludCB0byB0aGUgYnJhbmNoIGJlZm9yZSB0aGUgYnJhbmNoIGRlbGF5IHNsb3Qg aW5zdHJ1Y3Rpb24uCisgKgorICogVGhlIGNhdXNlIHJlZ2lzdGVyIHdpbGwgY29udGFpbiB3aGF0 IGNhdXNlZCB0aGUgZXhjZXB0aW9uIGFuZCBzb21lIHN0YXRlCisgKiBhYm91dCB0aGUgaW50ZXJy dXB0LgorICoKKyAqIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJv dXQgdGhlIHN0YXR1cyBvZiB0aGUgQ1BVIHN1Y2gKKyAqIGFzOiBLZXJuZWwvVXNlciBtb2RlIGJp dCwgaW50ZXJydXB0IGVuYWJsZSBiaXQuCisgKgorICogVGhlIEJhZFZhZGRyIHJlZ2lzdGVyIGNv bnRhaW5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBjYXVzZSB0aGUgbGFzdAorICogZXhjZXB0 aW9uLgorICoKKyAqIFRoZSBDb250ZXh0IHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBsb3dlciAyMiBi aXRzIG9mIHRoZSBWUE4gKHN0YXJ0aW5nIGF0CisgKiBiaXQgNCkgdGhhdCBjYXVzZSB0aGUgbGFz dCBleGNlcHRpb24gZXhjZXB0IGJpdDAgYW5kIGJpdDEgYXJlIHplcm8uIFRoZQorICogdXBwZXIg Yml0cyAoYml0cyAyMyB0byAzMSBmb3IgTUlQUzMyIGFuZCBiaXRzIDIzIHRvIDYzKSBhcmUgc2V0 IHVuZGVyCisgKiBrZXJuZWwgY29udHJvbCAoaS5lLiBwb2ludCB0byB0aGUgcGFnZSB0YWJsZSku IFRoZSBDb250ZXh0L1hDb250ZXh0CisgKiByZWdpc3RlcnMgYXJlIG5vdCBjdXJyZW50bHkgdXNl ZCBieSBGcmVlQlNELgorICovCiAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMCwx MyArMTMyLDI3IEBACiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgotICogTWlwc0RvVExC TWlzcyAtLQorICogTWlwc0RvVExCTWlzcyAtLSAgKFVUTEIgbWlzcykKICAqCi0gKiBUaGlzIGlz IHRoZSByZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4KKyAqIFRoaXMgaXMgdGhlIHJlYWwgVExC IE1pc3MgSGFuZGxlciBjb2RlLiAgQSBtaXNzIHdhcyBnZW5lcmF0ZWQgd2hlbiB0aGUKKyAqIGFj Y2VzcyBpcyB0byBrdXNlZyBhbmQgdGhlcmUgd2FzIG5vdCBtYXRjaGluZyBtYXBwaW5nIGxvYWRl ZCBpbnRvIHRoZSBUTEIuCiAgKiAnc2VnYmFzZScgcG9pbnRzIHRvIHRoZSBiYXNlIG9mIHRoZSBz ZWdtZW50IHRhYmxlIGZvciB1c2VyIHByb2Nlc3Nlcy4KICAqCisgKiBUaGUgQ1BVIGRvZXMgdGhl IGZvbGxvd2luZyBmb3IgYW4gVVRMQiBtaXNzOgorICogLSBTZXRzIHRoZSBFUEMgcmVnaXN0ZXIu CisgKiAtIFNldHMgdGhlIENhdXNlIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBTdGF0dXMgcmVn aXN0ZXIuIFNoaWZ0cyBLL1UgYW5kIElFIGJpdHMgb3ZlciBvbmUgYW5kIGNsZWFycworICogICB0 aGUgY3VycmVudCBLZXJuZWwvVXNlciBhbmQgSW50ZXJydXB0IEVuYWJsZSBiaXRzLiBTbyB0aGUg cHJvY2Vzc29yCisgKiAgIGlzIGluIGtlcm5lbCBtb2RlIHdpdGggdGhlIGludGVydXB0cyB0dXJu ZWQgb2ZmLgorICogLSBTZXRzIEJhZFZhZGRyIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBDb250 ZXh0L1hDb250ZXh0IHJlZ2lzdGVyKHMpLgorICogLSBTZXRzIHRoZSBUTEIgRW50cnlIaSByZWdp c3RlciB0byBjb250YWluIFZQTiBvZiB0aGUgZmF1bHRpbmcgYWRkcmVzcy4KKyAqCiAgKiBEb24n dCBjaGVjayBmb3IgaW52YWxpZCBwdGUncyBoZXJlLiBXZSBsb2FkIHRoZW0gYXMgd2VsbCBhbmQK ICAqIGxldCB0aGUgcHJvY2Vzc29yIHRyYXAgdG8gbG9hZCB0aGUgY29ycmVjdCB2YWx1ZSBhZnRl ciBzZXJ2aWNlLgorICoKKyAqIFhYWCBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBjaGFuZ2VkIHRv IGEgbGluZWFyIHBhZ2UgdGFibGUgYW5kIHVzZSB0aGUKKyAqIENvbnRleHQgYW5kIFhDb250ZXh0 IHJlZ2lzdGVycy4gIFRoYXQgaXMgcmVhbGx5IHdoYXQgaXQgd2FzIGRlc2lnbmVkIGZvci4KICAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAgCS5zZXQgcHVzaApAQCAtMTM3LDI1ICsxNzMsODkg QEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ CSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQ VFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwg MChrMSkJCQkjIGsxPXBkZSBlbnRyeQotCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkj IGswPWJhZCBhZGRyZXNzIChhZ2FpbikKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUg ZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCWJlcQkJ azEsIHplcm8sIDJmCQkJIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQorCW5vcAorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90 X3N1cGVycGFnZQkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkj IGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBp biB0aGUgUERFIGlmIHZhbGlkLgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJp dCBoZXJlIHNhdmVzIGEgZmF1bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8g ZG8gc28uIFRoZXJlZm9yZSwganVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZl cmVuY2UgYml0LgorIwlJRl9WQUxJRF9TRVRfUkVGQklUKGsxLCBrMCwgMCwgMSkKKworCSMgVGhl IFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxv MCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9U TEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZO IGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdF VF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24K KworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1w ZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZs YWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMg TG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9QVEVfU1dCSVRTKGsx KQkJCQkjIE5vIFNXIGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf TE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VN YXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sg Zm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VN YXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdyaXRlIHRvIHRsYgor CUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyB6 ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJIyByZXR1cm4gZnJv bSBleGNlcHRpb24KKworbm90X3N1cGVycGFnZToKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg Ki8KICNlbmRpZgorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRy ZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMwYjogazA9 VlBOIChha2EgdmE+PjEwKQogCWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMwYzogazA9cGFnZSB0 YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKLQlQ VEVfTAkJazAsIDAoazEpCQkJIzBlOiBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsx KQkJCSMwZjogazE9bG8wIHB0ZQorCisJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQor CisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIworCSMg WFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRlciBi dXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRha2Ug dGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NFVF9S RUZCSVQoazAsIGsxLCAwLCAyKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlr MCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjMTI6IGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlD TEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMx NTogbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0 ZQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF VF9SRUZCSVQoazAsIGsxLCAwLCAzKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRD MAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK IAl0bGJ3cgkJCQkJCSMxYTogd3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCiAJZXJldAkJCQkJ CSMxZjogcmV0VXJuIGZyb20gZXhjZXB0aW9uCisKIDE6CWoJCU1pcHNUTEJNaXNzRXhjZXB0aW9u CQkjMjA6IGtlcm5lbCBleGNlcHRpb24KIAlub3AJCQkJCQkjMjE6IGJyYW5jaCBkZWxheSBzbG90 CiAyOglqCQlTbG93RmF1bHQJCQkjMjI6IG5vIHBhZ2UgdGFibGUgcHJlc2VudApAQCAtMjY1LDcg KzM2NSw3IEBACiAjZW5kaWYKIAogLyoKLSAqIFNhdmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3Rh dGUuCisgKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lzdGVyIHN0YXRlIHdoZW4gdGFraW5nIGFuIGV4 Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZS4KICAqCiAgKiBUaGlzIGlzIHN0cmFpZ2h0Zm9yd2FyZCBl eGNlcHQgZm9yIHNhdmluZyB0aGUgZXhjZXB0aW9uIHByb2dyYW0KICAqIGNvdW50ZXIuIFRoZSBk ZGIgYmFja3RyYWNlIGNvZGUgbG9va3MgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgpAQCAtNDA2 LDYgKzUwNiw3IEBACiAJU0FWRV9SRUcoYTEsIFNSLCBzcCkKIAlSRVNUT1JFX0NQVQkJCSMgdjAg Y29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzLgogCXN5bmMKKwogCWVyZXQKIAkuc2V0CWF0CiBF TkQoTWlwc0tlcm5HZW5FeGNlcHRpb24pCkBAIC04ODQsMjEgKzk4NSw2MCBAQAogCVBUUl9TUkwJ CWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPXBkZSBvZmZzZXQgKGFsbW9zdCkKIAliZXEJ CWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09MCAtLSBubyBwZGUgdGFiCiAJYW5k aQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAs IGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBk ZSBlbnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGswPXBkZSBlbnRyeSBhZGRyZXNzCisJ UFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAKIAkvKiBWYWxpZGF0ZSBwZGUgdGFi bGUgcG9pbnRlci4gICovCiAJYmVxegkJazEsIDNmCiAJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVX X1BNQVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJ IyBrMT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3BnCQkj ID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5 IChkZWxheSBzbG90KQorCisJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCisJYW5k aQkJazEsIFBURV9WUgorCWJlcXoJCWsxLCAzZgorCW5vcAorCisJIyBUaGUgUERFIGlzIGFjdHVh bGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVB Ul9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8w IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIg bG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5f RlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFy ZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdh aW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJ CWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8g dGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJIyBDTEVBUl9QVEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNX IGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBw YWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UK KwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRl ZAorCUNPUDBfU1lOQworCisJYgkJdGxiX2luc2VydF9lbnRyeQorCW5vcAorCitub3Rfc3BnOgor I2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09Q XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdF X1NISUZUIC0gUFRFU0hJRlQJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURU1BU0sJCQkjIGsw PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNz CiAJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9dGhpcyBQVEUKIAogCS8qIFZhbGlkYXRlIHBhZ2Ug dGFibGUgZW50cnkuICAqLwotCWFuZGkJCWswLCBQVEVfVgorCWFuZGkJCWswLCBQVEVfVlIKIAli ZXF6CQlrMCwgM2YKIAlub3AKIApAQCAtOTA4LDI1ICsxMDQ4LDMxIEBACiAJbm9wCiAKIAlQVEVf TAkJazAsIDAoazEpCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklU UyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xF QVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQ VEVfTAkJazAsIFBURVNJWkUoazEpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMw CWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlDT1AwX1NZTkMKIAogCWIJCXRsYl9pbnNlcnRfZW50 cnkKIAlub3AKIAogb2RkX3BhZ2U6CiAJUFRFX0wJCWswLCAtUFRFU0laRShrMSkKLQlQVEVfTAkJ azEsIDAoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP UF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMw CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgMChrMSkKKworCUNMRUFSX1BU RV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQogCUNPUDBfU1lO QwogCiB0bGJfaW5zZXJ0X2VudHJ5OgpAQCAtOTM2LDExICsxMDgyLDE1IEBACiAJYmx0egkJazAs IHRsYl9pbnNlcnRfcmFuZG9tCiAJbm9wCiAJdGxid2kKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NP UF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9wCiAKIHRsYl9pbnNlcnRf cmFuZG9tOgogCXRsYndyCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwor CUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCkBAIC0xMDU0LDIxICsxMjA0LDY3IEBACiAjaWZk ZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPVZQ TgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRk cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQorCisjaWZkZWYgTUlQUzY0 X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgoazEp CQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90X2tz cGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUg ZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCisJ IyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBU TEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NP UF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRo ZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCku CisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9z dGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkj IGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBU TEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRz CisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJ VFMoazEpCQkJCSMgTm8gU1cgQml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8w X1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIg UGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdl TWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMg UGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8g dGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT SwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVy biBmcm9tIGV4Y2VwdGlvbgorCitub3Rfa3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg Ki8KKwogCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChh Z2FpbikKICAgCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5v IHBhZ2UgdGFibGUKICNlbmRpZgogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJ IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjIGswPXBhZ2UgdGFiIG9mZnNldAog CVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNzCisKIAlQVEVfTAkJazAsIDAo azEpCQkJIyBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQkJCSMgazE9bG8xIHB0 ZQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKwogCUNMRUFSX1BURV9TV0JJVFMo azApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCiAJ Q09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1Bf MF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkj IGswPWxvMSBwdGUKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf Q09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCiAJQ09QMF9TWU5DCiAJdGxid3IJCQkJCSMg d3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2Nw dS5jIGIvc3lzL21pcHMvbWlwcy9jcHUuYwotLS0gYS9zeXMvbWlwcy9taXBzL2NwdS5jCisrKyBi L3N5cy9taXBzL21pcHMvY3B1LmMKQEAgLTMxMyw2ICszMTMsMjUgQEAKIAljcHVpbmZvLT5sMi5k Y19zaXplID0gY3B1aW5mby0+bDIuZGNfbGluZXNpemUKIAkgICAgKiBjcHVpbmZvLT5sMi5kY19u c2V0cyAqIGNwdWluZm8tPmwyLmRjX253YXlzOwogI2VuZGlmCisKKwkvKgorCSAqIFByb2JlIFBh Z2VNYXNrIHJlZ2lzdGVyIHRvIHNlZSB3aGF0IHNpemVzIG9mIHBhZ2VzIGFyZSBzdXBwb3J0ZWQK KwkgKiBieSB3cml0aW5nIGFsbCBvbmUncyBhbmQgdGhlbiByZWFkaW5nIGl0IGJhY2suCisJICov CisJbWlwc193cl9wYWdlbWFzayh+MCk7CisJY3B1aW5mby0+dGxiX3BnbWFzayA9IG1pcHNfcmRf cGFnZW1hc2soKTsKKwltaXBzX3dyX3BhZ2VtYXNrKE1JUFMzX1BHTUFTS180Syk7CisKKyNpZmRl ZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18xNkspID09IDApCisJCXBhbmljKCIlczogMTZLIHNpemVkIHBhZ2VzIGFyZSBub3Qgc3Vw cG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1bmNfXyk7CisjZW5kaWYgLyogS1NUQUNL X0xBUkdFX1BBR0UgKi8KKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpZiAoKGNwdWluZm8tPnRs Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMU0pID09IDApCisJCXBhbmljKCIlczogMU0gc2l6ZWQg cGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsK KyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH0KIAogdm9pZApAQCAtMzg5LDYgKzQwOCwz MCBAQAogCQkJcHJpbnRmKCJGaXhlZCBtYXBwaW5nIik7CiAJCX0KIAkJcHJpbnRmKCIsICVkIGVu dHJpZXMgIiwgY3B1aW5mby50bGJfbmVudHJpZXMpOworCQlpZiAoY3B1aW5mby50bGJfcGdtYXNr KSB7CisJCQlwcmludGYoIigiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19Q R01BU0tfTUFTS1gpCisJCQkJcHJpbnRmKCIxSyAiKTsKKwkJCXByaW50ZigiNEsgIik7CisJCQlp ZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykKKwkJCQlwcmludGYoIjE2 SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRLKQorCQkJ CXByaW50ZigiNjRLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFT S18yNTZLKQorCQkJCXByaW50ZigiMjU2SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sg JiBNSVBTM19QR01BU0tfMU0pCisJCQkJcHJpbnRmKCIxTSAiKTsKKwkJCWlmIChjcHVpbmZvLnRs Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNE0pCisJCQkJcHJpbnRmKCI0TSAiKTsKKwkJCWlmIChj cHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZNKQorCQkJCXByaW50ZigiMTZNICIp OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NE0pCisJCQkJcHJp bnRmKCI2NE0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1 Nk0pCisJCQkJcHJpbnRmKCIyNTZNICIpOworCQkJcHJpbnRmKCJwZyBzaXplcykiKTsKKwkJfQor CQlwcmludGYoIlxuIik7CiAJfQogCiAJaWYgKGNwdWluZm8udGxiX3BnbWFzaykgewpkaWZmIC0t Z2l0IGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFy YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNs dWRlL3ZtcGFyYW0uaApAQCAtMTAwLDE1ICsxMDAsNDcgQEAKICNkZWZpbmUJRlJFRUJTRDMyX1VT UlNUQUNLCSgoKHZtX29mZnNldF90KTB4ODAwMDAwMDApIC0gUEFHRV9TSVpFKQogI2VuZGlmCiAK KyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKIC8qCi0gKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZh dGlvbnMuIChub3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0Ci0gKiBJIGNvcGllZCBpdCBmcm9tIEFS TSkKKyAqIEVuYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zOiAxIGxldmVsLgorICoKKyAqIFZN X05SRVNFUlZMRVZFTCBzcGVjaWZpZXMgYSBudW1iZXIgb2YgcHJvbW90aW9uIGxldmVscyBlbmFi bGVkLgorICogQ3VycmVudGx5IG1pcHM2NCBvbmx5IHN1cHBvcnRzIG9uZSBzaXplIG9yIGxldmVs IChWTV9MRVZFTF8wX09SREVSKSBvZgorICogc3VwZXJwYWdlcyAoMk1CKQorICovCisjaWZuZGVm CVZNX05SRVNFUlZMRVZFTAorI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCQkxCisjZW5kaWYKKwor LyoKKyAqIExldmVsIDAgcmVzZXJ2YXRpb25zIGNvbnNpc3Qgb2YgNTEyICgyXjkpIHBhZ2VzICgy TUIpLgorICovCisjaWZuZGVmCVZNX0xFVkVMXzBfT1JERVIKKyNkZWZpbmUJVk1fTEVWRUxfMF9P UkRFUgkJOQorI2VuZGlmCisKKy8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMg NE1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJCQkxMQorCisjZWxzZSAvKiAhIE1JUFM2 NF9ORVdfUE1BUCAqLworCisvKgorICogRGlzYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zLgog ICovCiAjaWZuZGVmCVZNX05SRVNFUlZMRVZFTAogI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCTAK ICNlbmRpZgogCiAvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KKyAq LworI2RlZmluZQlWTV9ORlJFRU9SREVSCQk5CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1B UCAqLworCisvKgogICogSG93IG1hbnkgcGh5c2ljYWwgcGFnZXMgcGVyIGttZW0gYXJlbmEgdmly dHVhbCBwYWdlLgogICovCiAjaWZuZGVmIFZNX0tNRU1fU0laRV9TQ0FMRQpAQCAtMTc3LDExICsy MDksNiBAQAogI2RlZmluZQlWTV9MT1dNRU1fQk9VTkRBUlkJKCh2bV9wYWRkcl90KTB4MjAwMDAw MDApCiAjZW5kaWYKIAotLyoKLSAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAxTUIu Ci0gKi8KLSNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQotCiAjZGVmaW5lCVpFUk9fUkVHSU9OX1NJ WkUJKDY0ICogMTAyNCkJLyogNjRLQiAqLwogCiAjaWZuZGVmIF9fbWlwc19uNjQKZGlmZiAtLWdp dCBhL3N5cy9taXBzL2luY2x1ZGUvcHRlLmggYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUuaApAQCAt MjksNiArMjksMTAgQEAKICNpZm5kZWYJX01BQ0hJTkVfUFRFX0hfCiAjZGVmaW5lCV9NQUNISU5F X1BURV9IXwogCisjaWYgIWRlZmluZWQoX0tFUk5FTCkKKyNpbmNsdWRlIDxtYWNoaW5lL3BhcmFt Lmg+CisjZW5kaWYKKwogI2lmbmRlZiBfTE9DT1JFCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8 fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KIHR5cGVkZWYJdWlu dDY0X3QgcHRfZW50cnlfdDsKQEAgLTcyLDIyICs3NiwyNSBAQAogICogTk9URTogVGhpcyBtZWFu cyB0aGF0IGZvciAzMi1iaXQgdXNlIG9mIENQMCwgd2UgYXJlbid0IGFibGUgdG8gc2V0IHRoZSB0 b3AKICAqIGJpdCBvZiBQRk4gdG8gYSBub24temVybyB2YWx1ZSwgYXMgc29mdHdhcmUgaXMgdXNp bmcgaXQhICBUaGlzIHBoeXNpY2FsCiAgKiBtZW1vcnkgc2l6ZSBsaW1pdCBtYXkgbm90IGJlIHN1 ZmZpY2llbnRseSBlbmZvcmNlZCBlbHNld2hlcmUuCisgKgorICogWFhYUlc6IE9uIENIRVJJLCBi aXRzIDYzIGFuZCA2MiBhcmUgdXNlZCBmb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0Cisg KiBwcmV2ZW50IGxvYWRpbmcgYW5kIHN0b3Jpbmcgb2YgY2FwYWJpbGl0aWVzLCBzbyB3ZSBoYXZl IHJlZHVjZWQgdGhlIDU1LWJpdAorICogc2hpZnQgdG8gNTMgYml0cy4KICAqLwogI2lmIGRlZmlu ZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklU ICovCi0jZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTUpCi0jZGVmaW5lCVRMQkxPX1NXQklU U19DTEVBUl9TSElGVAkoOSkKLSNkZWZpbmUJVExCTE9fUEZOX01BU0sJCTB4M0ZGRkZGRkMwVUxM CisjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTMpCQkvKiBYWFhSVzogV2FzIDU1LiAqLwor I2RlZmluZQlUTEJMT19SRUZfQklUX1NISUZUCSg2MSkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX0NM RUFSX1NISUZUCSgxMSkJLyogWFhYU1M6IFdhcyA5LiAqLworI2RlZmluZQlUTEJMT19QRk5fTUFT SwkJMHhGRkZGRkZDMFVMTAorI2RlZmluZQlUTEJfMU1fU1VQRVJQQUdFX1NISUZUCShQRFJTSElG VCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4N0YgPDwgVExCTE9f U1dCSVRTX1NISUZUKQogI2Vsc2UKICNkZWZpbmUJVExCTE9fU1dCSVRTX1NISUZUCSgyOSkKICNk ZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSgzKQogI2RlZmluZQlUTEJMT19QRk5fTUFT SwkJKDB4MUZGRkZGQzApCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkw eDcgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2VuZGlmCiAjZGVmaW5lCVRMQkxPX1BGTl9TSElG VAkJKDYpCi0jZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDcgPDwgVExC TE9fU1dCSVRTX1NISUZUKQotI2RlZmluZQlUTEJMT19QQV9UT19QRk4ocGEpCSgoKChwYSkgPj4g VExCX1BBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSykKLSNk ZWZpbmUJVExCTE9fUEZOX1RPX1BBKHBmbikJKCh2bV9wYWRkcl90KSgocGZuKSA+PiBUTEJMT19Q Rk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NISUZUKQotI2RlZmluZQlUTEJMT19QVEVfVE9fUEZOKHB0 ZSkJKChwdGUpICYgVExCTE9fUEZOX01BU0spCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QQShwdGUp CShUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRlKSkpKQogCiAvKgogICogWFhY IFRoaXMgY29tbWVudCBpcyBub3QgY29ycmVjdCBmb3IgYW55dGhpbmcgbW9yZSBtb2Rlcm4gdGhh biBSNEsuCkBAIC0xMjEsMjUgKzEyOCw4MyBAQAogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242 NCkgKi8KIAogLyoKKyAqIFBURSBIYXJkd2FyZSBCaXRzIChFbnRyeUxvMC0xIHJlZ2lzdGVyIGZp ZWxkcykKKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtLS0tLS0tLS0tLS0tLS0gNiA1IC0gMyAgMiAg IDEgICAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgICAgICAgUEZOICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8CisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICoKKyAqIExvd2VyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICA1MiAt LS0tLS0tLS0tLS0tLS0tLS0tLSAzNCAgMzMgLS0tLS0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAy ICAgMSAgIDAKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgIFJlc2VydmVkIChaZXJvKSAg ICAgfCAgICAgICAgICBQRk4gICAgICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKgogICogVExCIGZsYWdzIG1hbmFnZWQgaW4gaGFyZHdhcmU6CisgKiAgICBQ Rk46CVBhZ2UgRnJhbWUgTnVtYmVyLgogICogCUM6CUNhY2hlIGF0dHJpYnV0ZS4KICAqIAlEOglE aXJ0eSBiaXQuICBUaGlzIG1lYW5zIGEgcGFnZSBpcyB3cml0YWJsZS4gIEl0IGlzIG5vdAogICog CQlzZXQgYXQgZmlyc3QsIGFuZCBhIHdyaXRlIGlzIHRyYXBwZWQsIGFuZCB0aGUgZGlydHkKICAq IAkJYml0IGlzIHNldC4gIFNlZSBhbHNvIFBURV9STy4KLSAqIAlWOglWYWxpZCBiaXQuICBPYnZp b3VzLCBpc24ndCBpdD8KKyAqIAlWUjoJVmFsaWQvUmVmZXJlbmNlIGJpdC4gU2VlIGFsc28gUFRF X1NWLgogICogCUc6CUdsb2JhbCBiaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBtYXBwaW5nIGlz IHByZXNlbnQKICAqIAkJaW4gRVZFUlkgYWRkcmVzcyBzcGFjZSwgYW5kIHRvIGlnbm9yZSB0aGUg QVNJRCB3aGVuCiAgKiAJCWl0IGlzIG1hdGNoZWQuCiAgKi8KICNkZWZpbmUJUFRFX0MoYXR0cikJ CSgoYXR0ciAmIDB4MDcpIDw8IDMpCiAjZGVmaW5lCVBURV9DX1VOQ0FDSEVECQkoUFRFX0MoTUlQ U19DQ0FfVU5DQUNIRUQpKQogI2RlZmluZQlQVEVfQ19DQUNIRQkJKFBURV9DKE1JUFNfQ0NBX0NB Q0hFRCkpCiAjZGVmaW5lCVBURV9ECQkJMHgwNAotI2RlZmluZQlQVEVfVgkJCTB4MDIKKyNkZWZp bmUJUFRFX1ZSCQkJMHgwMgogI2RlZmluZQlQVEVfRwkJCTB4MDEKIAorI2lmZGVmIENQVV9DSEVS SQorLyoKKyAqIENIRVJJIEVudHJ5TG8gZXh0ZW5zaW9ucyB0aGF0IGxpbWl0IHN0b3JpbmcgbG9h ZGluZyBhbmQgc3RvcmluZyB0YWdnZWQKKyAqIHZhbHVlcy4KKyAqLworI2RlZmluZQlQVEVfU0MJ CQkoMHgxVUxMIDw8IDYzKQorI2RlZmluZQlQVEVfTEMJCQkoMHgxVUxMIDw8IDYyKQorI2VuZGlm CisKIC8qCisgKiBQVEUgU29mdHdhcmUgQml0cworICoKKyAqIFVwcGVyIGJpdHMgb2YgYSAzMiBi aXQgUFRFOgorICoKKyAqICAgICAzMSAgIDMwICAgMjkKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisg KiAgIHwgTU4gfCBXICB8IFJPIHwKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisgKgorICogVXBwZXIg Yml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogICA2My02MiAgIDYxLTYwICA1OSAgIDU4IC0t IDU2ICAgIDU1ICAgNTQgICA1MworICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqICB8ICBSRyAgfCAgICAgIHwgU1YgfCBQRyBTWiBJRFggfCBNTiB8 IFcgIHwgUk8gfAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqCiAgKiBWTSBmbGFncyBtYW5hZ2VkIGluIHNvZnR3YXJlOgorICoJUkc6CVJlZ2lv bi4JIChSZXNlcnZlZC4gQ3VycmVudGx5IG5vdCB1c2VkLikKKyAqCVNWOglTb2Z0IFZhbGlkIGJp dC4KKyAqCVBHIFNaIElEWDogUGFnZSBTaXplIEluZGV4ICgwLTcpLgorICoJCUluZGV4CVBhZ2Ug TWFzayAoQmluYXJ5KQlIVyBQYWdlIFNpemUKKyAqCQktLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0t CS0tLS0tLS0tLS0tLQorICoJCTAJMDAwMCAwMDAwIDAwMDAgMDAwMAkgIDRLCisgKgkJMQkwMDAw IDAwMDAgMDAwMCAwMDExCSAxNksKKyAqCQkyCTAwMDAgMDAwMCAwMDAwIDExMTEJIDY0SworICoJ CTMJMDAwMCAwMDAwIDAwMTEgMTExMQkyNTZLCisgKgkJNAkwMDAwIDAwMDAgMTExMSAxMTExCSAg MU0KKyAqCQk1CTAwMDAgMDAxMSAxMTExIDExMTEJICA0TQorICoJCTYJMDAwMCAxMTExIDExMTEg MTExMQkgMTZNCisgKiAoTUlQUyAzOikKKyAqCQk3CTAwMTEgMTExMSAxMTExIDExMTEJIDY0TQor ICoJCTgJMTExMSAxMTExIDExMTEgMTExMQkyNTZNIChOb3QgY3VycmVudGx5IHN1cHBvcnRlZCkK KyAqCiAgKiAJUk86CVJlYWQgb25seS4gIE5ldmVyIHNldCBQVEVfRCBvbiB0aGlzIHBhZ2UsIGFu ZCBkb24ndAogICogCQlsaXN0ZW4gdG8gcmVxdWVzdHMgdG8gd3JpdGUgdG8gaXQuCiAgKiAJVzoJ V2lyZWQuICA/Pz8KQEAgLTE1MSwxMyArMjE2LDI5MSBAQAogI2RlZmluZQlQVEVfUk8JCQkoKHB0 X2VudHJ5X3QpMHgwMSA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9XCQkJKChw dF9lbnRyeV90KTB4MDIgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVfTUFOQUdF RAkJKChwdF9lbnRyeV90KTB4MDQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2lmIGRlZmluZWQo X19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICov CisjZGVmaW5lCVBURV9QU18xNksJCSgocHRfZW50cnlfdCkweDA4IDw8IFRMQkxPX1NXQklUU19T SElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0SwkJKChwdF9lbnRyeV90KTB4MTAgPDwgVExCTE9fU1dC SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMjU2SwkJKChwdF9lbnRyeV90KTB4MTggPDwgVExC TE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMU0JCSgocHRfZW50cnlfdCkweDIwIDw8 IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzRNCQkoKHB0X2VudHJ5X3QpMHgy OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU18xNk0JCSgocHRfZW50cnlf dCkweDMwIDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0TQkJKChwdF9l bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfSURYX01B U0sJCSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRF X1BTSURYX05CSVRTX1RPX0xFRlQJCTUKKyNkZWZpbmUJUFRFX1BTSURYX05CSVRTX1RPX1JJR0hU CTU2CisjZGVmaW5lCVBURV9QRk5fTkJJVFNfVE9fTEVGVAkJMTEKKyNkZWZpbmUJUFRFX1BGTl9O QklUU19UT19SSUdIVAkJNgorI2RlZmluZQlQVEVfSFdGTEFHU19OQklUU19UT19MRUZUCTU4Cisj ZGVmaW5lCVNXX1ZBTElECQkweDQwCisjZGVmaW5lCVBURV9TVgkJCSgocHRfZW50cnlfdClTV19W QUxJRCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZWxzZQorI2RlZmluZQlQVEVfUFNfSURYX01B U0sJCTAKKyNkZWZpbmUJUFRFX1NWCQkJMAorI2VuZGlmCisKKy8qCisgKiBQcm9tb3Rpb24gdG8g YSA0TUIgKFBERSkgcGFnZSBtYXBwaW5nIHJlcXVpcmVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcg NEtCCisgKiAoUFRFKSBwYWdlIG1hcHBpbmdzIGhhdmUgaWRlbnRpY2FsIHNldHRpbmdzIGZvciB0 aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqLworI2RlZmluZQlQR19QUk9NT1RFX01BU0sJKFBURV9H IHwgUFRFX1ZBTElEIHwgUFRFX0QgfCBQVEVfQ19VTkNBQ0hFRCB8IFwKKwkJCVBURV9DX0NBQ0hF IHwgUFRFX1JPIHwgUFRFX1cgfCBQVEVfTUFOQUdFRCB8IFwKKwkJCVBURV9SRUYpCisKKyNpZmRl ZiBNSVBTNjRfTkVXX1BNQVAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpCSgoKHB0ZSkg JiBQVEVfUFNfSURYX01BU0spID4+IDU2KQorI2RlZmluZQlUTEJNQVNLX0lEWF9UT19NQVNLKGlk eCkgKCgoMSA8PCAoKGlkeCkgPDwgMSkpIC0gMSkgPDwgVExCTUFTS19TSElGVCkKKyNkZWZpbmUJ VExCTE9fUFRFX1RPX01BU0socHRlKQlUTEJNQVNLX0lEWF9UT19NQVNLKFRMQkxPX1BURV9UT19J RFgocHRlKSkKKyNkZWZpbmUJVExCTUFTS180S19QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDAp CisjZGVmaW5lCVRMQk1BU0tfMTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygxKQorI2RlZmlu ZQlUTEJNQVNLXzY0S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMikKKyNkZWZpbmUJVExCTUFT S18yNTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygzKQorI2RlZmluZQlUTEJNQVNLXzFNX1BB R0UJCVRMQk1BU0tfSURYX1RPX01BU0soNCkKKyNkZWZpbmUJVExCTUFTS180TV9QQUdFCQlUTEJN QVNLX0lEWF9UT19NQVNLKDUpCisjZGVmaW5lCVRMQk1BU0tfMTZNX1BBR0UJVExCTUFTS19JRFhf VE9fTUFTSyg2KQorI2RlZmluZQlUTEJNQVNLXzY0TV9QQUdFCVRMQk1BU0tfSURYX1RPX01BU0so NykKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisjZGVmaW5lCVRMQkxPX1BURV9UT19J RFgocHRlKSAJMAorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCTAKKyNlbmRpZiAvKiAh IE1JUFM2NF9ORVdfUE1BUCAqLwogCiAvKgogICogUFRFIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZv ciBiaXRzIGRlZmluZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUJcHRlX2NsZWFyKHB0ZSwgYml0KQko KihwdGUpICY9IH4oYml0KSkKLSNkZWZpbmUJcHRlX3NldChwdGUsIGJpdCkJKCoocHRlKSB8PSAo Yml0KSkKLSNkZWZpbmUJcHRlX3Rlc3QocHRlLCBiaXQpCSgoKihwdGUpICYgKGJpdCkpID09IChi aXQpKQorI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcHRlX2NsZWFyKHB0 X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlICY9ICh+Yml0KTsKK30K Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9zZXQocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRy eV90IGJpdCkKK3sKKworCSpwdGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50Citw dGVfdGVzdChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgo KnB0ZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9jbGVh cihwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICop cGRlICY9ICh+Yml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9zZXQocGRfZW50 cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50cnlfdCAqKXBkZSB8PSBi aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV90ZXN0KHBkX2VudHJ5X3QgKnBkZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqKHB0X2VudHJ5X3QgKilwZGUgJiBiaXQp ID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QQV9UT19Q Rk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfUEFHRV9TSElGVCkg PDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKTsKK30KKworc3RhdGljIF9faW5s aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BGTl9UT19QQShwdF9lbnRyeV90IHBmbikKK3sKKworCXJl dHVybiAoKHZtX3BhZGRyX3QpKHBmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NI SUZUKTsKK30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BURV9UT19QRk4o cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKHB0ZSAmIFRMQkxPX1BGTl9NQVNLKTsKK30K KworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisjZGVmaW5lCVBURV9SRUYJCVBURV9WUgorI2Rl ZmluZQlQVEVfVkFMSUQgCVBURV9TVgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRlKQkJCXB0ZV90 ZXN0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2NsZWFyKHB0ZSkJCXB0ZV9jbGVh cigocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQkJcHRlX3NldCgocHRl KSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQlhdG9taWNfY2xl YXJfbG9uZygocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSkJ CWF0b21pY19zZXRfbG9uZygocHRlKSwgUFRFX1JFRikKKworI2Vsc2UgLyogISBNSVBTNjRfTkVX X1BNQVAgKi8KKworI2RlZmluZQlQVEVfUkVGCQkwCisjZGVmaW5lCVBURV9WQUxJRAlQVEVfVlIK KworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJCQkwCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRl KQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFy KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSwgYml0KQorCisjZW5kaWYgLyog ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlwdGVfaXNfdmFsaWQocHRlKQkJcHRlX3Rl c3QoKHB0ZSksIFBURV9WQUxJRCkKKworI2lmIGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5l ZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21p Y19jbGVhcihwdGUsIGJpdCkJYXRvbWljX2NsZWFyXzY0KChwdGUpLCBiaXQpCisjZGVmaW5lCXB0 ZV9hdG9taWNfc2V0KHB0ZSwgYml0KQlhdG9taWNfc2V0XzY0KChwdGUpLCBiaXQpCisjZGVmaW5l CXB0ZV9sb2FkX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfNjQocHRlcCwgcHRl KQorI2RlZmluZQlwZGVfbG9hZF9zdG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19y ZWFkYW5kc2V0XzY0KFwKKwkJCQkJCShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5l CXB0ZV9hdG9taWNfc3RvcmUocHRlcCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzY0KHB0ZXAsIHB0 ZSkKKyNkZWZpbmUgcHRlX3N0b3JlKHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9sb25nICopKHB0 ZXApID0gKHVfbG9uZykocHRlKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBk ZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUpCisKKworI2Vsc2UgLyogISBQSFlTQUREUl82 NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNfY2xl YXJfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0b21p Y19zZXRfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRlKQlh dG9taWNfcmVhZGFuZHNldF8zMihwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3JlKHBk ZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfMzIoXAorCQkJCQkJKHB0X2Vu dHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBwdGUp CWF0b21pY19zdG9yZV9yZWxfMzIocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRlcCwg cHRlKQlkbyB7CQlcCisJKih1X2ludCAqKShwdGVwKSA9ICh1X2ludCkocHRlKTsJXAorfSB3aGls ZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBkZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUp CisKKyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZW5kaWYgLyogISBfTE9DT1JF ICovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog IFBIWVNBRERSXzY0X0JJVCAqLworCisjaWZuZGVmIF9MT0NPUkUKKy8qCisgKiBDaGVjayB0byBz ZWUgaWYgYSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgKFBhZ2VTaXplID4gNEspIFBURS4K KyAqCisgKiBPbiBfX21pcHNfbjY0IHRoZSBrZXJuZWwgdXNlcyB0aGUgdmlydHVhbCBtZW1vcnkg YWRkcmVzcyByYW5nZSBmcm9tCisgKiBWTV9NSU5fS0VSTkVMX0FERFJFU1MgKDB4YzAwMDAwMDAw MDAwMDAwMCkgdG8gVk1fTUFYX0tFUk5FTF9BRERSRVNTCisgKiAoMHhjMDAwMDA4MDAwMDAwMDAw KS4gVGhlcmVmb3JlLCBhIHZhbGlkIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgUERFCisgKiAoYSBw b2ludGVyIHRvIGEgcGFnZSB0YWJsZSkgd2lsbCBoYXZlIGJpdHMgNjEgdG8gNDAgc2V0IHRvIHpl cm8uIEEKKyAqIHN1cGVycGFnZSB3aWxsIGhhdmUgb25lIG9mIHRoZSBzdXBlcnBhZ2Ugc2l6ZSBi aXRzIChiaXRzIDU4IHRvIDU2KQorICogc2V0LgorICovCisKKy8qIElzIHRoZSBQREUgYSBzdXBl cnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfc3VwZXJw YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ VEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUFRFIGEgc3VwZXJwYWdlIG9m IGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcHRlX2lzX3N1cGVycGFnZShwdF9l bnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAw KTsKK30KKworLyogSXMgdGhlIFBERSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5s aW5lIGludAorcGRlX2lzXzFtX3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1 cm4gKCgocHRfZW50cnlfdCkqcGRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisv KiBJcyB0aGUgUFRFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw dGVfaXNfMW1fc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVybiAoKCpwdGUg JiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIFBoeXNpY2FsIEFkZHJlc3MgdG8g U3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJlci4gKi8KK3N0YXRpYyBfX2lubGluZSBwdF9l bnRyeV90CitUTEJMT19QQV9UT19TUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgo cGEgPj4gVExCXzFNX1NVUEVSUEFHRV9TSElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmCisJICAg IFRMQkxPX1BGTl9NQVNLKTsKK30KKworLyogU3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJl ciB0byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RM QkxPX1NQRk5fVE9fUEEocHRfZW50cnlfdCBzcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJf dCkoc3BmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8CisJICAgIFRMQl8xTV9TVVBFUlBBR0VfU0hJ RlQpOworfQorCisvKiBTdXBlcnBhZ2UgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1NQVEVfVE9fUEEocHRf ZW50cnlfdCBwdGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BERV9U T19QQShwZF9lbnRyeV90IHBkZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9f UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisKKworLyogQW4gNEtCIFBhZ2UgVGFi bGUgRW50cnkgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk cl90CitUTEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxP X1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5l IHZtX3BhZGRyX3QKK1RMQkxPX1BERV9UT19QQShwZF9lbnRyeV90IHBkZSkKK3sKKworCXJldHVy biAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOwor fQorI2VuZGlmIC8qICEgX0xPQ09SRSAqLworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAq LworCisjZGVmaW5lCXB0ZV9pc19yZWZlcmVuY2VkKHB0ZSkJCTAKKyNkZWZpbmUJcHRlX3JlZmVy ZW5jZV9yZXNldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZlcmVuY2VfcGFnZShwdGUpCisjZGVmaW5l CXBkZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZQlwdGVfaXNfc3VwZXJwYWdlKHBkZSkJ CTAKKyNkZWZpbmUgcGRlX2lzXzFtX3N1cGVycGFnZShwdGUpCTAKKyNkZWZpbmUgcHRlX2lzXzFt X3N1cGVycGFnZShwdGUpCTAKKworI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm1f cGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChU TEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisjZW5kaWYgLyogISBf TE9DT1JFICovCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KIAogLyogQXNzZW1ibHkg c3VwcG9ydCBmb3IgUFRFIGFjY2VzcyovCiAjaWZkZWYgTE9DT1JFCkBAIC0xNjcsMTYgKzUxMCwx MDQgQEAKICNkZWZpbmUJUFRFTUFTSwkJCTB4ZmY4CiAjZGVmaW5lCVBURVNJWkUJCQk4CiAjZGVm aW5lCVBURV9MCQkJbGQKKyNkZWZpbmUJUFRFX1MJCQlzZAogI2RlZmluZQlQVEVfTVRDMAkJZG10 YzAKLSNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhwcikKLSNlbHNlCisjZGVmaW5lCUNMRUFSX1BU RV9TV0JJVFMocikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisvKiBTdXBlcnBhZ2UgYW5k IHJlZmVyZW5jZWQgYml0IGVtdWxhdGlvbiBBU00gbWFjcm9zLiAqLworCisvKgorICogR0VUX1NV UEVSUEFHRV9JRFgocikKKyAqCisgKiBHZXQgdGhlIHN1cGVycGFnZSBpbmRleCBmcm9tIHRoZSBQ VEUgYnkgc2hpZnRpbmcgaXQgbGVmdCBieQorICogUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgKGNs ZWFyaW5nIHRoZSB1cHBlciBzb2Z0Yml0cykgYW5kIHRoZW4gYmFjayB0byB0aGUKKyAqIHJpZ2h0 IGJ5IChQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQp IGNsZWFyaW5nCisgKiBhbGwgdGhlIGxvd2VyIGJpdHMgaW4gdGhlIHByb2Nlc3MuCisgKi8KKyNk ZWZpbmUgR0VUX1NVUEVSUEFHRV9JRFgocikJCQkJXAorCWRzbGwJciwgKFBURV9QU0lEWF9OQklU U19UT19MRUZUKTsJCVwKKwlkc3JsMzIJciwgKFBURV9QU0lEWF9OQklUU19UT19SSUdIVCArIFBU RV9QU0lEWF9OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfSFdfVExCX0ZMQUdTKHIp CisgKgorICogR2V0IHRoZSBsb3dlciBoYXJkd2FyZSBUTEIgZmxhZ3MgYnV0IHNoaWZ0aW5nIGxl ZnQgdGhlbiByaWdodC4KKyAqLworI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCQkJCVwKKwlk c2xsMzIJciwgKFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMik7CVwKKwlkc3JsMzIJciwg KFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9PRERfMU1fUEZO X0ZST01fRVZFTihyKQorICoKKyAqIEdldCB0aGUgb2RkIDFNIFBGTiAoVExCIGxvMSkgZnJvbSB0 aGUgZXZlbiAxTSBQVEUuICBGaXJzdCwgbWFzayBvdXQgdGhlIFBGTgorICogZnJvbSB0aGUgZXZl biBQVEUuIFRoZW4gYWRkIDFNIHdvcnRoIG9mIHBhZ2VzIHRvIGl0ICgyNTYpLiBGaW5hbGx5LCBz aGlmdCBpdAorICogYmFjayB0byBpdHMgcG9zaXRpb24gaW4gdGhlIFBURS4KKyAqLworI2RlZmlu ZSBHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4ocikJCQlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklU U19UT19MRUZUKTsJCVwKKwlkc3JsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQgKyBQVEVfUEZO X05CSVRTX1RPX1JJR0hUKTsgXAorCWRhZGRpdQlyLCByLCAoMTAyNCAqIDEwMjQgLyBQQUdFX1NJ WkUpOwlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklUU19UT19SSUdIVCkKKworLyoKKyAqIElGX1ZB TElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKyAqCisgKiBJZiBhIFBERSBp cyB2YWxpZCB0aGVuIHNldCB0aGUgcmVmZXJlbmNlZCBiaXQgKFBURV9WUikuICBUaGUgZmlyc3Qg dmVyc2lvbgorICogZG9lcyBpdCBhdG9taWNhbGx5LgorICovCisjZGVmaW5lIEFUT01JQ19SRUZC SVRfVVBEQVRFCisjaWZkZWYgQVRPTUlDX1JFRkJJVF9VUERBVEUKKworI2RlZmluZSBJRl9WQUxJ RF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlx dWUgIyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMik7CQlc CisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQgIyMgdW5p cXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlsbGQJcjAsIG9mZnNl dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJc2NkCXIwLCBvZmZz ZXQgIyMgKHIxKSA7CQkJXAorCWJlcXoJcjAsIHRyeV9hZ2FpbiAjIyB1bmlxdWUgOwkJXAorCVBU RV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMjIHVuaXF1ZSAjIyA6CisK KyNlbHNlIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8KKworI2RlZmluZSBJRl9WQUxJRF9T RVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlxdWUg IyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMikgOwkJXAor CWFuZGkJcjAsIHIwLCBTV19WQUxJRCA7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlx dWUgOwkJXAorCVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBU RV9WUiA7CQkJXAorCVBURV9TCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMj IHVuaXF1ZSAjIyA6CisjZW5kaWYgLyogISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZWxz ZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCUdFVF9TVVBFUlBBR0VfSURYKHIp CisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikKKyNkZWZpbmUJSUZfVkFMSURfU0VUX1JFRkJJ VChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorCisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAg Ki8KKworI2Vsc2UgLyogISBMT0NPUkUgKi8KICNkZWZpbmUJUFRFU0hJRlQJCTIKICNkZWZpbmUJ UFRFMk1BU0sJCTB4ZmY4CS8qIGZvciB0aGUgMi1wYWdlIGxvMC9sbzEgKi8KICNkZWZpbmUJUFRF TUFTSwkJCTB4ZmZjCiAjZGVmaW5lCVBURVNJWkUJCQk0CiAjZGVmaW5lCVBURV9MCQkJbHcKKyNk ZWZpbmUJUFRFX1MJCQlzdwogI2RlZmluZQlQVEVfTVRDMAkJbXRjMAogI2RlZmluZQlDTEVBUl9Q VEVfU1dCSVRTKHIpCUxPTkdfU0xMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVDsgTE9OR19T UkwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUIC8qIHJlbW92ZSBzd2JpdHMgKi8KKworI2Rl ZmluZQlJU19QVEVfVkFMSUQocjAsIHIxLCBvZmZzZXQsIGxhYmVsKQorI2RlZmluZQlTRVRfUkVG X0JJVChyMCwgcjEsIG9mZnNldCkKKwogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242NCkgfHwg ZGVmaW5lZChfX21pcHNfbjMyKSAqLwogCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KQpAQCAtMjAx LDQgKzYzMiwxNyBAQAogI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKICNkZWZp bmUJTUlQUzNfUEdNQVNLXzI1Nk0JMHgxZmZmZTAwMAogCisKKy8qIFBhZ2VNYXNrIFJlZ2lzdGVy IChDUDAgUmVnaXN0ZXIgNSwgU2VsZWN0IDApIFZhbHVlcyAqLworI2RlZmluZQlNSVBTM19QR01B U0tfTUFTS1gJMHgwMDAwMTgwMAorI2RlZmluZQlNSVBTM19QR01BU0tfNEsJCTB4MDAwMDAwMDAK KyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2SwkweDAwMDA2MDAwCisjZGVmaW5lCU1JUFMzX1BHTUFT S182NEsJMHgwMDAxZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2SwkweDAwMDdlMDAwCisj ZGVmaW5lCU1JUFMzX1BHTUFTS18xTQkJMHgwMDFmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tf NE0JCTB4MDA3ZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2TQkweDAxZmZlMDAwCisjZGVm aW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2 TQkweDFmZmZlMDAwCisKICNlbmRpZiAvKiAhX01BQ0hJTkVfUFRFX0hfICovCmRpZmYgLS1naXQg YS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaCBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCkBA IC00OCw2ICs0OCw3IEBACiAKICNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KICNpbmNsdWRl IDxtYWNoaW5lL3B0ZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaWYgZGVmaW5lZChf X21pcHNfbjMyKSB8fCBkZWZpbmVkKF9fbWlwc19uNjQpIC8qIFBIWVNBRERSXzY0QklUICovCiAj ZGVmaW5lCU5LUFQJCTI1NgkvKiBtZW0gPiA0Rywgdm1fcGFnZV9zdGFydHVwIG5lZWRzIG1vcmUg S1BUcyAqLwpAQCAtNjIsMTUgKzYzLDI0IEBACiAjaW5jbHVkZSA8c3lzL19sb2NrLmg+CiAjaW5j bHVkZSA8c3lzL19tdXRleC5oPgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjaW5jbHVkZSA8 dm0vX3ZtX3JhZGl4Lmg+CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCisKIC8qCiAgKiBQ bWFwIHN0dWZmCiAgKi8KIHN0cnVjdCBwdl9lbnRyeTsKIHN0cnVjdCBwdl9jaHVuazsKIAogc3Ry dWN0IG1kX3BhZ2UgewotCWludCBwdl9mbGFnczsKIAlUQUlMUV9IRUFEKCwgcHZfZW50cnkpIHB2 X2xpc3Q7CisJdm1fbWVtYXR0cl90IHB2X21lbWF0dHI7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisJaW50IHB2X2dlbjsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisJaW50IHB2X2Zs YWdzOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiB9OwogCiAjZGVmaW5lCVBWX1RB QkxFX1JFRgkJMHgwMgkvKiByZWZlcmVuY2VkICovCkBAIC04MSwxNSArOTEsMTggQEAKICNkZWZp bmUJQVNJREdFTl9NQVNLCQkoKDEgPDwgQVNJREdFTl9CSVRTKSAtIDEpCiAKIHN0cnVjdCBwbWFw IHsKKwlzdHJ1Y3QgbXR4IHBtX210eDsKIAlwZF9lbnRyeV90ICpwbV9zZWd0YWI7CS8qIEtWQSBv ZiBzZWdtZW50IHRhYmxlICovCiAJVEFJTFFfSEVBRCgsIHB2X2NodW5rKQlwbV9wdmNodW5rOwkv KiBsaXN0IG9mIG1hcHBpbmdzIGluIHBtYXAgKi8KIAljcHVzZXRfdAlwbV9hY3RpdmU7CQkvKiBh Y3RpdmUgb24gY3B1cyAqLwogCXN0cnVjdCB7CiAJCXVfaW50MzJfdCBhc2lkOkFTSURfQklUUzsJ LyogVExCIGFkZHJlc3Mgc3BhY2UgdGFnICovCiAJCXVfaW50MzJfdCBnZW46QVNJREdFTl9CSVRT OwkvKiBpdHMgZ2VuZXJhdGlvbiBudW1iZXIgKi8KIAl9ICAgICAgcG1fYXNpZFtNQVhTTVBDUFVd OwogCXN0cnVjdCBwbWFwX3N0YXRpc3RpY3MgcG1fc3RhdHM7CS8qIHBtYXAgc3RhdGlzdGljcyAq LwotCXN0cnVjdCBtdHggcG1fbXR4OworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCXN0cnVjdCB2 bV9yYWRpeCBwbV9yb290OwkJLyogc3BhcmUgcGFnZSB0YWJsZSBwYWdlcyAqLworI2VuZGlmIC8q IE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcG1hcCAqcG1hcF90OwpA QCAtMTIxLDcgKzEzNCw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHB2X2VudHJ5IHsKIAl2bV9v ZmZzZXRfdCBwdl92YTsJLyogdmlydHVhbCBhZGRyZXNzIGZvciBtYXBwaW5nICovCi0JVEFJTFFf RU5UUlkocHZfZW50cnkpIHB2X2xpc3Q7CisJVEFJTFFfRU5UUlkocHZfZW50cnkpIHB2X25leHQ7 CiB9ICAgICAgICpwdl9lbnRyeV90OwogCiAvKgpAQCAtMTY5LDYgKzE4Miw3IEBACiAKIHZvaWQg cG1hcF9ib290c3RyYXAodm9pZCk7CiB2b2lkICpwbWFwX21hcGRldih2bV9wYWRkcl90LCB2bV9z aXplX3QpOworLy9ib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CiB2 b2lkIHBtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QsIHZtX3NpemVfdCk7CiB2bV9vZmZzZXRfdCBw bWFwX3N0ZWFsX21lbW9yeSh2bV9zaXplX3Qgc2l6ZSk7CiB2b2lkIHBtYXBfa2VudGVyKHZtX29m ZnNldF90IHZhLCB2bV9wYWRkcl90IHBhKTsKQEAgLTE3OCw2ICsxOTIsNyBAQAogdm9pZCBwbWFw X2tlbnRlcl90ZW1wb3JhcnlfZnJlZSh2bV9wYWRkcl90IHBhKTsKIHZvaWQgcG1hcF9mbHVzaF9w dmNhY2hlKHZtX3BhZ2VfdCBtKTsKIGludCBwbWFwX2VtdWxhdGVfbW9kaWZpZWQocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhKTsKK2ludCBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOwogdm9pZCBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFn ZV90LCB2bV9tZW1hdHRyX3QpOwogCiAjZW5kaWYJCQkJLyogX0tFUk5FTCAqLwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCi0t LSBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFt LmgKQEAgLTE2MywxNyArMTYzLDM4IEBACiAKICNkZWZpbmUJTUFYRFVNUFBHUwkJMQkJLyogeHh4 OiB3aHkgaXMgdGhpcyBvbmx5IG9uZT8gKi8KIAorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisv KgorICogRm9yIGEgbGFyZ2Uga2VybmVsIHN0YWNrIHBhZ2UgdGhlIEtTVEFDS19TSVpFIG5lZWRz IHRvIGJlIGEgcGFnZSBzaXplCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIChlLmcuIDE2 SykuCisgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCSgxIDw8IDE0KQkvKiBTaW5nbGUgMTZLIHBh Z2UgKi8KKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlLU1RBQ0tfU0laRQorI2RlZmluZQlLU1RB Q0tfUEFHRV9NQVNLCShLU1RBQ0tfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VT CQkoS1NUQUNLX1NJWkUgLyBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19UTEJNQVNLX01BU0sJ KChLU1RBQ0tfUEFHRV9NQVNLID4+IChUTEJNQVNLX1NISUZUIC0gMSkpIFwKKwkJCQkJPDwgVExC TUFTS19TSElGVCkKKyNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCSgoS1NUQUNLX1BBR0VfU0la RSAqIDIpIC8gUEFHRV9TSVpFKQorCisjZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisK IC8qCiAgKiBUaGUga2VybmVsIHN0YWNrIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSAoUEFHRV9T SVpFICogMikgYm91bmRhcnkuCiAgKi8KICNkZWZpbmUJS1NUQUNLX1BBR0VTCQkyCS8qIGtlcm5l bCBzdGFjayAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKEtTVEFDS19QQUdFUyAqIFBBR0VfU0la RSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlQQUdFX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BB R0VfTUFTSwkoUEFHRV9TSVpFIC0gMSkKICNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCTIJLyog cGFnZXMgb2Yga3N0YWNrIGd1YXJkOyAwIGRpc2FibGVzICovCisjZW5kaWYgLyogISBLU1RBQ0tf TEFSR0VfUEFHRSAqLwogCiAvKgogICogTWFjaCBkZXJpdmVkIGNvbnZlcnNpb24gbWFjcm9zCiAg Ki8KICNkZWZpbmUJcm91bmRfcGFnZSh4KQkJKCgoeCkgKyBQQUdFX01BU0spICYgflBBR0VfTUFT SykKICNkZWZpbmUJdHJ1bmNfcGFnZSh4KQkJKCh4KSAmIH5QQUdFX01BU0spCisjZGVmaW5lCXJv dW5kXzJtcGFnZSh4KQkJKCgoeCkgKyBQRFJNQVNLKSAmIH5QRFJNQVNLKQorI2RlZmluZQl0cnVu Y18ybXBhZ2UoeCkJCSgoeCkgJiB+UERSTUFTSykKIAogI2RlZmluZQlhdG9wKHgpCQkJKCh4KSA+ PiBQQUdFX1NISUZUKQogI2RlZmluZQlwdG9hKHgpCQkJKCh4KSA8PCBQQUdFX1NISUZUKQpkaWZm IC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9ucy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0t LSBhL3N5cy9jb25mL29wdGlvbnMubWlwcworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAg LTk3LDExICs5NywyNCBAQAogQkVSSV9MQVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBV c2UgdGhlIG5ldyBwbWFwIGZvciBNSVBTNjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVt dWxhdGlvbgorIyBhbmQgc3VwZXJwYWdlIHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlv cHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcg RW1iZWRkZWQgQ1BVIEV0aGVybmV0IENvcmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRm cGdhLmgKIAogIworIyBPcHRpb25zIGZvciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVy IHN1cHBvcnQKKyMKKworIyBVc2Ugb25lIGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0 aGUga2VybmVsIHRocmVhZCBzdGFjaworS1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwu aAorCisjCiAjIE9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFs cwogIwogQVJHRV9ERUJVRwkJCW9wdF9hcmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVz Lm1pcHMgYi9zeXMvY29uZi9maWxlcy5taXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysr IGIvc3lzL2NvbmYvZmlsZXMubWlwcwpAQCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVz LmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1p cHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlzdGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5k YXJkCittaXBzL21pcHMvcG1hcC5jCQkJb3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9t aXBzL3BtYXBfbWlwczY0LmMJCQlvcHRpb25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9w dHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFyZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5k YXJkCiBtaXBzL21pcHMvc3RhY2tfbWFjaGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZm IC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1fbWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0t LSBhL2xpYi9saWJrdm0va3ZtX21pcHMuaAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAg LTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJTUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZm ZmYKIAogI2RlZmluZQlNSVBTMzJfUEZOX01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBT NjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMwCisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZG RkZDMAogI2RlZmluZQlNSVBTX1BGTl9TSElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9f UEEocGZuKQkoKChwZm4pID4+IE1JUFNfUEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo= --b1_8cfbda1353b73aeded57f1b1746022d2--