Date: Fri, 16 Sep 2016 18:01:28 +0000 From: "sbruno (Sean Bruno)" <phabric-noreply@FreeBSD.org> To: freebsd-mips@freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <8a01977bc2405e827dd78c8dca1d7216@localhost.localdomain> In-Reply-To: <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org> References: <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--b1_8a01977bc2405e827dd78c8dca1d7216 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzg3LgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgVXBkYXRlIHJldmlldyB0byBoZWFkLgogIAogIEJ1aWxkIG9mIGxpYmt2 bSBmYWlscyBob3dldmVyIGFzIHB0ZS5oIGNoYW5nZXMgYXJlIGNhdXNpbmcgYXNzZXJ0cyB0bwog IGZpcmUuICBJIHN1c3BlY3QgdGhhdCBhIHNpbXBsZSBjaGFuZ2UgaXMgcmVxdWlyZWQuCgpSRVBP U0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQ REFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz01MzYwJmlkPTIwMzg3 CgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFG RkVDVEVEIEZJTEVTCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25mL29wdGlvbnMubWlw cwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1ZGUvcG1hcC5oCiAg c3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCiAgc3lz L21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKICBzeXMvbWlwcy9t aXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5cy9taXBzL21pcHMv bWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBzeXMvbWlwcy9taXBz L3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMvbWlwcy9taXBzL3Rs Yi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMK ICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVlLmMKCkVNQUlMIFBS RUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRpbmdzL3BhbmVsL2Vt YWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8sIHJ3YXRzb24sIGVt YXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lhaG9vLmNvbSwgbWl6 aGthX2dtYWlsLmNvbQo= --b1_8a01977bc2405e827dd78c8dca1d7216 Content-Type: text/x-patch; charset=utf-8; name="D2535.20387.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20387.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 KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NzMsOSArNzA5LDkgQEAKIAlw YWdlcyA9IHRkLT50ZF9rc3RhY2tfcGFnZXM7CiAJa3NvYmogPSB0ZC0+dGRfa3N0YWNrX29iajsK IAlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7IGkr KykKLQkJbWFbaV0gPSB2bV9wYWdlX2dyYWIoa3NvYmosIGksIFZNX0FMTE9DX05PUk1BTCB8Ci0J CSAgICBWTV9BTExPQ19XSVJFRCk7CisJcnYgPSB2bV9rc3RhY2tfcGFsbG9jKGtzb2JqLCB0ZC0+ dGRfa3N0YWNrLCAoVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfV0lSRUQpLCBwYWdl cywgbWEpOworCUtBU1NFUlQocnYgIT0gMCwgKCJ2bV90aHJlYWRfc3dhcGluOiB2bV9rc3RhY2tf cGFsbG9jKCkgZmFpbGVkIikpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7KSB7CiAJCWlu dCBqLCBhLCBjb3VudCwgcnY7CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdm1fbWFjaGRl cC5jIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy92bV9t YWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKQEAgLTI1MSwxOCArMjUx LDI4IEBACiBjcHVfdGhyZWFkX3N3YXBpbihzdHJ1Y3QgdGhyZWFkICp0ZCkKIHsKIAlwdF9lbnRy eV90ICpwdGU7Ci0JaW50IGk7CiAKIAkvKgogCSAqIFRoZSBrc3RhY2sgbWF5IGJlIGF0IGEgZGlm ZmVyZW50IHBoeXNpY2FsIGFkZHJlc3Mgbm93LgogCSAqIENhY2hlIHRoZSBQVEVzIGZvciB0aGUg S2VybmVsIHN0YWNrIGluIHRoZSBtYWNoaW5lIGRlcGVuZGVudAogCSAqIHBhcnQgb2YgdGhlIHRo cmVhZCBzdHJ1Y3Qgc28gY3B1X3N3aXRjaCgpIGNhbiBxdWlja2x5IG1hcCBpbgogCSAqIHRoZSBw Y2Igc3RydWN0IGFuZCBrZXJuZWwgc3RhY2suCiAJICovCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BB R0UKKwkvKiBKdXN0IG9uZSBlbnRyeSBmb3Igb25lIGxhcmdlIGtlcm5lbCBwYWdlLiAqLworCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrKTsKKwl0ZC0+dGRfbWQubWRf dXB0ZVswXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJdGQtPnRkX21kLm1kX3VwdGVb MV0gPSAxOworCisjZWxzZQorCisJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BB R0VTOyBpKyspIHsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sg KyBpICogUEFHRV9TSVpFKTsKIAkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxP X1NXQklUU19NQVNLOwogCX0KKyNlbmRpZiAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCiB9CiAK IHZvaWQKQEAgLTI3NCwxNyArMjg0LDMxIEBACiBjcHVfdGhyZWFkX2FsbG9jKHN0cnVjdCB0aHJl YWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAotCUtBU1NFUlQoKHRkLT50 ZF9rc3RhY2sgJiAoMSA8PCBQQUdFX1NISUZUKSkgPT0gMCwgKCJrZXJuZWwgc3RhY2sgbXVzdCBi ZSBhbGlnbmVkLiIpKTsKKwlLQVNTRVJUKCh0ZC0+dGRfa3N0YWNrICYgKChLU1RBQ0tfUEFHRV9T SVpFICogMikgLSAxKSApID09IDAsCisJICAgICgia2VybmVsIHN0YWNrIG11c3QgYmUgYWxpZ25l ZC4iKSk7CiAJdGQtPnRkX3BjYiA9IChzdHJ1Y3QgcGNiICopKHRkLT50ZF9rc3RhY2sgKwogCSAg ICB0ZC0+dGRfa3N0YWNrX3BhZ2VzICogUEFHRV9TSVpFKSAtIDE7CiAJdGQtPnRkX2ZyYW1lID0g JnRkLT50ZF9wY2ItPnBjYl9yZWdzOwogCi0JZm9yIChpID0gMDsgaSA8IEtTVEFDS19QQUdFUzsg aSsrKSB7Ci0JCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrICsgaSAq IFBBR0VfU0laRSk7Ci0JCXRkLT50ZF9tZC5tZF91cHRlW2ldID0gKnB0ZSAmIH5UTEJMT19TV0JJ VFNfTUFTSzsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5IGZv ciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJMT19T V0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwl7CisJ CWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgeworCQkJcHRl ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICoKKwkJCSAgICBQQUdF X1NJWkUpOworCQkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19N QVNLOworCQl9CiAJfQorI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9p ZApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlw cy91bWFfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvdW1hX21hY2hkZXAuYworKysgYi9z eXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKQEAgLTUyLDcgKzUyLDExIEBACiAJcGZsYWdzID0g bWFsbG9jMnZtX2ZsYWdzKHdhaXQpIHwgVk1fQUxMT0NfV0lSRUQ7CiAKIAlmb3IgKDs7KSB7Cisj aWZkZWYgTUlQUzY0X05FV19QTUFQCisJCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEwsIDAsIHBmbGFn cyB8IFZNX0FMTE9DX05PT0JKKTsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAJCW0g PSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNUX0RJUkVDVCwgcGZsYWdzKTsKKyNl bmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogI2lmbmRlZiBfX21pcHNfbjY0CiAJCWlmICht ID09IE5VTEwgJiYgdm1fcGFnZV9yZWNsYWltX2NvbnRpZyhwZmxhZ3MsIDEsCiAJCSAgICAwLCBN SVBTX0tTRUcwX0xBUkdFU1RfUEhZUywgUEFHRV9TSVpFLCAwKSkKQEAgLTYyLDEyICs2NiwxOCBA QAogCQkJaWYgKHdhaXQgJiBNX05PV0FJVCkKIAkJCQlyZXR1cm4gKE5VTEwpOwogCQkJZWxzZQor I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAogCQkJCVZNX1dBSVQ7CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCQkJCXBtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworI2VuZGlmIC8q ICEgTUlQUzY0X05FV19QTUFQICovCiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQogCiAJcGEgPSBW TV9QQUdFX1RPX1BIWVMobSk7CisJaWYgKCh3YWl0ICYgTV9OT0RVTVApID09IDApCisJCWR1bXBf YWRkX3BhZ2UocGEpOwogCXZhID0gKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKIAlp ZiAoKHdhaXQgJiBNX1pFUk8pICYmIChtLT5mbGFncyAmIFBHX1pFUk8pID09IDApCiAJCWJ6ZXJv KHZhLCBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90cmFwLmMgYi9zeXMv bWlwcy9taXBzL3RyYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RyYXAuYworKysgYi9zeXMvbWlw cy9taXBzL3RyYXAuYwpAQCAtODEsNiArODEsNyBAQAogI2luY2x1ZGUgPG1hY2hpbmUvbWlwc19v cGNvZGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL2ZyYW1lLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9y ZWdudW0uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgogI2luY2x1ZGUgPG1hY2hpbmUvdGxz Lmg+CiAKICNpZmRlZiBEREIKQEAgLTI2NCw3ICsyNjUsNyBAQAogCSJyZXNlcnZlZCAyMSIsCiAJ InJlc2VydmVkIDIyIiwKIAkid2F0Y2giLAotCSJyZXNlcnZlZCAyNCIsCisJIm1hY2hpbmUgY2hl Y2siLAogCSJyZXNlcnZlZCAyNSIsCiAJInJlc2VydmVkIDI2IiwKIAkicmVzZXJ2ZWQgMjciLApA QCAtNjMyLDYgKzYzMywzMyBAQAogI2VuZGlmCiAJCXBhbmljKCJNQ0hFQ0tcbiIpOwogCQlicmVh azsKKwljYXNlIFRfTUNIRUNLICsgVF9VU0VSOgorCQl7CisJCQl1aW50MzJfdCBzdGF0dXMgPSBt aXBzX3JkX3N0YXR1cygpOworCisJCQlpZiAoc3RhdHVzICYgTUlQU19TUl9UUykgeworCQkJCS8q CisJCQkJICogTWFjaGluZSBDaGVjayBleGNlcHRpb24gY2F1c2VkIGJ5IFRMQgorCQkJCSAqIGRl dGVjdGluZyBhIG1hdGNoIGZvciBtdWx0aXBsZSBlbnRyaWVzLgorCQkJCSAqCisJCQkJICogQXR0 ZW1wdCB0byByZWNvdmVyIGJ5IGZsdXNoaW5nIHRoZSB1c2VyIFRMQgorCQkJCSAqIGFuZCByZXNl dHRpbmcgdGhlIHN0YXR1cyBiaXQuCisJCQkJICovCisJCQkJcHJpbnRmKCJNYWNoaW5lIENoZWNr IGluIFVzZXIgLSBEdXAgVExCIGVudHJ5LiAiCisJCQkJICAgICJSZWNvdmVyaW5nLi4uXG4iKTsK KwkJCQlwbWFwID0gJnAtPnBfdm1zcGFjZS0+dm1fcG1hcDsKKwkJCQl0bGJfaW52YWxpZGF0ZV9h bGxfdXNlcihwbWFwKTsKKwkJCQltaXBzX3dyX3N0YXR1cyhzdGF0dXMgJiB+TUlQU19TUl9UUyk7 CisKKwkJCQlyZXR1cm4gKHRyYXBmcmFtZS0+cGMpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBEREIK KwkJCQlrZGJfdHJhcCh0eXBlLCAwLCB0cmFwZnJhbWUpOworI2VuZGlmCisJCQkJcGFuaWMoIk1D SEVDS1xuIik7CisJCQl9CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBUX1RMQl9NT0Q6CiAJCS8qIGNo ZWNrIGZvciBrZXJuZWwgYWRkcmVzcyAqLwogCQlpZiAoS0VSTkxBTkQodHJhcGZyYW1lLT5iYWR2 YWRkcikpIHsKQEAgLTY5NCwxMCArNzIyLDIzIEBACiAKIAljYXNlIFRfVExCX0xEX01JU1MgKyBU X1VTRVI6CiAJCWZ0eXBlID0gVk1fUFJPVF9SRUFEOwotCQlnb3RvIGRvZmF1bHQ7CisJCWdvdG8g Y2hlY2tyZWZiaXQ7CiAKIAljYXNlIFRfVExCX1NUX01JU1MgKyBUX1VTRVI6CiAJCWZ0eXBlID0g Vk1fUFJPVF9XUklURTsKKworY2hlY2tyZWZiaXQ6CisJCS8qCisJCSAqIFdhcyB0aGlzIHRyYXAg Y2F1c2VkIGJ5IHRoZSBQVEVfVlIgYml0IG5vdCBiZWluZyBzZXQ/CisJCSAqLworCQlpZiAocG1h cF9lbXVsYXRlX3JlZmVyZW5jZWQoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwKKwkJICAgIHRyYXBm cmFtZS0+YmFkdmFkZHIpID09IDApIHsKKwkJCWlmICghdXNlcm1vZGUpIHsKKwkJCQlyZXR1cm4g KHRyYXBmcmFtZS0+cGMpOworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKwogZG9mYXVsdDoKIAkJ ewogCQkJdm1fb2Zmc2V0X3QgdmE7CkBAIC0xNDExLDkgKzE0NTIsMTYgQEAKIAlzdHJ1Y3QgcHJv YyAqcCA9IGN1cnByb2M7CiAKIAlwZGVwID0gKCYocC0+cF92bXNwYWNlLT52bV9wbWFwLnBtX3Nl Z3RhYlsodmEgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpXSkpOwotCWlmICgqcGRlcCkKLQkJ cHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKLQllbHNlCisJaWYg KCpwZGVwKSB7CisjaWYgVk1fTlJFU0VSVkxFVkVMID4gMAorCQlwZF9lbnRyeV90ICpwZGUgPSAm cGRlcFsodmEgPj4gUERSU0hJRlQpICYgKE5QREVQRyAtIDEpXTsKKworCQlpZiAocGRlX2lzX3N1 cGVycGFnZShwZGUpKQorCQkJcHRlcCA9IChwdF9lbnRyeV90ICopcGRlOworCQllbHNlCisjZW5k aWYgLyogVk1fTlJFU0VSVkxFVkVMID4gMCAqLworCQkJcHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Zt c3BhY2UtPnZtX3BtYXAsIHZhKTsKKwl9IGVsc2UKIAkJcHRlcCA9IChwdF9lbnRyeV90ICopMDsK IAogCSpwZGVwcCA9IHBkZXA7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3RsYi5jIGIvc3lz L21pcHMvbWlwcy90bGIuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RsYi5jCisrKyBiL3N5cy9taXBz L21pcHMvdGxiLmMKQEAgLTQwLDEwICs0MCwxNCBAQAogI2luY2x1ZGUgPG1hY2hpbmUvcHRlLmg+ CiAjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KIAorI2luY2x1ZGUgIm9wdF92bS5oIgorCiAjaWYg ZGVmaW5lZChDUFVfQ05NSVBTKQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxMjgKICNl bGlmIGRlZmluZWQoQ1BVX05MTSkKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJKDIwNDgg KyAxMjgpCisjZWxpZiBkZWZpbmVkKENQVV9DSEVSSSkKKyNkZWZpbmUJTUlQU19NQVhfVExCX0VO VFJJRVMJMTQ0CiAjZWxzZQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwk2NAogI2VuZGlm CkBAIC0xMDIsMjAgKzEwNiwzMSBAQAogewogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90 IHM7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOwogCi0J dmEgJj0gflBBR0VfTUFTSzsKKwlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZTApID09IFRM QkxPX1BURV9UT19JRFgocHRlMSkpLAorCSAgICAoIiVzOiBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6 ZXMgZG9uJ3QgbWF0Y2giLCBfX2Z1bmNfXykpOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlMCk7CisJbWFz ayA9ICh1bnNpZ25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxv d2VyIDEyIGJpdHMgKi8KKwlzaXplID0gbWFzayArIDE7CisKKwl2YSAmPSB+bWFzazsKIAogCXMg PSBpbnRyX2Rpc2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lE X01BU0s7CiAKIAltaXBzX3dyX2luZGV4KGkpOwotCW1pcHNfd3JfcGFnZW1hc2soMCk7CisJbWlw c193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VOVFJZKHZh LCAwKSk7CiAJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKIAltaXBzX3dyX2VudHJ5bG8xKHB0ZTEp OwogCXRsYl93cml0ZV9pbmRleGVkKCk7CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlw c193cl9wYWdlbWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKQEAgLTEzNyw3ICsxNTIs NiBAQAogCWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkKIAkJdGxiX2ludmFsaWRh dGVfb25lKGkpOwotCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOwogCWludHJfcmVzdG9yZShzKTsK IH0KQEAgLTI5OCwyOSArMzEyLDUzIEBACiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3Qg czsKIAlpbnQgaTsKKwl1aW50MzJfdCBwYWdlbWFzazsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNp emU7CisJcHRfZW50cnlfdCBwdGUwLCBwdGUxOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlKTsKKwltYXNr ID0gKHVuc2lnbmVkIGxvbmcpcGFnZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93 ZXIgMTIgYml0cyAqLworCXNpemUgPSBtYXNrICsgMTsKIAotCXZhICY9IH5QQUdFX01BU0s7CisJ dmEgJj0gfm1hc2s7CiAJcHRlICY9IH5UTEJMT19TV0JJVFNfTUFTSzsKIAogCXMgPSBpbnRyX2Rp c2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lEX01BU0s7CiAK LQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFnZW1hc2socGFnZW1hc2spOwogCW1p cHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgcG1hcF9hc2lkKHBtYXApKSk7CiAJdGxiX3By b2JlKCk7CiAJaSA9IG1pcHNfcmRfaW5kZXgoKTsKIAlpZiAoaSA+PSAwKSB7CiAJCXRsYl9yZWFk KCk7CisJCXB0ZTAgPSBtaXBzX3JkX2VudHJ5bG8wKCk7CisJCXB0ZTEgPSBtaXBzX3JkX2VudHJ5 bG8xKCk7CisJCUtBU1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9f SURYKHB0ZTApICYmCisJCSAgICBUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RP X0lEWChwdGUxKSksCisJCQkoIiVzOiBwdGUsIHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24n dCBtYXRjaCIsIF9fZnVuY19fKSk7CiAKLQkJaWYgKCh2YSAmIFBBR0VfU0laRSkgPT0gMCkgewor CQlpZiAoKHZhICYgc2l6ZSkgPT0gMCkgewogCQkJbWlwc193cl9lbnRyeWxvMChwdGUpOworCQkJ aWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJCS8qIFN1cGVycGFnZSAqLworCQkJCXB0 ZTEgPSAocHRlMSAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0Qp KTsKKwkJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZTEpOworCQkJfQogCQl9IGVsc2UgewogCQkJbWlw c193cl9lbnRyeWxvMShwdGUpOworCQkJaWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJ CS8qIFN1cGVycGFnZSAqLworCQkJCXB0ZTAgPSAocHRlMCAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8 IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0QpKTsKKwkJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZTApOwor CQkJfQogCQl9CiAJCXRsYl93cml0ZV9pbmRleGVkKCk7CiAJfQogCiAJbWlwc193cl9lbnRyeWhp KGFzaWQpOworCW1pcHNfd3JfcGFnZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3N3dGNoLlMgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMK LS0tIGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TCisrKyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwpA QCAtMzE1LDM2ICszMTUsOTEgQEAKICAqIE5PVEU6IFRoaXMgaXMgaGFyZCBjb2RlZCB0byBVUEFH RVMgPT0gMi4KICAqIEFsc28sIHRoZXJlIHNob3VsZCBiZSBubyBUTEIgZmF1bHRzIGF0IHRoaXMg cG9pbnQuCiAgKi8KLQlNVEMwCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCU1U QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkjIFZQTiA9IHZhCiAJSEFaQVJEX0RFTEFZCiAJdGxi cAkJCQkJIyBwcm9iZSBWUE4KIAlIQVpBUkRfREVMQVkKLQltZmMwCXMwLCBNSVBTX0NPUF8wX1RM Ql9JTkRFWAorCW1mYzAJCXMwLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAogCUhBWkFSRF9ERUxBWQog Ci0JUFRSX0xJCXQxLCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5Ci0J Ymx0eglzMCwgZW50cnkwc2V0CisJIyBNSVBTX0tTRUcwX1NUQVJUICsgKDIgKiBpbmRleCAqIFBB R0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQxLCBNSVBTX0tTRUcwX1NU QVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwli bHR6CQlzMCwgaW52YWxfbnh0MQorI2Vsc2UKKwlibHR6CQlzMCwgZW50cnkwc2V0CisjZW5kaWYK IAlub3AKLQlzbGwJczAsIFBBR0VfU0hJRlQgKyAxCi0JYWRkdQl0MSwgczAKLQlNVEMwCXQxLCBN SVBTX0NPUF8wX1RMQl9ISQorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEs IHMwCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCiAJUFRFX01UQzAJemVybywgTUlQU19D T1BfMF9UTEJfTE8wCiAJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJ emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwogCUhBWkFSRF9ERUxBWQogCXRsYndpCiAJSEFa QVJEX0RFTEFZCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2Fpbgor CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKy8qCisgKiBXaXRoIGEgS1NUQUNLX1BBR0VfU0la RSBvZiAxNksgYW5kIFBBR0VfU0laRSBvZiA0SyBpdCBpcyBwb3NzaWJsZSB0aGF0CisgKiBhIHNl Y29uZCBUTEIgZW50cnkgaXMgY3VycmVudGx5IG1hcHBpbmcgdGhlIGtlcm5lbCB0aHJlYWQgc3Rh Y2sgYXMgYQorICogcmVndWxhciA0SyBzaXplZCBwYWdlKHMpLiBDaGVjayBmb3IgdGhpcyBjYXNl IGFuZCwgaWYgc28sIGludmFsaWRhdGUKKyAqIHRoYXQgVExCIGVudHJ5IGFzIHdlbGwuCisgKi8K KyNpZiAoUEFHRV9TSVpFICE9IDQwOTYpICYmIChLU1RBQ0tfUEFHRV9TSVpFICE9IDE2Mzg0KQor I2Vycm9yIFBBR0VfU0laRSBpcyBub3QgNEsgb3IgS1NUQUNLX1BBR0VfU0laRSBpcyBub3QgMTZL LgorI2VuZGlmCitpbnZhbF9ueHQxOgorCW1vdmUJCXYxLCB2MAorCVBUUl9BRERVCXYxLCBQQUdF X1NJWkUgKiAyCisJTVRDMAkJdjEsIE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJSEFa QVJEX0RFTEFZCisJdGxicAkJCQkJCSMgcHJvYmUgVlBOCisJSEFaQVJEX0RFTEFZCisJbWZjMAkJ czAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJSEFaQVJEX0RFTEFZCisKKwkjIE1JUFNfS1NFRzBf U1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8wX1RMQl9ISQorCVBU Ul9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKKwlibHR6 CQlzMCwgZW50cnkwc2V0CisJbm9wCisJc2xsCQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQURE VQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfSEkKKwlQVEVfTVRDMAl6ZXJvLCBN SVBTX0NPUF8wX1RMQl9MTzAKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlN VEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisJdGxid2kK KwlIQVpBUkRfREVMQVkKKyNlbmRpZgkvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogCiBlbnRyeTBz ZXQ6CisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKwlIQVpB UkRfREVMQVkKIC8qIFNNUCEhIC0gV29ya3Mgb25seSBmb3IgIHVuc2hhcmVkIFRMQiBjYXNlIC0g aS5lLiBubyB2LWNwdXMgKi8KLQltdGMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCQkjIFRM QiBlbnRyeSAjMAorCW10YzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCSMgVExCIGVudHJ5 ICMwCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyB1 cHRlWzBdCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTIsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyB1cHRlWzFdCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlIQVpBUkRfREVMQVkKKwlsaQkJ dDEsIEtTVEFDS19UTEJNQVNLX01BU0sKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfUEdfTUFT SwogCUhBWkFSRF9ERUxBWQorI2Vsc2UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N QVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIAl0bGJ3aQkJCQkJIyBzZXQgVExCIGVudHJ5ICMw CiAJSEFaQVJEX0RFTEFZCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCU1UQzAJCXplcm8s IE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNlbmRpZgogLyoKICAqIE5v dyBydW5uaW5nIG9uIG5ldyB1IHN0cnVjdC4KICAqLwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9wbWFwX21pcHM2NC5jIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5j CkBAIC0wLDAgKzEsNTUyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBSZWdlbnRzIG9m IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICogQ29weXJpZ2h0IChjKSAxOTk0IEpvaG4gUy4gRHlzb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgR3JlZW5tYW4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGV0ZXIgV2VtbQorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFsYW4gTC4gQ294IDxhbGNA Y3MucmljZS5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAy MDE1IFN0YWNleSBELiBTb24gPHNzb25ALi4uPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJl cmtlbGV5IGJ5CisgKiB0aGUgU3lzdGVtcyBQcm9ncmFtbWluZyBHcm91cCBvZiB0aGUgVW5pdmVy c2l0eSBvZiBVdGFoIENvbXB1dGVyCisgKiBTY2llbmNlIERlcGFydG1lbnQgYW5kIFdpbGxpYW0g Sm9saXR6IG9mIFVVTkVUIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5 cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVy IHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1 dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl cml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI RSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1Mg T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT SEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJ UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR VUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBD QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU LCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0gg REFNQUdFLgorICoKKyAqCWZyb206CUAoIylwbWFwLmMJNy43IChCZXJrZWxleSkJNS8xMi85MQor ICoJZnJvbTogc3JjL3N5cy9pMzg2L2kzODYvcG1hcC5jLHYgMS4yNTAuMi44IDIwMDAvMTEvMjEg MDA6MDk6MTQgcHMKKyAqCUpOUFI6IHBtYXAuYyx2IDEuMTEuMi4xIDIwMDcvMDgvMTYgMTE6NTE6 MDYgZ2lyaXNoCisgKi8KKworLyoKKyAqCU1hbmFnZXMgcGh5c2ljYWwgYWRkcmVzcyBtYXBzLgor ICoKKyAqCVNpbmNlIHRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlIGlzCisg KglhbHNvIHN0b3JlZCBieSB0aGUgbG9naWNhbCBhZGRyZXNzIG1hcHBpbmcgbW9kdWxlLAorICoJ dGhpcyBtb2R1bGUgbWF5IHRocm93IGF3YXkgdmFsaWQgdmlydHVhbC10by1waHlzaWNhbAorICoJ bWFwcGluZ3MgYXQgYWxtb3N0IGFueSB0aW1lLiAgSG93ZXZlciwgaW52YWxpZGF0aW9ucworICoJ b2YgdmlydHVhbC10by1waHlzaWNhbCBtYXBwaW5ncyBtdXN0IGJlIGRvbmUgYXMKKyAqCXJlcXVl c3RlZC4KKyAqCisgKglJbiBvcmRlciB0byBjb3BlIHdpdGggaGFyZHdhcmUgYXJjaGl0ZWN0dXJl cyB3aGljaAorICoJbWFrZSB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcCBpbnZhbGlkYXRlcyBleHBl bnNpdmUsCisgKgl0aGlzIG1vZHVsZSBtYXkgZGVsYXkgaW52YWxpZGF0ZSBvciByZWR1Y2VkIHBy b3RlY3Rpb24KKyAqCW9wZXJhdGlvbnMgdW50aWwgc3VjaCB0aW1lIGFzIHRoZXkgYXJlIGFjdHVh bGx5CisgKgluZWNlc3NhcnkuICBUaGlzIG1vZHVsZSBpcyBnaXZlbiBmdWxsIGluZm9ybWF0aW9u IGFzCisgKgl0byB3aGljaCBwcm9jZXNzb3JzIGFyZSBjdXJyZW50bHkgdXNpbmcgd2hpY2ggbWFw cywKKyAqCWFuZCB0byB3aGVuIHBoeXNpY2FsIG1hcHMgbXVzdCBiZSBtYWRlIGNvcnJlY3QuCisg Ki8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisj aW5jbHVkZSAib3B0X2RkYi5oIgorI2luY2x1ZGUgIm9wdF9wbWFwLmgiCisjaW5jbHVkZSAib3B0 X3ZtLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4K KyNpbmNsdWRlIDxzeXMva3RyLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxz eXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tc2didWYuaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXgu aD4KKyNpbmNsdWRlIDxzeXMvcGNwdS5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjaW5jbHVk ZSA8c3lzL3J3bG9jay5oPgorI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2lmZGVmIFNNUAorI2lu Y2x1ZGUgPHN5cy9zbXAuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2NwdXNldC5oPgorI2VuZGlm CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy92bW1ldGVyLmg+CisKKyNp ZmRlZiBEREIKKyNpbmNsdWRlIDxkZGIvZGRiLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZtL3Zt Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFyYW0uaD4KKyNpbmNsdWRlIDx2bS92bV9rZXJuLmg+Cisj aW5jbHVkZSA8dm0vdm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1ZGUg PHZtL3ZtX29iamVjdC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZt L3ZtX3BhZ2VvdXQuaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlci5oPgorI2luY2x1ZGUgPHZtL3Zt X3JhZGl4Lmg+CisjaW5jbHVkZSA8dm0vdm1fcmVzZXJ2Lmg+CisjaW5jbHVkZSA8dm0vdW1hLmg+ CisKKyNpbmNsdWRlIDxtYWNoaW5lL2NhY2hlLmg+CisjaW5jbHVkZSA8bWFjaGluZS9tZF92YXIu aD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgorCisjdW5kZWYgUE1BUF9ERUJVRworCisjaWYg IWRlZmluZWQoRElBR05PU1RJQykKKyNkZWZpbmUJUE1BUF9JTkxJTkUgX19pbmxpbmUKKyNlbHNl CisjZGVmaW5lCVBNQVBfSU5MSU5FCisjZW5kaWYKKworLy8gI2RlZmluZSBQVl9TVEFUUworI2lm ZGVmIFBWX1NUQVRTCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB4IDsgfSB3aGlsZSAoMCkKKyNl bHNlCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZp bmUJcGFfaW5kZXgocGEpCSgocGEpID4+IFBEUlNISUZUKQorI2RlZmluZQlwYV90b19wdmgocGEp CSgmcHZfdGFibGVbcGFfaW5kZXgocGEpXSkKKworI2RlZmluZQlOUFZfTElTVF9MT0NLUwlNQVhD UFUKKworI2RlZmluZQlQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSkJXAorCQkoJnB2X2xpc3RfbG9j a3NbcGFfaW5kZXgocGEpICUgTlBWX0xJU1RfTE9DS1NdKQorCisjZGVmaW5lCUNIQU5HRV9QVl9M SVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpCWRvIHsJXAorCXN0cnVjdCByd2xvY2sgKipfbG9j a3AgPSAobG9ja3ApOwkJXAorCXN0cnVjdCByd2xvY2sgKl9uZXdfbG9jazsJCQlcCisJCQkJCQkJ XAorCV9uZXdfbG9jayA9IFBIWVNfVE9fUFZfTElTVF9MT0NLKHBhKTsJCVwKKwlpZiAoX25ld19s b2NrICE9ICpfbG9ja3ApIHsJCQlcCisJCWlmICgqX2xvY2twICE9IE5VTEwpCQkJXAorCQkJcndf d3VubG9jaygqX2xvY2twKTsJCVwKKwkJKl9sb2NrcCA9IF9uZXdfbG9jazsJCQlcCisJCSByd193 bG9jaygqX2xvY2twKTsJCQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hB TkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKQlcCisJCUNIQU5HRV9QVl9MSVNU X0xPQ0tfVE9fUEhZUyhsb2NrcCwgVk1fUEFHRV9UT19QSFlTKG0pKQorCisjZGVmaW5lCVJFTEVB U0VfUFZfTElTVF9MT0NLKGxvY2twKQkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9 IChsb2NrcCk7CQlcCisJCQkJCQkJXAorCWlmICgqX2xvY2twICE9IE5VTEwpIHsJCQkJXAorCQly d193dW5sb2NrKCpfbG9ja3ApOwkJCVwKKwkJKl9sb2NrcCA9IE5VTEw7CQkJCVwKKwl9CQkJCQkJ XAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKQlcCisJ CVBIWVNfVE9fUFZfTElTVF9MT0NLKFZNX1BBR0VfVE9fUEhZUyhtKSkKKworLyoKKyAqIEdldCBQ REVzIGFuZCBQVEVzIGZvciB1c2VyL2tlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KKyNkZWZpbmUJ cG1hcF9zZWdfaW5kZXgodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpKQorI2Rl ZmluZQlwbWFwX3BkZV9pbmRleCh2KQkoKCh2KSA+PiBQRFJTSElGVCkgJiAoTlBERVBHIC0gMSkp CisjZGVmaW5lCXBtYXBfcHRlX2luZGV4KHYpCSgoKHYpID4+IFBBR0VfU0hJRlQpICYgKE5QVEVQ RyAtIDEpKQorI2RlZmluZQlwbWFwX3BkZV9waW5kZXgodikJKCh2KSA+PiBQRFJTSElGVCkKKwor I2RlZmluZQlOVVBERQkJCShOUERFUEcgKiBOUERFUEcpCisjZGVmaW5lCU5VU0VSUEdUQkxTCQko TlVQREUgKyBOUERFUEcpCisKKyNkZWZpbmUJaXNfa2VybmVsX3BtYXAoeCkJKCh4KSA9PSBrZXJu ZWxfcG1hcCkKKworc3RydWN0IHBtYXAga2VybmVsX3BtYXBfc3RvcmU7CitwZF9lbnRyeV90ICpr ZXJuZWxfc2VnbWFwOworCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2F2YWlsOwkvKiBWQSBvZiBmaXJz dCBhdmFpbCBwYWdlIChhZnRlciBrZXJuZWwgYnNzKSAqLwordm1fb2Zmc2V0X3QgdmlydHVhbF9l bmQ7CS8qIFZBIG9mIGxhc3QgYXZhaWwgcGFnZSAoZW5kIG9mIGtlcm5lbCBBUykgKi8KKworc3Rh dGljIGludCBua3B0OwordW5zaWduZWQgcG1hcF9tYXhfYXNpZDsJCS8qIG1heCBBU0lEIHN1cHBv cnRlZCBieSB0aGUgc3lzdGVtICovCisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm0sIE9JRF9BVVRP LCBwbWFwLCBDVExGTEFHX1JELCAwLCAiVk0vcG1hcCBwYXJhbWV0ZXJzIik7CitzdGF0aWMgaW50 IHBnX3NwX2VuYWJsZWQgPSAwOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBnX3Bz X2VuYWJsZWQsIENUTEZMQUdfUkRUVU4gfCBDVExGTEFHX05PRkVUQ0gsCisgICAgJnBnX3NwX2Vu YWJsZWQsIDAsICJBcmUgbGFyZ2UgcGFnZSBtYXBwaW5ncyBlbmFibGVkPyIpOworCisjZGVmaW5l CVBNQVBfQVNJRF9SRVNFUlZFRAkwCisKK3ZtX29mZnNldF90IGtlcm5lbF92bV9lbmQgPSBWTV9N SU5fS0VSTkVMX0FERFJFU1M7CisKK3N0YXRpYyB2b2lkIHBtYXBfYXNpZF9hbGxvYyhwbWFwX3Qg cG1hcCk7CisKK3N0YXRpYyBzdHJ1Y3Qgcndsb2NrX3BhZGFsaWduIHB2aF9nbG9iYWxfbG9jazsK KworLyoKKyAqIERhdGEgZm9yIHRoZSBwdiBlbnRyeSBhbGxvY2F0aW9uIG1lY2hhbmlzbQorICov CitzdGF0aWMgVEFJTFFfSEVBRChwY2gsIHB2X2NodW5rKSBwdl9jaHVua3MgPSBUQUlMUV9IRUFE X0lOSVRJQUxJWkVSKHB2X2NodW5rcyk7CitzdGF0aWMgc3RydWN0IG10eCBwdl9jaHVua3NfbXV0 ZXg7CitzdGF0aWMgc3RydWN0IHJ3bG9jayBwdl9saXN0X2xvY2tzW05QVl9MSVNUX0xPQ0tTXTsK K3N0YXRpYyBzdHJ1Y3QgbWRfcGFnZSAqcHZfdGFibGU7CisKK3N0YXRpYyB2b2lkIGZyZWVfcHZf Y2h1bmsoc3RydWN0IHB2X2NodW5rICpwYyk7CitzdGF0aWMgdm9pZCBmcmVlX3B2X2VudHJ5KHBt YXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2KTsKK3N0YXRpYyBwdl9lbnRyeV90IGdldF9wdl9lbnRy eShwbWFwX3QgcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3Qg cmVjbGFpbV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2Nr cCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgcHZfZW50cnlfdCBwbWFwX3B2aF9yZW1v dmUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsCisgICAgdm1fb2Zmc2V0X3QgdmEp Oworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBp bmRleCwgaW50IHJlcSk7CitzdGF0aWMgdm1fcGFnZV90IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2Vk KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSwgdm1fcHJvdF90 IHByb3QsIHZtX3BhZ2VfdCBtcHRlLCAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2 b2lkIHJlc2VydmVfcHZfZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwKKyAgICBzdHJ1 Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX2RlbW90ZV9wZGUocG1h cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGJvb2xl YW5fdCBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs CisgICAgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm1f cGFnZV90IHBtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZW50ZXJfcGRlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgdm1fcHJvdF90IHBy b3QsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2X2RlbW90ZV9w ZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVj dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfcHZfaW5zZXJ0X3BkZShw bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3 bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfcHJvbW90ZV9wZGUocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKips b2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBw dF9lbnRyeV90IG5ld3B0ZSk7CitzdGF0aWMgX19pbmxpbmUgaW50IHBtYXBfaW5zZXJ0X3B0X3Bh Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKTsKK3N0YXRpYyBfX2lubGluZSB2bV9wYWdl X3QgcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworc3Rh dGljIHZvaWQgcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2 bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBw bWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zmc2V0X3Qg c3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor c3RhdGljIGludCBwbWFwX3JlbW92ZV9wdGUoc3RydWN0IHBtYXAgKnBtYXAsIHB0X2VudHJ5X3Qg KnB0cSwgdm1fb2Zmc2V0X3QgdmEsCisgICAgcGRfZW50cnlfdCBwdGVwZGUsIHN0cnVjdCBzcGds aXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF9yZW1v dmVfcGFnZShzdHJ1Y3QgcG1hcCAqcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHNw Z2xpc3QgKmZyZWUpOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnko cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgcnds b2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcF90IHBtYXApOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2Uo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKK3N0YXRpYyB2b2lkIF9wbWFwX3Vud2lyZV9w dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICBzdHJ1Y3Qg c3BnbGlzdCAqZnJlZSk7CisKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3B0ZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRp YyB2bV9wYWdlX3QgX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVkIHB0ZXBpbmRl eCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBwbWFwX3VudXNlX3B0 KHBtYXBfdCwgdm1fb2Zmc2V0X3QsIHBkX2VudHJ5X3QsIHN0cnVjdCBzcGdsaXN0ICopOworc3Rh dGljIHB0X2VudHJ5X3QgaW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vz cywgdm1fcHJvdF90IHByb3QpOworCitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZV9h Y3Rpb24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hY3Rp b24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQg KmFyZyk7CisKKy8qCisgKiBQYWdlIHRhYmxlIGVudHJ5IGxvb2t1cCByb3V0aW5lcy4KKyAqLwor CisvKiBSZXR1cm4gYSBzZWdtZW50IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9zZWdtYXAocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCisJcmV0dXJuICgmcG1hcC0+cG1fc2VndGFiW3Bt YXBfc2VnX2luZGV4KHZhKV0pOworfQorCisvKiBSZXR1cm4gYSBwYWdlIGRpcmVjdG9yeSBlbnRy eSBmb3IgZ2l2ZW4gc2VnbWVudCB0YWJsZSAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyBf X2lubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRfZW50cnlfdCAqcGRwZSwg dm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gKHBkX2VudHJ5 X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXSk7Cit9CisKKy8q IFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh ZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9wZGUocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkcGU7CisKKwlwZHBlID0g cG1hcF9zZWdtYXAocG1hcCwgdmEpOworCWlmICgqcGRwZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5V TEwpOworCisJcmV0dXJuIChwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHZhKSk7Cit9CisKKy8qIFJl dHVybiBhIHBhZ2UgdGFibGUgZW50cnkgZm9yIGdpdmVuIHBhZ2UgZGlyZWN0b3J5ICYgdmlydHVh bCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9wZGVfdG9f cHRlKHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRl OworCisJcHRlID0gKHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFwX3B0ZV9p bmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRyeSBmb3IgZ2l2ZW4g cG1hcCAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3B0X2VudHJ5X3QgKgorcG1hcF9wdGUocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IHBt YXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQorCQly ZXR1cm4gKE5VTEwpOworCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpIHsKKwkJcmV0dXJuICgo cHRfZW50cnlfdCAqKXBkZSk7CisJfSBlbHNlCisJCXJldHVybiAocG1hcF9wZGVfdG9fcHRlKHBk ZSwgdmEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRf aW5jKHBtYXBfdCBwbWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCArPSBjb3VudDsKK30K Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXBfdCBw bWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwlLQVNTRVJUKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ID49IGNvdW50LAorCSAgICAo InBtYXAgJXAgcmVzaWRlbnQgY291bnQgdW5kZXJmbG93ICVsZCAlZCIsIHBtYXAsCisJICAgIHBt YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LCBjb3VudCkpOworCXBtYXAtPnBtX3N0YXRzLnJl c2lkZW50X2NvdW50IC09IGNvdW50OworfQorCisvKgorICogQWxsb2NhdGUgc29tZSB3aXJlZCBt ZW1vcnkgYmVmb3JlIHRoZSB2aXJ0dWFsIG1lbW9yeSBzeXN0ZW0gaXMKKyAqIGJvb3RzdHJhcHBl ZC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKQor eworCXZtX3BhZGRyX3QgYmFua19zaXplLCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCXNpemUg PSByb3VuZF9wYWdlKHNpemUpOworCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2 YWlsWzBdOworCXdoaWxlIChzaXplID4gYmFua19zaXplKSB7CisJCWludCBpOworCisJCWZvciAo aSA9IDA7IHBoeXNfYXZhaWxbaSArIDJdOyBpICs9IDIpIHsKKwkJCXBoeXNfYXZhaWxbaV0gPSBw aHlzX2F2YWlsW2kgKyAyXTsKKwkJCXBoeXNfYXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpICsg M107CisJCX0KKwkJcGh5c19hdmFpbFtpXSA9IDA7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gMDsK KwkJaWYgKCFwaHlzX2F2YWlsWzBdKQorCQkJcGFuaWMoInBtYXBfc3RlYWxfbWVtb3J5OiBvdXQg b2YgbWVtb3J5Iik7CisJCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBd OworCX0KKworCXBhID0gcGh5c19hdmFpbFswXTsKKwlwaHlzX2F2YWlsWzBdICs9IHNpemU7CisJ dmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKKwliemVybygoY2FkZHJfdCl2YSwgc2l6ZSk7 CisJcmV0dXJuICh2YSk7Cit9CisKKy8qCisgKiBCb290c3RyYXAgdGhlIHN5c3RlbSBlbm91Z2gg dG8gcnVuIHdpdGggdmlydHVhbCBtZW1vcnkuICBUaGlzCisgKiBhc3N1bWVzIHRoYXQgdGhlIHBo eXNfYXZhaWwgYXJyYXkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitw bWFwX2NyZWF0ZV9rZXJuZWxfcGFnZXRhYmxlKHZvaWQpCit7CisJaW50IGksIGo7CisJdm1fb2Zm c2V0X3QgcHRhZGRyOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1f b2Zmc2V0X3QgcGRhZGRyOworCWludCBucHQsIG5wZGU7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNl Z21lbnQgdGFibGUgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlrZXJuZWxfc2VnbWFwID0gKHBkX2Vu dHJ5X3QgKilwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUpOworCisJLyoKKwkgKiBBbGxvY2F0 ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlucGRlID0g aG93bWFueShOS1BULCBOUERFUEcpOworCXBkYWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5KFBBR0Vf U0laRSAqIG5wZGUpOworCW5rcHQgPSBOS1BUOworCXB0YWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5 KFBBR0VfU0laRSAqIG5rcHQpOworCisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5 IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9uIGxvb2th c2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkgKiBlbnRy eXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFuZCBFbnRy eSBISQorCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1Y2UgYSBn bG9iYWwgYml0IHRvIHN0b3JlCisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkgPSAwLCBw dGUgPSAocHRfZW50cnlfdCAqKXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsrLCBwdGUr KykKKwkJKnB0ZSA9IFBURV9HOworCisJZm9yIChpID0gMCwgIG5wdCA9IG5rcHQ7IG5wdCA+IDA7 IGkrKykgeworCQlrZXJuZWxfc2VnbWFwW2ldID0gKHBkX2VudHJ5X3QpKHBkYWRkciArIGkgKiBQ QUdFX1NJWkUpOworCQlwZGUgPSAocGRfZW50cnlfdCAqKWtlcm5lbF9zZWdtYXBbaV07CisKKwkJ Zm9yIChqID0gMDsgaiA8IE5QREVQRyAmJiBucHQgPiAwOyBqKyssIG5wdC0tKQorCQkJcGRlW2pd ID0gKHBkX2VudHJ5X3QpKHB0YWRkciArIChpICogTlBERVBHICsgaikgKgorCQkJICAgIFBBR0Vf U0laRSk7CisJfQorCisJUE1BUF9MT0NLX0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5lbF9wbWFw LT5wbV9zZWd0YWIgPSBrZXJuZWxfc2VnbWFwOworCUNQVV9GSUxMKCZrZXJuZWxfcG1hcC0+cG1f YWN0aXZlKTsKKwlUQUlMUV9JTklUKCZrZXJuZWxfcG1hcC0+cG1fcHZjaHVuayk7CisJa2VybmVs X3BtYXAtPnBtX2FzaWRbMF0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwlrZXJuZWxfcG1h cC0+cG1fYXNpZFswXS5nZW4gPSAwOworCWtlcm5lbF92bV9lbmQgKz0gbmtwdCAqIE5QVEVQRyAq IFBBR0VfU0laRTsKK30KKwordm9pZAorcG1hcF9ib290c3RyYXAodm9pZCkKK3sKKwlpbnQgaTsK KworCS8qIFNvcnQuICovCithZ2FpbjoKKwlmb3IgKGkgPSAwOyBwaHlzX2F2YWlsW2kgKyAxXSAh PSAwOyBpICs9IDIpIHsKKwkJLyoKKwkJICogS2VlcCB0aGUgbWVtb3J5IGFsaWduZWQgb24gcGFn ZSBib3VuZGFyeS4KKwkJICovCisJCXBoeXNfYXZhaWxbaV0gPSByb3VuZF9wYWdlKHBoeXNfYXZh aWxbaV0pOworCQlwaHlzX2F2YWlsW2kgKyAxXSA9IHRydW5jX3BhZ2UocGh5c19hdmFpbFtpICsg MV0pOworCisJCWlmIChpIDwgMikKKwkJCWNvbnRpbnVlOworCQlpZiAocGh5c19hdmFpbFtpIC0g Ml0gPiBwaHlzX2F2YWlsW2ldKSB7CisJCQl2bV9wYWRkcl90IHB0ZW1wWzJdOworCisJCQlwdGVt cFswXSA9IHBoeXNfYXZhaWxbaSArIDBdOworCQkJcHRlbXBbMV0gPSBwaHlzX2F2YWlsW2kgKyAx XTsKKworCQkJcGh5c19hdmFpbFtpICsgMF0gPSBwaHlzX2F2YWlsW2kgLSAyXTsKKwkJCXBoeXNf YXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpIC0gMV07CisKKwkJCXBoeXNfYXZhaWxbaSAtIDJd ID0gcHRlbXBbMF07CisJCQlwaHlzX2F2YWlsW2kgLSAxXSA9IHB0ZW1wWzFdOworCQkJZ290byBh Z2FpbjsKKwkJfQorCX0KKworCS8qCisJICogQ29weSB0aGUgcGh5c19hdmFpbFtdIGFycmF5IGJl Zm9yZSB3ZSBzdGFydCBzdGVhbGluZyBtZW1vcnkgZnJvbSBpdC4KKwkgKi8KKwlmb3IgKGkgPSAw OyBwaHlzX2F2YWlsW2kgKyAxXSAhPSAwOyBpICs9IDIpIHsKKwkJcGh5c21lbV9kZXNjW2ldID0g cGh5c19hdmFpbFtpXTsKKwkJcGh5c21lbV9kZXNjW2kgKyAxXSA9IHBoeXNfYXZhaWxbaSArIDFd OworCX0KKworCU1heG1lbSA9IGF0b3AocGh5c19hdmFpbFtpIC0gMV0pOworCisJaWYgKGJvb3R2 ZXJib3NlKSB7CisJCXByaW50ZigiUGh5c2ljYWwgbWVtb3J5IGNodW5rKHMpOlxuIik7CisJCWZv ciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkJdm1fcGFkZHJf dCBzaXplOworCisJCQlzaXplID0gcGh5c19hdmFpbFtpICsgMV0gLSBwaHlzX2F2YWlsW2ldOwor CQkJcHJpbnRmKCIlIzA4anggLSAlIzA4angsICVqdSBieXRlcyAoJWp1IHBhZ2VzKVxuIiwKKwkJ CSAgICAodWludG1heF90KSBwaHlzX2F2YWlsW2ldLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf YXZhaWxbaSArIDFdIC0gMSwKKwkJCSAgICAodWludG1heF90KSBzaXplLCAodWludG1heF90KSBz aXplIC8gUEFHRV9TSVpFKTsKKwkJfQorCQlwcmludGYoIk1heG1lbSBpcyAweCUwanhcbiIsIHB0 b2EoKHVpbnRtYXhfdClNYXhtZW0pKTsKKwl9CisJLyoKKwkgKiBTdGVhbCB0aGUgbWVzc2FnZSBi dWZmZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeS4KKwkgKi8KKwltc2didWZwID0gKHN0 cnVjdCBtc2didWYgKilwbWFwX3N0ZWFsX21lbW9yeShtc2didWZzaXplKTsKKwltc2didWZpbml0 KG1zZ2J1ZnAsIG1zZ2J1ZnNpemUpOworCisJLyoKKwkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4g VGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0VfU0laRSAqIDIpIHNvIGl0 IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJICovCisJa3N0YWNrMCA9 IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgICsgS1NUQUNLX0dVQVJEX1BBR0VTKSA8 PAorCSAgICBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNrMCwgKEtTVEFD S19QQUdFX1NJWkUgKiAyKSk7CisKKwl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tFUk5FTF9BRERS RVNTOworCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOworCisjaWZkZWYgU01Q CisJLyoKKwkgKiBTdGVhbCBzb21lIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBtYXAgdGhlIHBj cHUgYXJlYS4KKwkgKi8KKwl2aXJ0dWFsX2F2YWlsID0gcm91bmR1cDIodmlydHVhbF9hdmFpbCwg UEFHRV9TSVpFICogMik7CisJcGNwdXAgPSAoc3RydWN0IHBjcHUgKil2aXJ0dWFsX2F2YWlsOwor CXZpcnR1YWxfYXZhaWwgKz0gUEFHRV9TSVpFICogMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0 aGUgd2lyZWQgVExCIGVudHJ5IG1hcHBpbmcgdGhlIHBjcHUgcmVnaW9uIGZvcgorCSAqIHRoZSBC U1AgYXQgJ3BjcHVwJy4gVXAgdW50aWwgdGhpcyBwb2ludCB3ZSB3ZXJlIG9wZXJhdGluZworCSAq IHdpdGggdGhlICdwY3B1cCcgZm9yIHRoZSBCU1AgcG9pbnRpbmcgdG8gYSB2aXJ0dWFsIGFkZHJl c3MKKwkgKiBpbiBLU0VHMCBzbyB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYSBUTEIgbWFwcGluZy4K KwkgKi8KKwltaXBzX3BjcHVfdGxiX2luaXQoUENQVV9BRERSKDApKTsKKworCWlmIChib290dmVy Ym9zZSkKKwkJcHJpbnRmKCJwY3B1IGlzIGF2YWlsYWJsZSBhdCB2aXJ0dWFsIGFkZHJlc3MgJXAu XG4iLCBwY3B1cCk7CisjZW5kaWYKKworCXBtYXBfY3JlYXRlX2tlcm5lbF9wYWdldGFibGUoKTsK KwlwbWFwX21heF9hc2lkID0gVk1OVU1fUElEUzsKKwltaXBzX3dyX2VudHJ5aGkoMCk7CisJbWlw c193cl9wYWdlbWFzaygwKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHB2IGxp c3QgbG9jay4KKwkgKi8KKwlyd19pbml0KCZwdmhfZ2xvYmFsX2xvY2ssICJwbWFwIHB2IGdsb2Jh bCIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHZtX3BhZ2UncyBtYWNoaW5lLWRlcGVuZGVu dCBmaWVsZHMuCisgKi8KK3ZvaWQKK3BtYXBfcGFnZV9pbml0KHZtX3BhZ2VfdCBtKQoreworCisJ VEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFU VFJfREVGQVVMVDsKK30KKworLyoKKyAqCUluaXRpYWxpemUgdGhlIHBtYXAgbW9kdWxlLgorICoJ Q2FsbGVkIGJ5IHZtX2luaXQsIHRvIGluaXRpYWxpemUgYW55IHN0cnVjdHVyZXMgdGhhdCB0aGUg cG1hcAorICoJc3lzdGVtIG5lZWRzIHRvIG1hcCB2aXJ0dWFsIG1lbW9yeS4KKyAqLwordm9pZAor cG1hcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJdm1fc2l6ZV90IHM7CisJaW50IHB2X25wZzsK KworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcHYgY2h1bmsgbGlzdCBtdXRleC4KKwkgKi8KKwlt dHhfaW5pdCgmcHZfY2h1bmtzX211dGV4LCAicG1hcCBwdiBjaHVuayBsaXN0IiwgTlVMTCwgTVRY X0RFRik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHBvb2wgb2YgcHYgbGlzdCBsb2Nrcy4K KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlBWX0xJU1RfTE9DS1M7IGkrKykKKwkJcndfaW5pdCgm cHZfbGlzdF9sb2Nrc1tpXSwgInB2IGxpc3QiKTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBz aXplIG9mIHRoZSBwdiBoZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCWZvciAoaSA9 IDA7IHBoeXNfYXZhaWxbaSArIDFdOyBpICs9IDIpOworCXB2X25wZyA9IHJvdW5kXzJtcGFnZShw aHlzX2F2YWlsWyhpIC0gMikgKyAxXSkgLyBOQlBEUjsKKworCS8qCisJICogQWxsb2NhdGUgbWVt b3J5IGZvciB0aGUgcHYgaGVhZCB0YWJsZSBmb3Igc3VwZXJwYWdlcy4KKwkgKi8KKwlzID0gKHZt X3NpemVfdCkocHZfbnBnICogc2l6ZW9mKHN0cnVjdCBtZF9wYWdlKSk7CisJcyA9IHJvdW5kX3Bh Z2Uocyk7CisJcHZfdGFibGUgPSAoc3RydWN0IG1kX3BhZ2UgKilrbWVtX21hbGxvYyhrZXJuZWxf YXJlbmEsIHMsCisJICAgIE1fV0FJVE9LIHwgTV9aRVJPKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHZf bnBnOyBpKyspCisJCVRBSUxRX0lOSVQoJnB2X3RhYmxlW2ldLnB2X2xpc3QpOworfQorCitzdGF0 aWMgU1lTQ1RMX05PREUoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwZGUsIENUTEZMQUdfUkQsIDAsCisg ICAgIjJNQiBwYWdlIG1hcHBpbmcgY291bnRlcnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3Bk ZV9kZW1vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgZGVtb3Rp b25zLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9kZW1vdGlvbnMsIDAsICIyTUIgcGFnZSBk ZW1vdGlvbnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3BkZV9tYXBwaW5nczsKK1NZU0NUTF9V TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBtYXBwaW5ncywgQ1RMRkxBR19SRCwKKyAgICAm cG1hcF9wZGVfbWFwcGluZ3MsIDAsICIyTUIgcGFnZSBtYXBwaW5ncyIpOworCitzdGF0aWMgdV9s b25nIHBtYXBfcGRlX3BfZmFpbHVyZXM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURf QVVUTywgcF9mYWlsdXJlcywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcF9mYWlsdXJlcywg MCwgIjJNQiBwYWdlIHByb21vdGlvbiBmYWlsdXJlcyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBf cGRlX3Byb21vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgcHJv bW90aW9ucywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcHJvbW90aW9ucywgMCwgIjJNQiBw YWdlIHByb21vdGlvbnMiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgorICogTG93IGxldmVsIGhlbHBlciByb3V0aW5lcy4uLi4uCisgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZk ZWYJU01QCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBt YXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlpbnQJY3B1aWQs IGNwdSwgc2VsZjsKKwljcHVzZXRfdCBhY3RpdmVfY3B1czsKKworCXNjaGVkX3BpbigpOworCWlm IChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQlzbXBfcmVuZGV6dm91cyhOVUxMLCBmbiwgTlVM TCwgYXJnKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEZvcmNlIEFTSUQgdXBkYXRlIG9uIGluYWN0 aXZlIENQVXMgKi8KKwlDUFVfRk9SRUFDSChjcHUpIHsKKwkJaWYgKCFDUFVfSVNTRVQoY3B1LCAm cG1hcC0+cG1fYWN0aXZlKSkKKwkJCXBtYXAtPnBtX2FzaWRbY3B1XS5nZW4gPSAwOworCX0KKwlj cHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwkvKgorCSAqIFhYWDogYmFycmllci9sb2NraW5nIGZv ciBhY3RpdmU/CisJICoKKwkgKiBUYWtlIGEgc25hcHNob3Qgb2YgYWN0aXZlIGhlcmUsIGFueSBm dXJ0aGVyIGNoYW5nZXMgYXJlIGlnbm9yZWQuCisJICogdGxiIHVwZGF0ZS9pbnZhbGlkYXRlIHNo b3VsZCBiZSBoYXJtbGVzcyBvbiBpbmFjdGl2ZSBDUFVzCisJICovCisJYWN0aXZlX2NwdXMgPSBw bWFwLT5wbV9hY3RpdmU7CisJc2VsZiA9IENQVV9JU1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsK KwlDUFVfQ0xSKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCS8qIE9wdGltaXplIGZvciB0aGUgY2Fz ZSB3aGVyZSB0aGlzIGNwdSBpcyB0aGUgb25seSBhY3RpdmUgb25lICovCisJaWYgKENQVV9FTVBU WSgmYWN0aXZlX2NwdXMpKSB7CisJCWlmIChzZWxmKQorCQkJZm4oYXJnKTsKKwl9IGVsc2Ugewor CQlpZiAoc2VsZikKKwkJCUNQVV9TRVQoY3B1aWQsICZhY3RpdmVfY3B1cyk7CisJCXNtcF9yZW5k ZXp2b3VzX2NwdXMoYWN0aXZlX2NwdXMsIE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCX0KK291dDoK KwlzY2hlZF91bnBpbigpOworfQorI2Vsc2UgLyogIVNNUCAqLworc3RhdGljIF9faW5saW5lIHZv aWQKK3BtYXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwX3QgcG1hcCwgdm9pZCAoKmZuKSh2b2lk ICopLCB2b2lkICphcmcpCit7CisJaW50CWNwdWlkOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt YXApKSB7CisJCWZuKGFyZyk7CisJCXJldHVybjsKKwl9CisJY3B1aWQgPSBQQ1BVX0dFVChjcHVp ZCk7CisJaWYgKCFDUFVfSVNTRVQoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpKQorCQlwbWFwLT5w bV9hc2lkW2NwdWlkXS5nZW4gPSAwOworCWVsc2UKKwkJZm4oYXJnKTsKK30KKyNlbmRpZiAvKiBT TVAgKi8KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9hbGwocG1hcF90IHBtYXApCit7 CisKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwKKwkgICAgKHZvaWQgKCopKHZvaWQg KikpdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIsIHBtYXApOworfQorCitzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3BhZ2VfYXJnIHsKKwlwbWFwX3QgcG1hcDsKKwl2bV9vZmZzZXRfdCB2YTsKK307CisK K3N0YXRpYyB2b2lkCitwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQorewor CXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfaW52YWxp ZGF0ZV9hZGRyZXNzKHAtPnBtYXAsIHAtPnZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3QgcG1h cF9pbnZhbGlkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEg PSB2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3Bh Z2VfYWN0aW9uLCAmYXJnKTsKK30KKworc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcg eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHN2YTsKKwl2bV9vZmZzZXRfdCBldmE7Cit9 OworCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcp Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJf aW52YWxpZGF0ZV9yYW5nZShwLT5wbWFwLCBwLT5zdmEsIHAtPmV2YSk7Cit9CisKK3N0YXRpYyB2 b2lkCitwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg dm1fb2Zmc2V0X3QgZXZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYXJnIGFy ZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcuc3ZhID0gc3ZhOworCWFyZy5ldmEgPSBldmE7 CisJcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBtYXAsIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9h Y3Rpb24sICZhcmcpOworfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgeworCXBtYXBf dCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgcHRlOworfTsKKworc3RhdGlj IHZvaWQKK3BtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h cF91cGRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfdXBkYXRlKHAtPnBtYXAsIHAtPnZh LCBwLT5wdGUpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKQoreworCXN0cnVjdCBwbWFwX3VwZGF0 ZV9wYWdlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJn LnB0ZSA9IHB0ZTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRhdGVf cGFnZV9hY3Rpb24sICZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlX2lu dmFsaWRhdGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBwdF9lbnRyeV90IG5ld3BkZSkK K3sKKworCWlmICghcHRlX2lzXzFtX3N1cGVycGFnZSgmbmV3cGRlKSkgeworCQkvKiBEZW1vdGlv bjogZmx1c2ggYSBzcGVjaWZpYyAybWIgcGFnZSBtYXBwaW5nLiAqLworCQl0bGJfaW52YWxpZGF0 ZV9yYW5nZShwbWFwLCAodmEgJiB+UERSTUFTSyksCisJCSAgICAodmEgJiB+UERSTUFTSykgKyBO QlBEUik7CisJfSBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX0cpKSB7CisJCS8qCisJ CSAqIFByb21vdGlvbjogZmx1c2ggZXZlcnkgNEtCIHBhZ2UgbWFwcGluZyBmcm9tIHRoZSBUTEIK KwkJICogYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZmx1c2ggaW5kaXZpZHVhbGx5Lgor CQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIocG1hcCk7CisJfSBlbHNlIHsKKwkJLyoK KwkJICogUHJvbW90aW9uOiBmbHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRM QiwKKwkJICogaW5jbHVkaW5nIGFueSBnbG9iYWwgKFBURV9HKSBtYXBwaW5ncy4KKwkJICovCisJ CXRsYl9pbnZhbGlkYXRlX2FsbCgpOworCX0KK30KKworc3RydWN0IHBtYXBfdXBkYXRlX3BkZV9h cmcgeworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXBkX2VudHJ5X3QgKnBkZTsK KwlwdF9lbnRyeV90IG5ld3BkZTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVf YWN0aW9uKHZvaWQgKmFjdCkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyAqYXJnID0g YWN0OworCisJcG1hcF91cGRhdGVfcGRlX2ludmFsaWRhdGUoYXJnLT5wbWFwLCBhcmctPnZhLCBh cmctPm5ld3BkZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfc3RvcmUocG1h cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisKKwlwZGVf c3RvcmUocGRlLCBuZXdwZGUpOworfQorCisKKy8qCisgKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBm b3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gYSB3YXkgdGhhdAorICogcHJldmVu dHMgYW55IHBvc3NpYmlsaXR5IG9mIHRoZSBUTEIgZXZlciBoYXZpbmcgdHdvIGVudHJpZXMgdGhh dCBtYXAgdGhlCisgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB1c2luZyBkaWZmZXJlbnQgcGFnZSBz aXplcy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisJc3Ry dWN0IHBtYXBfdXBkYXRlX3BkZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52 YSA9IHZhOworCWFyZy5wZGUgPSBwZGU7CisJYXJnLm5ld3BkZSA9IG5ld3BkZTsKKworCXBtYXBf dXBkYXRlX3BkZV9zdG9yZShwbWFwLCBwZGUsIG5ld3BkZSk7CisJcG1hcF9jYWxsX29uX2FjdGl2 ZV9jcHVzKHBtYXAsIHBtYXBfdXBkYXRlX3BkZV9hY3Rpb24sICZhcmcpOworfQorCisvKiAtLS0g Ki8KKworLyoKKyAqCVJvdXRpbmU6CXBtYXBfZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0 cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBn aXZlbiBtYXAvdmlydHVhbF9hZGRyZXNzIHBhaXIuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfZXh0 cmFjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOwor CXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCXBhID0gMDsKKwlQTUFQX0xP Q0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkZSkpIHsKKwkJcGEgPSBUTEJMT19QREVfVE9fUEEoKnBkZSkgfCAodmEgJiBQRFJN QVNLKTsKKwl9IGVsc2UgeworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCWlm IChwdGUpCisJCQlwYSA9IFRMQkxPX1BURV9UT19QQSgqcHRlKSB8ICh2YSAmIFBBR0VfTUFTSyk7 CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAocGEpOworfQorCisvKgorICoJUm91 dGluZToJcG1hcF9leHRyYWN0X2FuZF9ob2xkCisgKglGdW5jdGlvbjoKKyAqCQlBdG9taWNhbGx5 IGV4dHJhY3QgYW5kIGhvbGQgdGhlIHBoeXNpY2FsIHBhZ2UKKyAqCQl3aXRoIHRoZSBnaXZlbiBw bWFwIGFuZCB2aXJ0dWFsIGFkZHJlc3MgcGFpcgorICoJCWlmIHRoYXQgbWFwcGluZyBwZXJtaXRz IHRoZSBnaXZlbiBwcm90ZWN0aW9uLgorICovCit2bV9wYWdlX3QKK3BtYXBfZXh0cmFjdF9hbmRf aG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3Byb3RfdCBwcm90KQoreworCXBk X2VudHJ5X3QgKnBkZXA7CisJcHRfZW50cnlfdCBwdGUsICpwdGVwOworCXZtX3BhZGRyX3QgcGEs IHB0ZV9wYTsKKwl2bV9wYWdlX3QgbTsKKwl2bV9wYWRkcl90IHBkZV9wYTsKKworCXBhID0gMDsK KwltID0gTlVMTDsKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1hcF9wZGUo cG1hcCwgdmEpOworCWlmIChwZGVwICE9IE5VTEwgJiYgKnBkZXAgIT0gTlVMTCkgeworCQlpZiAo cGRlX2lzXzFtX3N1cGVycGFnZShwZGVwKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGVwLCBQVEVf Uk8pIHx8CisJCQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSB7CisJCQkJcGRlX3Bh ID0gVExCTE9fUERFX1RPX1BBKCpwZGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spOworCQkJ CWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwZGVfcGEsICZwYSkpCisJCQkJCWdvdG8g cmV0cnk7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwZGVfcGEpOworCQkJCXZtX3BhZ2VfaG9s ZChtKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwg dmEpOworCQkJaWYgKHB0ZXAgIT0gTlVMTCkgeworCQkJCXB0ZSA9ICpwdGVwOworCQkJCWlmIChw dGVfaXNfdmFsaWQoJnB0ZSkgJiYKKwkJCQkgICAgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8 CisJCQkJICAgIChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkpIHsKKwkJCQkJcHRlX3BhID0g VExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFw LCBwdGVfcGEsCisJCQkJCSAgICAmcGEpKQorCQkJCQkJZ290byByZXRyeTsKKwkJCQkJbSA9IFBI WVNfVE9fVk1fUEFHRShwdGVfcGEpOworCQkJCQl2bV9wYWdlX2hvbGQobSk7CisJCQkJfQorCQkJ fQorCQl9CisJfQorCVBBX1VOTE9DS19DT05EKHBhKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwly ZXR1cm4gKG0pOworfQorCisvKi0KKyAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKKyAqCUZ1bmN0 aW9uOgorICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCisg KgkJdmlydHVhbCBhZGRyZXNzLgorICovCit2bV9wYWRkcl90CitwbWFwX2tleHRyYWN0KHZtX29m ZnNldF90IHZhKQoreworCWludCBtYXBwZWQ7CisKKwkvKgorCSAqIEZpcnN0LCB0aGUgZGlyZWN0 LW1hcHBlZCByZWdpb25zLgorCSAqLworCWlmICh2YSA+PSBNSVBTX1hLUEhZU19TVEFSVCAmJiB2 YSA8IE1JUFNfWEtQSFlTX0VORCkKKwkJcmV0dXJuIChNSVBTX1hLUEhZU19UT19QSFlTKHZhKSk7 CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQor CQlyZXR1cm4gKE1JUFNfS1NFRzBfVE9fUEhZUyh2YSkpOworCisJaWYgKHZhID49IE1JUFNfS1NF RzFfU1RBUlQgJiYgdmEgPCBNSVBTX0tTRUcxX0VORCkKKwkJcmV0dXJuIChNSVBTX0tTRUcxX1RP X1BIWVModmEpKTsKKworCS8qCisJICogVXNlciB2aXJ0dWFsIGFkZHJlc3Nlcy4KKwkgKi8KKwlp ZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRf ZW50cnlfdCAqcHRlcDsKKworCQlpZiAoY3VycHJvYyAmJiBjdXJwcm9jLT5wX3Ztc3BhY2UpIHsK KwkJCXBkZXAgPSBwbWFwX3BkZSgmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7CisJ CQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJuICgwKTsKKwkJ CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChwdF9lbnRyeV90 ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAo dmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBkZXAsIHZh KTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0ZXApIHwK KwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJ fQorCisJLyoKKwkgKiBTaG91bGQgYmUga2VybmVsIHZpcnR1YWwgaGVyZSwgb3RoZXJ3aXNlIGZh aWwKKwkgKi8KKwltYXBwZWQgPSAodmEgPj0gTUlQU19LU0VHMl9TVEFSVCB8fCB2YSA8IE1JUFNf S1NFRzJfRU5EKTsKKwltYXBwZWQgPSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQg fHwgdmEgPCBNSVBTX1hLU0VHX0VORCk7CisJLyoKKwkgKiBLZXJuZWwgdmlydHVhbC4KKwkgKi8K KworCWlmIChtYXBwZWQpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRfZW50cnlfdCAqcHRl cDsKKworCQkvKiBJcyB0aGUga2VybmVsIHBtYXAgaW5pdGlhbGl6ZWQ/ICovCisJCWlmICghQ1BV X0VNUFRZKCZrZXJuZWxfcG1hcC0+cG1fYWN0aXZlKSkgeworCQkJLyogSXQncyBpbnNpZGUgdGhl IHZpcnR1YWwgYWRkcmVzcyByYW5nZSAqLworCQkJcGRlcCA9IHBtYXBfcGRlKGtlcm5lbF9wbWFw LCB2YSk7CisJCQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJu ICgwKTsKKwkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChw dF9lbnRyeV90ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAor CQkJCSAgICAodmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRl KHBkZXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEo KnB0ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCX0KKwkJcmV0dXJu ICgwKTsKKwl9CisKKwlwYW5pYygiJXMgZm9yIHVua25vd24gYWRkcmVzcyBzcGFjZSAlcC4iLCBf X2Z1bmNfXywgKHZvaWQgKil2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBsZXZlbCBtYXBwaW5nIHJvdXRpbmVzLi4u Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisKKy8qLQorICogYWRkIGEgd2lyZWQgcGFnZSB0byB0aGUga3ZhCisgKi8KK3ZvaWQKK3BtYXBf a2VudGVyX2F0dHIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsIGludCBhdHRyKQorewor CXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9lbnRyeV90IG9wdGUsIG5wdGU7CisKKyNpZmRlZiBQTUFQ X0RFQlVHCisJcHJpbnRmKCJwbWFwX2tlbnRlcjogIHZhOiAlcCAtPiBwYTogJXBcbiIsICh2b2lk ICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisKKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdmEpOworCW9wdGUgPSAqcHRlOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0 ciB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9WQUxJRCB8IFBURV9HOworCXB0ZV9zdG9yZShwdGUs IG5wdGUpOworCWlmIChwdGVfaXNfdmFsaWQoJm9wdGUpICYmIG9wdGUgIT0gbnB0ZSkKKwkJcG1h cF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOworfQorCit2b2lkCitwbWFwX2tl bnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSkKK3sKKworCUtBU1NFUlQoaXNfY2Fj aGVhYmxlX21lbShwYSksCisJCSgicG1hcF9rZW50ZXI6IG1lbW9yeSBhdCAweCVseCBpcyBub3Qg Y2FjaGVhYmxlIiwgKHVfbG9uZylwYSkpOworCisJcG1hcF9rZW50ZXJfYXR0cih2YSwgcGEsIFBU RV9DX0NBQ0hFKTsKK30KKworLyotCisgKiByZW1vdmUgYSBwYWdlIGZyb20gdGhlIGtlcm5lbCBw YWdldGFibGVzCisgKi8KKyAvKiBQTUFQX0lOTElORSAqLyB2b2lkCitwbWFwX2tyZW1vdmUodm1f b2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCisJLyoKKwkgKiBXcml0ZSBiYWNr IGFsbCBjYWNoZXMgZnJvbSB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKKwkgKi8KKwltaXBzX2Rj YWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFKTsKKworCXB0ZSA9IHBtYXBfcHRl KGtlcm5lbF9wbWFwLCB2YSk7CisJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCXBtYXBfaW52YWxp ZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSk7Cit9CisKKy8qCisgKglVc2VkIHRvIG1hcCBhIHJh bmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyBpbnRvIGtlcm5lbAorICoJdmlydHVhbCBhZGRyZXNz IHNwYWNlLgorICoKKyAqCVRoZSB2YWx1ZSBwYXNzZWQgaW4gJyp2aXJ0JyBpcyBhIHN1Z2dlc3Rl ZCB2aXJ0dWFsIGFkZHJlc3MgZm9yCisgKgl0aGUgbWFwcGluZy4gQXJjaGl0ZWN0dXJlcyB3aGlj aCBjYW4gc3VwcG9ydCBhIGRpcmVjdC1tYXBwZWQKKyAqCXBoeXNpY2FsIHRvIHZpcnR1YWwgcmVn aW9uIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MKKyAqCXdpdGhpbiB0aGF0IHJl Z2lvbiwgbGVhdmluZyAnKnZpcnQnIHVuY2hhbmdlZC4gT3RoZXIKKyAqCWFyY2hpdGVjdHVyZXMg c2hvdWxkIG1hcCB0aGUgcGFnZXMgc3RhcnRpbmcgYXQgJyp2aXJ0JyBhbmQKKyAqCXVwZGF0ZSAn KnZpcnQnIHdpdGggdGhlIGZpcnN0IHVzYWJsZSBhZGRyZXNzIGFmdGVyIHRoZSBtYXBwZWQKKyAq CXJlZ2lvbi4KKyAqCisgKglVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZtX29mZnNldF90 CitwbWFwX21hcCh2bV9vZmZzZXRfdCAqdmlydCwgdm1fcGFkZHJfdCBzdGFydCwgdm1fcGFkZHJf dCBlbmQsIGludCBwcm90KQoreworCisJcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUKHN0YXJ0 KSk7Cit9CisKKy8qLQorICogQWRkIGEgbGlzdCBvZiB3aXJlZCBwYWdlcyB0byB0aGUga3ZhCisg KiB0aGlzIHJvdXRpbmUgaXMgb25seSB1c2VkIGZvciB0ZW1wb3JhcnkKKyAqIGtlcm5lbCBtYXBw aW5ncyB0aGF0IGRvIG5vdCBuZWVkIHRvIGhhdmUKKyAqIHBhZ2UgbW9kaWZpY2F0aW9uIG9yIHJl ZmVyZW5jZXMgcmVjb3JkZWQuCisgKiBOb3RlIHRoYXQgb2xkIG1hcHBpbmdzIGFyZSBzaW1wbHkg d3JpdHRlbgorICogb3Zlci4gIFRoZSBwYWdlICptdXN0KiBiZSB3aXJlZC4KKyAqLwordm9pZAor cG1hcF9xZW50ZXIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCAqbSwgaW50IGNvdW50KQorewor CWludCBpOworCXZtX29mZnNldF90IG9yaWd2YSA9IHZhOworCisJZm9yIChpID0gMDsgaSA8IGNv dW50OyBpKyspIHsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKG1baV0pOworCQlwbWFwX2tlbnRlcih2 YSwgVk1fUEFHRV9UT19QSFlTKG1baV0pKTsKKwkJdmEgKz0gUEFHRV9TSVpFOworCX0KKworCW1p cHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KG9yaWd2YSwgUEFHRV9TSVpFKmNvdW50KTsKK30K KworLyotCisgKiBUaGlzIHJvdXRpbmUgamVya3MgcGFnZSBtYXBwaW5ncyBmcm9tIHRoZQorICog a2VybmVsIC0tIGl0IGlzIG1lYW50IG9ubHkgZm9yIHRlbXBvcmFyeSBtYXBwaW5ncy4KKyAqLwor dm9pZAorcG1hcF9xcmVtb3ZlKHZtX29mZnNldF90IHZhLCBpbnQgY291bnQpCit7CisJcHRfZW50 cnlfdCAqcHRlOworCXZtX29mZnNldF90IG9yaWd2YTsKKworCWlmIChjb3VudCA8IDEpCisJCXJl dHVybjsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFICogY291 bnQpOworCW9yaWd2YSA9IHZhOworCWRvIHsKKwkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhKTsKKwkJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfSB3 aGlsZSAoLS1jb3VudCA+IDApOworCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShrZXJuZWxfcG1hcCwg b3JpZ3ZhLCB2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqIFBhZ2UgdGFibGUgcGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLi4u Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9mcmVlX3plcm9fcGFnZXMoc3RydWN0IHNwZ2xp c3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG07CisKKwl3aGlsZSAoKG0gPSBTTElTVF9GSVJTVChm cmVlKSkgIT0gTlVMTCkgeworCQlTTElTVF9SRU1PVkVfSEVBRChmcmVlLCBwbGlua3Mucy5zcyk7 CisJCS8qIFByZXNlcnZlIHRoZSBwYWdlJ3MgUEdfWkVSTyBzZXR0aW5nLiAqLworCQl2bV9wYWdl X2ZyZWVfdG9xKG0pOworCX0KK30KKworLyotCisgKiBTY2hlZHVsZSB0aGUgc3BlY2lmaWVkIHVu dXNlZCBwYWdlIHRhYmxlIHBhZ2UgdG8gYmUgZnJlZWQuICBTcGVjaWZpY2FsbHkKKyAqIGFkZCB0 aGUgcGFnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgcGFnZXMgdGhhdCB3aWxsIGJlIHJlbGVh c2VkIHRvIHRoZQorICogcGh5c2ljYWwgbWVtb3J5IG1hbmFnZXIgYWZ0ZXIgdGhlIFRMQiBoYXMg YmVlbiB1cGRhdGVkLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9hZGRfZGVsYXll ZF9mcmVlX2xpc3Qodm1fcGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlLAorICAgIGJvb2xl YW5fdCBzZXRfUEdfWkVSTykKK3sKKworCWlmIChzZXRfUEdfWkVSTykKKwkJbS0+ZmxhZ3MgfD0g UEdfWkVSTzsKKwllbHNlCisJCW0tPmZsYWdzICY9IH5QR19aRVJPOworCVNMSVNUX0lOU0VSVF9I RUFEKGZyZWUsIG0sIHBsaW5rcy5zLnNzKTsKK30KKworLyoKKyAqIEluc2VydHMgdGhlIHNwZWNp ZmllZCBwYWdlIHRhYmxlIHBhZ2UgaW50byB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9u CisgKiBvZiBpZGxlIHBhZ2UgdGFibGUgcGFnZXMuICBFYWNoIG9mIGEgcG1hcCdzIHBhZ2UgdGFi bGUgcGFnZXMgaXMgcmVzcG9uc2libGUKKyAqIGZvciBtYXBwaW5nIGEgZGlzdGluY3QgcmFuZ2Ug b2YgdmlydHVhbCBhZGRyZXNzZXMuICBUaGUgcG1hcCdzIGNvbGxlY3Rpb24gaXMKKyAqIG9yZGVy ZWQgYnkgdGhpcyB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKi8KK3N0YXRpYyBfX2lubGluZSBp bnQKK3BtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQorewor CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0dXJuICh2bV9yYWRpeF9p bnNlcnQoJnBtYXAtPnBtX3Jvb3QsIG1wdGUpKTsKK30KKworLyoKKyAqIExvb2tzIGZvciBhIHBh Z2UgdGFibGUgcGFnZSBtYXBwaW5nIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGluIHRo ZQorICogc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdl cy4gIFJldHVybnMgTlVMTCBpZiB0aGVyZQorICogaXMgbm8gcGFnZSB0YWJsZSBwYWdlIGNvcnJl c3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBf X2lubGluZSB2bV9wYWdlX3QKK3BtYXBfbG9va3VwX3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX29m ZnNldF90IHZhKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0 dXJuICh2bV9yYWRpeF9sb29rdXAoJnBtYXAtPnBtX3Jvb3QsIHBtYXBfcGRlX3BpbmRleCh2YSkp KTsKK30KKworLyoKKyAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBwYWdlIHRhYmxlIHBhZ2UgZnJv bSB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uCisgKiBvZiBpZGxlIHBhZ2UgdGFibGUg cGFnZXMuICBUaGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBtdXN0IGJlIGEgbWVtYmVyIG9m CisgKiB0aGUgcG1hcCdzIGNvbGxlY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitw bWFwX3JlbW92ZV9wdF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9wYWdlX3QgbXB0ZSkKK3sKKworCVBN QVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXZtX3JhZGl4X3JlbW92ZSgmcG1hcC0+ cG1fcm9vdCwgbXB0ZS0+cGluZGV4KTsKK30KKworLyoKKyAqIERlY3JlbWVudHMgYSBwYWdlIHRh YmxlIHBhZ2UncyB3aXJlIGNvdW50LCB3aGljaCBpcyB1c2VkIHRvIHJlY29yZCB0aGUKKyAqIG51 bWJlciBvZiB2YWxpZCBwYWdlIHRhYmxlIGVudHJpZXMgd2l0aGluIHRoZSBwYWdlLiAgSWYgdGhl IHdpcmUgY291bnQKKyAqIGRyb3BzIHRvIHplcm8sIHRoZW4gdGhlIHBhZ2UgdGFibGUgcGFnZSBp cyB1bm1hcHBlZC4gIFJldHVybnMgVFJVRSBpZiB0aGUKKyAqIHBhZ2UgdGFibGUgcGFnZSB3YXMg dW5tYXBwZWQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIGJv b2xlYW5fdAorcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1f cGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCisJLS1tLT53aXJlX2NvdW50Owor CWlmIChtLT53aXJlX2NvdW50ID09IDApIHsKKwkJX3BtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg bSwgZnJlZSk7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor fQorCitzdGF0aWMgdm9pZAorX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlwZF9lbnRyeV90 ICpwZGUsICpwZHA7CisJdm1fcGFnZV90IHBkcGc7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwkvKgorCSAqIHVubWFwIHRoZSBwYWdlIHRhYmxlIHBhZ2UKKwkgKi8KKwlp ZiAobS0+cGluZGV4IDwgTlVQREUpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkq cGRlID0gMDsKKwkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisKKwkJLyoKKwkJ ICogUmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNvdW50CisJ CSAqLworCQlwZHAgPSAocGRfZW50cnlfdCAqKSpwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJCXBk cGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwZHApKTsKKwkJcG1hcF91 bndpcmVfcHRwKHBtYXAsIHZhLCBwZHBnLCBmcmVlKTsKKwl9IGVsc2UgeworCQlwZGUgPSBwbWFw X3NlZ21hcChwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2Rl YyhwbWFwLCAxKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIGZpbmFsbHkgdW53aXJl ZCwgc2ltcGx5IGZyZWUgaXQuCisJICogVGhpcyBpcyBhIHJlbGVhc2Ugc3RvcmUgc28gdGhhdCB0 aGUgb3JkaW5hcnkgc3RvcmUgdW5tYXBwaW5nCisJICogdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBn bG9iYWxseSBwZXJmb3JtZWQgYmVmb3JlIFRMQiBzaG9vdC0KKwkgKiBkb3duIGlzIGJlZ3VuLgor CSAqLworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCisJ LyoKKwkgKiBQdXQgcGFnZSBvbiBhIGxpc3Qgc28gdGhhdCBpdCBpcyByZWxlYXNlZCBhZnRlcgor CSAqICpBTEwqIFRMQiBzaG9vdGRvd24gaXMgZG9uZS4KKwkgKi8KKwlwbWFwX2FkZF9kZWxheWVk X2ZyZWVfbGlzdChtLCBmcmVlLCBUUlVFKTsKK30KKworLyoKKyAqIEFmdGVyIHJlbW92aW5nIGEg cGFnZSB0YWJsZSBlbnRyeSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgdG8KKyAqIGNvbmRpdGlvbmFs bHkgZnJlZSB0aGUgcGFnZSwgYW5kIG1hbmFnZSB0aGUgaG9sZC93aXJlIGNvdW50cy4KKyAqLwor c3RhdGljIGludAorcG1hcF91bnVzZV9wdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHBk X2VudHJ5X3QgcHRlcGRlLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXZtX3BhZ2Vf dCBtcHRlOworCisJaWYgKHZhID49IFZNX01BWFVTRVJfQUREUkVTUykKKwkJcmV0dXJuICgwKTsK KwlLQVNTRVJUKHB0ZXBkZSAhPSAwLCAoInBtYXBfdW51c2VfcHQ6IHB0ZXBkZSAhPSAwIikpOwor CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwdGVwZGUpKTsKKwly ZXR1cm4gKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwgbXB0ZSwgZnJlZSkpOworfQorCit2b2lk CitwbWFwX3Bpbml0MChwbWFwX3QgcG1hcCkKK3sKKwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklU KHBtYXApOworCXBtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9zZWdtYXA7CisJQ1BVX1pFUk8oJnBt YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp XS5nZW4gPSAwOworCX0KKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwlUQUlMUV9JTklUKCZw bWFwLT5wbV9wdmNodW5rKTsKKwliemVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5w bV9zdGF0cyk7Cit9CisKK3ZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpCit7CisK Kwl2bV9wYWdlb3V0X2dyb3dfY2FjaGUoMywgMCwgTUlQU19YS1BIWVNfTEFSR0VTVF9QSFlTKTsK K30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY19kaXJlY3RfcGFnZSh1bnNpZ25lZCBp bnQgaW5kZXgsIGludCByZXEpCit7CisJdm1fcGFnZV90IG07CisKKwltID0gdm1fcGFnZV9hbGxv Y19mcmVlbGlzdChWTV9GUkVFTElTVF9ESVJFQ1QsIHJlcSB8IFZNX0FMTE9DX1dJUkVEIHwKKwkg ICAgVk1fQUxMT0NfWkVSTyk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwor CWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlwbWFwX3plcm9fcGFnZShtKTsKKwor CW0tPnBpbmRleCA9IGluZGV4OworCXJldHVybiAobSk7Cit9CisKKy8qLQorICogSW5pdGlhbGl6 ZSBhIHByZWFsbG9jYXRlZCBhbmQgemVyb2VkIHBtYXAgc3RydWN0dXJlLAorICogc3VjaCBhcyBv bmUgaW4gYSB2bXNwYWNlIHN0cnVjdHVyZS4KKyAqLworaW50CitwbWFwX3Bpbml0KHBtYXBfdCBw bWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBwdGRwZzsKKwlpbnQgaTsK KworCS8qCisJICogYWxsb2NhdGUgdGhlIHBhZ2UgZGlyZWN0b3J5IHBhZ2UKKwkgKi8KKwl3aGls ZSAoKHB0ZHBnID0gcG1hcF9hbGxvY19kaXJlY3RfcGFnZShOVVNFUlBHVEJMUywgVk1fQUxMT0Nf Tk9PQkogfAorCSAgICBWTV9BTExPQ19OT1JNQUwpKSA9PSBOVUxMKSB7CisJICAgICAgIHBtYXBf Z3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworCX0KKworCXB0ZHZhID0gTUlQU19QSFlTX1RPX0RJ UkVDVChWTV9QQUdFX1RPX1BIWVMocHRkcGcpKTsKKwlwbWFwLT5wbV9zZWd0YWIgPSAocGRfZW50 cnlfdCAqKXB0ZHZhOworCUNQVV9aRVJPKCZwbWFwLT5wbV9hY3RpdmUpOworCWZvciAoaSA9IDA7 IGkgPCBNQVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURf UkVTRVJWRUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJVEFJTFFfSU5JVCgm cG1hcC0+cG1fcHZjaHVuayk7CisJYnplcm8oJnBtYXAtPnBtX3N0YXRzLCBzaXplb2YgcG1hcC0+ cG1fc3RhdHMpOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBj YWxsZWQgaWYgdGhlIGRlc2lyZWQgcGFnZSB0YWJsZSBwYWdlIGRvZXMgbm90IGV4aXN0LgorICov CitzdGF0aWMgdm1fcGFnZV90CitfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQg cHRlcGluZGV4LCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJdm1fb2Zmc2V0X3QgcGFnZXZh OworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK KwkvKgorCSAqIEZpbmQgb3IgZmFicmljYXRlIGEgbmV3IHBhZ2V0YWJsZSBwYWdlCisJICovCisJ aWYgKChtID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBwdGVwaW5kZXgsIFZNX0FMTE9DX05PUk1BTCB8 CisJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQgfCBWTV9BTExPQ19aRVJPKSkg PT0gTlVMTCkgeworCQlpZiAobG9ja3AgIT0gTlVMTCkgeworCQkJUkVMRUFTRV9QVl9MSVNUX0xP Q0sobG9ja3ApOworCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQlyd19ydW5sb2NrKCZwdmhfZ2xv YmFsX2xvY2spOworCQkJVk1fV0FJVDsKKwkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor CQkJUE1BUF9MT0NLKHBtYXApOworCQl9CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdGhlIG5lZWQg dG8gcmV0cnkuCVdoaWxlIHdhaXRpbmcsIHRoZSBwYWdlCisJCSAqIHRhYmxlIHBhZ2UgbWF5IGhh dmUgYmVlbiBhbGxvY2F0ZWQuCisJCSAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKG0t PmZsYWdzICYgUEdfWkVSTykgPT0gMCkKKwkJcG1hcF96ZXJvX3BhZ2UobSk7CisKKwkvKgorCSAq IE1hcCB0aGUgcGFnZXRhYmxlIHBhZ2UgaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLCBp ZiBpdAorCSAqIGlzbid0IGFscmVhZHkgdGhlcmUuCisJICovCisJcGFnZXZhID0gTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCisJaWYgKHB0ZXBpbmRleCA+PSBOVVBE RSkgeworCQlwbWFwLT5wbV9zZWd0YWJbcHRlcGluZGV4IC0gTlVQREVdID0gKHBkX2VudHJ5X3Qp cGFnZXZhOworCX0gZWxzZSB7CisJCXBkX2VudHJ5X3QgKnBkZXAsICpwZGU7CisJCWludCBzZWdp bmRleCA9IHB0ZXBpbmRleCA+PiAoU0VHU0hJRlQgLSBQRFJTSElGVCk7CisJCWludCBwZGVpbmRl eCA9IHB0ZXBpbmRleCAmIChOUERFUEcgLSAxKTsKKwkJdm1fcGFnZV90IHBnOworCisJCXBkZXAg PSAmcG1hcC0+cG1fc2VndGFiW3NlZ2luZGV4XTsKKwkJaWYgKCpwZGVwID09IE5VTEwpIHsKKwkJ CS8qIEhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgcGQsIHJlY3Vyc2UgKi8KKwkJCWlmIChfcG1hcF9h bGxvY3B0ZShwbWFwLCBOVVBERSArIHNlZ2luZGV4LAorCQkJICAgIGxvY2twKSA9PSBOVUxMKSB7 CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1cnJlbnQgKi8KKwkJCQktLW0tPndpcmVf Y291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7 CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCX0KKwkJ fSBlbHNlIHsKKwkJCS8qIEFkZCByZWZlcmVuY2UgdG8gdGhlIHBkIHBhZ2UgKi8KKwkJCXBnID0g UEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZXApKTsKKwkJCXBnLT53aXJl X2NvdW50Kys7CisJCX0KKwkJLyogTmV4dCBsZXZlbCBlbnRyeSAqLworCQlwZGUgPSAocGRfZW50 cnlfdCAqKSpwZGVwOworCQlwZGVbcGRlaW5kZXhdID0gKHBkX2VudHJ5X3QpcGFnZXZhOworCX0K KworCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAsIDEpOworCisJcmV0dXJuIChtKTsKK30K Kworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7CisJ cGRfZW50cnlfdCAqcGQ7CisJdm1fcGFnZV90IG07CisKKwkvKgorCSAqIENhbGN1bGF0ZSBwYWdl dGFibGUgcGFnZSBpbmRleAorCSAqLworCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7 CityZXRyeToKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkgKi8KKwlw ZCA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCS8qCisJICogVGhpcyBzdXBwb3J0cyBzd2l0Y2hp bmcgZnJvbSBhIDJNQiBwYWdlIHRvIGEKKwkgKiBub3JtYWwgNEsgcGFnZS4KKwkgKi8KKwlpZiAo cGQgIT0gTlVMTCAmJiAocGRlX2lzXzFtX3N1cGVycGFnZShwZCkgJiYKKwkgICAgcHRlX2lzX3Zh bGlkKChwdF9lbnRyeV90ICopcGQpKSkgeworCQkgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2Vk KHBtYXAsIHBkLCB2YSwgbG9ja3ApKSB7CisJCQkgLyoKKwkJCSAgKiBJbnZhbGlkYXRpb24gb2Yg dGhlIDJNQiBwYWdlIG1hcHBpbmcgbWF5IGhhdmUgY2F1c2VkCisJCQkgICogdGhlIGRlYWxsb2Nh dGlvbiBvZiB0aGUgdW5kZXJseWluZyBQRCBwYWdlLgorCQkJICAqLworCQkJIHBkID0gTlVMTDsK KwkJIH0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3 ZSBqdXN0IGluY3JlbWVudCB0aGUgaG9sZAorCSAqIGNvdW50LCBhbmQgYWN0aXZhdGUgaXQuCisJ ICovCisJaWYgKHBkICE9IE5VTEwgJiYgKnBkICE9IE5VTEwpIHsKKwkJbSA9IFBIWVNfVE9fVk1f UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKChwdF9lbnRyeV90KSpwZCkpOworCQltLT53aXJlX2Nv dW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSBpZiB0aGUgcHRlIHBhZ2UgaXNuJ3Qg bWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorCQkgKiBkZWFsbG9jYXRlZC4KKwkJICovCisJCW0g PSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBwdGVwaW5kZXgsIGxvY2twKTsKKwkJaWYgKG0gPT0gTlVM TCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIChtKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogUG1hcCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLQorICogUmVsZWFz ZSBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIGdpdmVuIHBoeXNpY2FsIG1hcC4KKyAqIENhbGxl ZCB3aGVuIGEgcG1hcCBpbml0aWFsaXplZCBieSBwbWFwX3Bpbml0IGlzIGJlaW5nIHJlbGVhc2Vk LgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gdmFsaWQg bWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVsZWFzZShwbWFwX3QgcG1hcCkKK3sKKwl2bV9v ZmZzZXRfdCBwdGR2YTsKKwl2bV9wYWdlX3QgcHRkcGc7CisKKwlLQVNTRVJUKHBtYXAtPnBtX3N0 YXRzLnJlc2lkZW50X2NvdW50ID09IDAsCisJICAgICgicG1hcF9yZWxlYXNlOiBwbWFwIHJlc2lk ZW50IGNvdW50ICVsZCAhPSAwIiwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQp KTsKKworCS8qCisJICogSW52YWxpZGF0ZSBhbnkgbGVmdCBUTEIgZW50cmllcywgdG8gYWxsb3cg dGhlIHJldXNlCisJICogb2YgdGhlIGFzaWQuCisJICovCisJcG1hcF9pbnZhbGlkYXRlX2FsbChw bWFwKTsKKworCXB0ZHZhID0gKHZtX29mZnNldF90KXBtYXAtPnBtX3NlZ3RhYjsKKwlwdGRwZyA9 IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZHZhKSk7CisKKwlwdGRwZy0+ d2lyZV9jb3VudC0tOworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQs IDEpOworCXZtX3BhZ2VfZnJlZV96ZXJvKHB0ZHBnKTsKK30KKworLyotCisgKiBncm93IHRoZSBu dW1iZXIgb2Yga2VybmVsIHBhZ2UgdGFibGUgZW50cmllcywgaWYgbmVlZGVkCisgKi8KK3ZvaWQK K3BtYXBfZ3Jvd2tlcm5lbCh2bV9vZmZzZXRfdCBhZGRyKQoreworCXZtX3BhZ2VfdCBua3BnOwor CXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCWludCBpOworCisJ bXR4X2Fzc2VydCgma2VybmVsX21hcC0+c3lzdGVtX210eCwgTUFfT1dORUQpOworCWFkZHIgPSBy b3VuZHVwMihhZGRyLCBOQlNFRyk7CisJaWYgKGFkZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v ZmZzZXQpCisJCWFkZHIgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCXdoaWxlIChrZXJuZWxf dm1fZW5kIDwgYWRkcikgeworCQlwZHBlID0gcG1hcF9zZWdtYXAoa2VybmVsX3BtYXAsIGtlcm5l bF92bV9lbmQpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJLyogbmV3IGludGVybWVkaWF0ZSBw YWdlIHRhYmxlIGVudHJ5ICovCisJCQlua3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBW TV9BTExPQ19JTlRFUlJVUFQgfAorCQkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lS RUQgfCBWTV9BTExPQ19aRVJPKTsKKwkJCWlmIChua3BnID09IE5VTEwpCisJCQkJcGFuaWMoIiVz OiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwiLCBfX2Z1bmNfXyk7CisJCQkqcGRwZSA9IChwZF9l bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9UT19QSFlTKG5rcGcp KTsKKwkJCWNvbnRpbnVlOyAvKiB0cnkgYWdhaW4gKi8KKwkJfQorCQlwZGUgPSBwbWFwX3BkcGVf dG9fcGRlKHBkcGUsIGtlcm5lbF92bV9lbmQpOworCQlpZiAoKnBkZSAhPSAwKSB7CisJCQlrZXJu ZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJCWlmIChr ZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQkJa2VybmVs X3ZtX2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlj b250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaW5kZXggaXMgYm9ndXMsIGJ1dCBvdXQg b2YgdGhlIHdheQorCQkgKi8KKwkJbmtwZyA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgbmtwdCwgVk1f QUxMT0NfSU5URVJSVVBUIHwKKwkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQg fCBWTV9BTExPQ19aRVJPKTsKKwkJaWYgKCFua3BnKQorCQkJcGFuaWMoInBtYXBfZ3Jvd2tlcm5l bDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJCW5rcHQrKzsKKwkJKnBkZSA9IChwZF9l bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG5rcGcpKTsKKworCQkv KgorCQkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwg Yml0IGluCisJCSAqIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyIGZvciBlYWNoIDIg cGFnZSBlbnRyeS4KKwkJICogVGh1cyBpbnZhbGlkIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh bCBiaXQgc2V0IHNvIHdoZW4KKwkJICogRW50cnkgTE8gYW5kIEVudHJ5IEhJIEcgYml0cyBhcmUg YW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsCisJCSAqIHByb2R1Y2UgYSBnbG9iYWwgYml0IHRvIHN0 b3JlIGluIHRoZSB0bGIuCisJCSAqLworCQlwdGUgPSAocHRfZW50cnlfdCAqKSpwZGU7CisJCWZv ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJCXB0ZVtpXSA9IFBURV9HOworCisJCWtlcm5l bF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAoa2Vy bmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgeworCQkJa2VybmVsX3Zt X2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog cGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworQ1RBU1NFUlQoc2l6ZW9mKHN0cnVjdCBwdl9jaHVu aykgPT0gUEFHRV9TSVpFKTsKK0NUQVNTRVJUKF9OUENNID09IDMpOworQ1RBU1NFUlQoX05QQ1BW ID09IDE2OCk7CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgcHZfY2h1bmsgKgorcHZfdG9fY2h1 bmsocHZfZW50cnlfdCBwdikKK3sKKworCXJldHVybiAoKHN0cnVjdCBwdl9jaHVuayAqKSgodWlu dHB0cl90KXB2ICYgfih1aW50cHRyX3QpUEFHRV9NQVNLKSk7Cit9CisKKyNkZWZpbmUgUFZfUE1B UChwdikgKHB2X3RvX2NodW5rKHB2KS0+cGNfcG1hcCkKKworI2RlZmluZQlQQ19GUkVFMAkweGZm ZmZmZmZmZmZmZmZmZmZ1bAorI2RlZmluZQlQQ19GUkVFMQkweGZmZmZmZmZmZmZmZmZmZmZ1bAor I2RlZmluZQlQQ19GUkVFMgkweDAwMDAwMGZmZmZmZmZmZmZ1bAorCitzdGF0aWMgY29uc3QgdV9s b25nIHBjX2ZyZWVtYXNrW19OUENNXSA9IHsgUENfRlJFRTAsIFBDX0ZSRUUxLCBQQ19GUkVFMiB9 OworCisjaWZkZWYgUFZfU1RBVFMKK3N0YXRpYyBpbnQgcGNfY2h1bmtfY291bnQsIHBjX2NodW5r X2FsbG9jcywgcGNfY2h1bmtfZnJlZXMsIHBjX2NodW5rX3RyeWZhaWw7CisKK1NZU0NUTF9JTlQo X3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19jb3VudCwgQ1RMRkxBR19SRCwgJnBjX2NodW5r X2NvdW50LCAwLAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBjaHVua3MiKTsKK1NZ U0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19hbGxvY3MsIENUTEZMQUdfUkQs ICZwY19jaHVua19hbGxvY3MsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNo dW5rcyBhbGxvY2F0ZWQiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVu a19mcmVlcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2ZyZWVzLCAwLAorICAgICJDdXJyZW50IG51 bWJlciBvZiBwdiBlbnRyeSBjaHVua3MgZnJlZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9J RF9BVVRPLCBwY19jaHVua190cnlmYWlsLCBDVExGTEFHX1JELCAmcGNfY2h1bmtfdHJ5ZmFpbCwg MCwKKyAgICAiTnVtYmVyIG9mIHRpbWVzIHRyaWVkIHRvIGdldCBhIGNodW5rIHBhZ2UgYnV0IGZh aWxlZC4iKTsKKworc3RhdGljIGxvbmcgcHZfZW50cnlfY291bnQsIHB2X2VudHJ5X2ZyZWVzLCBw dl9lbnRyeV9hbGxvY3M7CitzdGF0aWMgaW50IHB2X2VudHJ5X3NwYXJlOworCitTWVNDVExfTE9O Ryhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2ZyZWVzLCBDVExGTEFHX1JELCAmcHZfZW50 cnlfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGZyZWVzIik7CitT WVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2FsbG9jcywgQ1RMRkxBR19S RCwgJnB2X2VudHJ5X2FsbG9jcywgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkg YWxsb2NzIik7CitTWVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2NvdW50 LCBDVExGTEFHX1JELCAmcHZfZW50cnlfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9m IHB2IGVudHJpZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwdl9lbnRyeV9z cGFyZSwgQ1RMRkxBR19SRCwgJnB2X2VudHJ5X3NwYXJlLCAwLAorICAgICJDdXJyZW50IG51bWJl ciBvZiBzcGFyZSBwdiBlbnRyaWVzIik7CisjZW5kaWYKKworLyoKKyAqIFdlIGFyZSBpbiBhIHNl cmlvdXMgbG93IG1lbW9yeSBjb25kaXRpb24uICBSZXNvcnQgdG8KKyAqIGRyYXN0aWMgbWVhc3Vy ZXMgdG8gZnJlZSBzb21lIHBhZ2VzIHNvIHdlIGNhbiBhbGxvY2F0ZQorICogYW5vdGhlciBwdiBl bnRyeSBjaHVuay4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgUFYgZW50cmllcyB3ZXJlIHJlY2xh aW1lZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcC4KKyAqCisgKiBXZSBkbyBub3QsIGhvd2V2ZXIs IHVubWFwIDJtcGFnZXMgYmVjYXVzZSBzdWJzZXF1ZW50IGFjY2VzcyB3aWxsCisgKiBhbGxvY2F0 ZSBwZXItcGFnZSBwdiBlbnRyaWVzIHVudGlsIHJlcHJvbW90aW9uIG9jY3VycywgdGhlcmVieQor ICogZXhhY2VyYmF0aW5nIHRoZSBzaG9ydGFnZSBvZiBmcmVlIHB2IGVudHJpZXMuCisgKi8KK3N0 YXRpYyB2bV9wYWdlX3QKK3JlY2xhaW1fcHZfY2h1bmsocG1hcF90IGxvY2tlZF9wbWFwLCBzdHJ1 Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IHBjaCBuZXdfdGFpbDsKKwlzdHJ1Y3QgcHZf Y2h1bmsgKnBjOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90 ICpwdGUsIG9sZHB0ZTsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhOworCXZtX3Bh Z2VfdCBtLCBtX3BjOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJdWludDY0X3QgaW51c2U7CisJ aW50IGJpdCwgZmllbGQsIGZyZWVkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKGxvY2tlZF9wbWFwLCBNQV9PV05FRCk7 CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoInJlY2xhaW1fcHZfY2h1bms6IGxvY2twIGlzIE5V TEwiKSk7CisJcG1hcCA9IE5VTEw7CisJbV9wYyA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7 CisJVEFJTFFfSU5JVCgmbmV3X3RhaWwpOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOwor CXdoaWxlICgocGMgPSBUQUlMUV9GSVJTVCgmcHZfY2h1bmtzKSkgIT0gTlVMTCAmJiBTTElTVF9F TVBUWSgmZnJlZSkpIHsKKwkJVEFJTFFfUkVNT1ZFKCZwdl9jaHVua3MsIHBjLCBwY19scnUpOwor CQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCQlpZiAocG1hcCAhPSBwYy0+cGNfcG1h cCkgeworCQkJaWYgKHBtYXAgIT0gTlVMTCkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1h cCk7CisJCQkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQkJCVBNQVBfVU5MT0NLKHBtYXAp OworCQkJfQorCQkJcG1hcCA9IHBjLT5wY19wbWFwOworCQkJLyogQXZvaWQgZGVhZGxvY2sgYW5k IGxvY2sgcmVjdXJzaW9uLiAqLworCQkJaWYgKHBtYXAgPiBsb2NrZWRfcG1hcCkgeworCQkJCVJF TEVBU0VfUFZfTElTVF9MT0NLKGxvY2twKTsKKwkJCQlQTUFQX0xPQ0socG1hcCk7CisJCQl9IGVs c2UgaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXAgJiYgIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ CXBtYXAgPSBOVUxMOworCQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xy dSk7CisJCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQkJY29udGludWU7CisJCQl9 CisJCX0KKworCQkvKgorCQkgKiBEZXN0cm95IGV2ZXJ5IG5vbi13aXJlZCwgNCBLQiBwYWdlIG1h cHBpbmcgaW4gdGhlIGNodW5rLgorCQkgKi8KKwkJZnJlZWQgPSAwOworCQlmb3IgKGZpZWxkID0g MDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJZm9yIChpbnVzZSA9IH5wYy0+cGNfbWFw W2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCSAgICBpbnVzZSAhPSAwOyBpbnVzZSAm PSB+KDFVTCA8PCBiaXQpKSB7CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWlkeCA9 IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAmcGMtPnBjX3B2 ZW50cnlbaWR4XTsKKwkJCQl2YSA9IHB2LT5wdl92YTsKKwkJCQlwZGUgPSBwbWFwX3BkZShwbWFw LCB2YSk7CisJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsCisJCQkJICAgICgi JXM6IHBkZSIsIF9fZnVuY19fKSk7CisJCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkK KwkJCQkJY29udGludWU7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJ CW9sZHB0ZSA9ICpwdGU7CisJCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9XKSkKKwkJCQkJ Y29udGludWU7CisJCQkJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkJCQkqcHRlID0gUFRF X0c7CisJCQkJZWxzZQorCQkJCQkqcHRlID0gMDsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwg UFRFX0cpKQorCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJbSA9IFBI WVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEob2xkcHRlKSk7CisJCQkJaWYgKHB0ZV90ZXN0 KCZvbGRwdGUsIFBURV9EKSkKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQlpZiAocHRlX2lz X3JlZigmb2xkcHRlKSkKKwkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQp OworCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCW0t Pm1kLnB2X2dlbisrOworCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ CQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQkJCQlzdHJ1Y3QgbWRf cGFnZSAqcHZoID0KKwkJCQkJICAgIHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJ CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCXZtX3BhZ2VfYWZsYWdf Y2xlYXIobSwKKwkJCQkJCSAgICBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlw Yy0+cGNfbWFwW2ZpZWxkXSB8PSAxVUwgPDwgYml0OworCQkJCXBtYXBfdW51c2VfcHQocG1hcCwg dmEsICpwZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCWlmIChmcmVlZCA9 PSAwKSB7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUpOworCQkJ bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBFdmVy eSBmcmVlZCBtYXBwaW5nIGlzIGZvciBhIDQgS0IgcGFnZS4gKi8KKwkJcG1hcF9yZXNpZGVudF9j b3VudF9kZWMocG1hcCwgZnJlZWQpOworCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50 cnlfZnJlZXMsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3Nw YXJlLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9j b3VudCwgZnJlZWQpKTsKKwkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNf bGlzdCk7CisJCWlmIChwYy0+cGNfbWFwWzBdID09IFBDX0ZSRUUwICYmIHBjLT5wY19tYXBbMV0g PT0gUENfRlJFRTEgJiYKKwkJICAgIHBjLT5wY19tYXBbMl0gPT0gUENfRlJFRTIpIHsKKwkJCVBW X1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCQkJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQkJUFZf U1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkJCS8qIEVudGlyZSBj aHVuayBpcyBmcmVlOyByZXR1cm4gaXQuICovCisJCQltX3BjID0gUEhZU19UT19WTV9QQUdFKE1J UFNfRElSRUNUX1RPX1BIWVMoCisJCQkgICAgKHZtX29mZnNldF90KXBjKSk7CisJCQlkdW1wX2Ry b3BfcGFnZShtX3BjLT5waHlzX2FkZHIpOworCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7 CisJCQlicmVhazsKKwkJfQorCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg cGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUp OworCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJLyogT25lIGZyZWVkIHB2IGVudHJ5 IGluIGxvY2tlZF9wbWFwIGlzIHN1ZmZpY2llbnQuICovCisJCWlmIChwbWFwID09IGxvY2tlZF9w bWFwKQorCQkJYnJlYWs7CisJfQorCVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWws IHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlpZiAocG1hcCAhPSBO VUxMKSB7CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJCWlmIChwbWFwICE9IGxvY2tl ZF9wbWFwKQorCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmIChtX3BjID09IE5VTEwgJiYg IVNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQltX3BjID0gU0xJU1RfRklSU1QoJmZyZWUpOworCQlT TElTVF9SRU1PVkVfSEVBRCgmZnJlZSwgcGxpbmtzLnMuc3MpOworCQkvKiBSZWN5Y2xlIGEgZnJl ZWQgcGFnZSB0YWJsZSBwYWdlLiAqLworCQltX3BjLT53aXJlX2NvdW50ID0gMTsKKwkJYXRvbWlj X2FkZF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCX0KKwlwbWFwX2ZyZWVfemVyb19w YWdlcygmZnJlZSk7CisJcmV0dXJuIChtX3BjKTsKK30KKworLyoKKyAqIGZyZWUgdGhlIHB2X2Vu dHJ5IGJhY2sgdG8gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgdm9pZAorZnJlZV9wdl9lbnRy eShwbWFwX3QgcG1hcCwgcHZfZW50cnlfdCBwdikKK3sKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOwor CWludCBiaXQsIGZpZWxkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf TE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFUKGF0 b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRf aW50KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xvbmco JnB2X2VudHJ5X2NvdW50LCAxKSk7CisJcGMgPSBwdl90b19jaHVuayhwdik7CisJaWR4ID0gcHYg LSAmcGMtPnBjX3B2ZW50cnlbMF07CisJZmllbGQgPSBpZHggLyAoc2l6ZW9mKHVfbG9uZykgKiBO QkJZKTsKKwliaXQgPSBpZHggJSAoc2l6ZW9mKHVfbG9uZykgKiBOQkJZKTsKKwlwYy0+cGNfbWFw W2ZpZWxkXSB8PSAxdWwgPDwgYml0OworCWlmIChwYy0+cGNfbWFwWzBdICE9IFBDX0ZSRUUwIHx8 IHBjLT5wY19tYXBbMV0gIT0gUENfRlJFRTEgfHwKKwkgICAgcGMtPnBjX21hcFsyXSAhPSBQQ19G UkVFMikgeworCQkvKiA5OCUgb2YgdGhlIHRpbWUsIHBjIGlzIGFscmVhZHkgYXQgdGhlIGhlYWQg b2YgdGhlIGxpc3QuICovCisJCWlmIChfX3ByZWRpY3RfZmFsc2UocGMgIT0gVEFJTFFfRklSU1Qo JnBtYXAtPnBtX3B2Y2h1bmspKSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5r LCBwYywgcGNfbGlzdCk7CisJCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg cGMsIHBjX2xpc3QpOworCQl9CisJCXJldHVybjsKKwl9CisJVEFJTFFfUkVNT1ZFKCZwbWFwLT5w bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJZnJlZV9wdl9jaHVuayhwYyk7Cit9CisKK3N0YXRp YyB2b2lkCitmcmVlX3B2X2NodW5rKHN0cnVjdCBwdl9jaHVuayAqcGMpCit7CisJdm1fcGFnZV90 IG07CisKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlUQUlMUV9SRU1PVkUoJnB2X2No dW5rcywgcGMsIHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBfTlBDUFYpKTsKKwlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChh dG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkvKiBlbnRpcmUgY2h1bmsgaXMg ZnJlZSwgcmV0dXJuIGl0ICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19Q SFlTKCh2bV9vZmZzZXRfdClwYykpOworCWR1bXBfZHJvcF9wYWdlKG0tPnBoeXNfYWRkcik7CisJ dm1fcGFnZV91bndpcmUobSwgUFFfSU5BQ1RJVkUpOworCXZtX3BhZ2VfZnJlZShtKTsKK30KKwor LyoKKyAqIFJldHVybnMgYSBuZXcgUFYgZW50cnksIGFsbG9jYXRpbmcgYSBuZXcgUFYgY2h1bmsg ZnJvbSB0aGUgc3lzdGVtIHdoZW4KKyAqIG5lZWRlZC4gIElmIHRoaXMgUFYgY2h1bmsgYWxsb2Nh dGlvbiBmYWlscyBhbmQgYSBQViBsaXN0IGxvY2sgcG9pbnRlciB3YXMKKyAqIGdpdmVuLCBhIFBW IGNodW5rIGlzIHJlY2xhaW1lZCBmcm9tIGFuIGFyYml0cmFyeSBwbWFwLiAgT3RoZXJ3aXNlLCBO VUxMIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBsb2NrIG1heSBi ZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHB2X2VudHJ5X3QKK2dldF9wdl9lbnRyeShwbWFwX3Qg cG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCWludCBiaXQsIGZpZWxkLCBpZHg7CisJ cHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXZtX3BhZ2VfdCBtOworCisJ cndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VS VChwbWFwLCBNQV9PV05FRCk7CisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2Fs bG9jcywgMSkpOworcmV0cnk6CisJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7 CisJaWYgKHBjICE9IE5VTEwpIHsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZp ZWxkKyspIHsKKwkJCWlmIChwYy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMt PnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZmllbGQg PCBfTlBDTSkgeworCQkJaWR4ID0gZmllbGQgKiBzaXplb2YocGMtPnBjX21hcFtmaWVsZF0pICog TkJCWSArIGJpdDsKKwkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQlwYy0+cGNfbWFw W2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJLyogSWYgdGhpcyB3YXMgdGhlIGxhc3QgaXRl bSwgbW92ZSBpdCB0byB0YWlsICovCisJCQlpZiAocGMtPnBjX21hcFswXSA9PSAwICYmIHBjLT5w Y19tYXBbMV0gPT0gMCAmJgorCQkJICAgIHBjLT5wY19tYXBbMl0gPT0gMCkgeworCQkJCVRBSUxR X1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQkJCVRBSUxRX0lOU0VS VF9UQUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywKKwkJCQkgICAgcGNfbGlzdCk7CisJCQl9CisJ CQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwkJCVBWX1NU QVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIDEpKTsKKwkJCXJldHVybiAo cHYpOworCQl9CisJfQorCS8qIE5vIGZyZWUgaXRlbXMsIGFsbG9jYXRlIGFub3RoZXIgY2h1bmsg Ki8KKwltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19OT1JNQUwgfCBWTV9BTExP Q19OT09CSiB8CisJICAgIFZNX0FMTE9DX1dJUkVEKTsKKwlpZiAobSA9PSBOVUxMKSB7CisJCWlm IChsb2NrcCA9PSBOVUxMKSB7CisJCQlQVl9TVEFUKHBjX2NodW5rX3RyeWZhaWwrKyk7CisJCQly ZXR1cm4gKE5VTEwpOworCQl9CisJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK KwkJaWYgKG0gPT0gTlVMTCkKKwkJCWdvdG8gcmV0cnk7CisJfQorCVBWX1NUQVQoYXRvbWljX2Fk ZF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNf Y2h1bmtfYWxsb2NzLCAxKSk7CisJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCXBjID0g KHN0cnVjdCBwdl9jaHVuayAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG0p KTsKKwlwYy0+cGNfcG1hcCA9IHBtYXA7CisJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwICYgfjF1 bDsJLyogcHJlYWxsb2NhdGVkIGJpdCAwICovCisJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor CXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK KwlUQUlMUV9JTlNFUlRfVEFJTCgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCXB2ID0gJnBjLT5wY19wdmVudHJ5WzBdOworCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJUFZfU1RBVChhdG9t aWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2lu dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQViAtIDEpKTsKKwlyZXR1cm4gKHB2KTsKK30KKworLyoK KyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvbmUgYml0cyB3aXRoaW4gdGhlIGdpdmVuIFBWIGNo dW5rIG1hcCBlbGVtZW50LgorICovCitzdGF0aWMgaW5saW5lIGludAorcG9wY291bnRfcGNfbWFw X2VsZW0odWludDY0X3QgZWxlbSkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIFRoaXMgc2lt cGxlIG1ldGhvZCBvZiBjb3VudGluZyB0aGUgb25lIGJpdHMgcGVyZm9ybXMgd2VsbCBiZWNhdXNl CisJICogdGhlIGdpdmVuIGVsZW1lbnQgdHlwaWNhbGx5IGNvbnRhaW5zIG1vcmUgemVybyBiaXRz IHRoYW4gb25lIGJpdHMuCisJICovCisJY291bnQgPSAwOworCWZvciAoOyBlbGVtICE9IDA7IGVs ZW0gJj0gZWxlbSAtIDEpCisJCWNvdW50Kys7CisJcmV0dXJuIChjb3VudCk7Cit9CisKKy8qCisg KiBFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIHNwYXJlIFBWIGVudHJpZXMgaW4gdGhlIHNwZWNp ZmllZCBwbWFwIG1lZXRzIG9yCisgKiBleGNlZWRzIHRoZSBnaXZlbiBjb3VudCwgIm5lZWRlZCIu CisgKgorICogVGhlIGdpdmVuIFBWIGxpc3QgbG9jayBtYXkgYmUgcmVsZWFzZWQuCisgKi8KK3N0 YXRpYyB2b2lkCityZXNlcnZlX3B2X2VudHJpZXMocG1hcF90IHBtYXAsIGludCBuZWVkZWQsIHN0 cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBw dl9jaHVuayAqcGM7CisJaW50IGF2YWlsLCBmcmVlOworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFw LCBNQV9PV05FRCk7CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoIiVzOiBsb2NrcCBpcyBOVUxM IiwgX19mdW5jX18pKTsKKworCS8qCisJICogTmV3bHkgYWxsb2NhdGVkIFBWIGNodW5rcyBtdXN0 IGJlIHN0b3JlZCBpbiBhIHByaXZhdGUgbGlzdCB1bnRpbAorCSAqIHRoZSByZXF1aXJlZCBudW1i ZXIgb2YgUFYgY2h1bmtzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuICBPdGhlcndpc2UsCisJICogcmVj bGFpbV9wdl9jaHVuaygpIGNvdWxkIHJlY3ljbGUgb25lIG9mIHRoZXNlIGNodW5rcy4gIEluCisJ ICogY29udHJhc3QsIHRoZXNlIGNodW5rcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbWFwIHVwb24g YWxsb2NhdGlvbi4KKwkgKi8KKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CityZXRyeToKKwlhdmFp bCA9IDA7CisJVEFJTFFfRk9SRUFDSChwYywgJnBtYXAtPnBtX3B2Y2h1bmssIHBjX2xpc3QpIHsK KwkJZnJlZSA9IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMF0pOworCQlmcmVlICs9 IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMV0pOworCQlmcmVlICs9IHBvcGNvdW50 X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMl0pOworCQlpZiAoZnJlZSA9PSAwKQorCQkJYnJlYWs7 CisJCWF2YWlsICs9IGZyZWU7CisJCWlmIChhdmFpbCA+PSBuZWVkZWQpCisJCQlicmVhazsKKwl9 CisJZm9yICg7IGF2YWlsIDwgbmVlZGVkOyBhdmFpbCArPSBfTlBDUFYpIHsKKwkJbSA9IHZtX3Bh Z2VfYWxsb2MoTlVMTCwgMCwgVk1fQUxMT0NfTk9STUFMIHwgVk1fQUxMT0NfTk9PQkogfAorCQkg ICAgVk1fQUxMT0NfV0lSRUQpOworCQlpZiAobSA9PSBOVUxMKSB7CisJCQltID0gcmVjbGFpbV9w dl9jaHVuayhwbWFwLCBsb2NrcCk7CisJCQlpZiAobSA9PSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7 CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwkJ UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfYWxsb2NzLCAxKSk7CisJCWR1bXBfYWRk X3BhZ2UobS0+cGh5c19hZGRyKTsKKwkJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlwYy0+cGNfcG1hcCA9IHBtYXA7CisJ CXBjLT5wY19tYXBbMF0gPSBQQ19GUkVFMDsKKwkJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor CQlwYy0+cGNfbWFwWzJdID0gUENfRlJFRTI7CisJCVRBSUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5w bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwg cGMsIHBjX2xydSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBf TlBDUFYpKTsKKwl9CisJaWYgKCFUQUlMUV9FTVBUWSgmbmV3X3RhaWwpKSB7CisJCW10eF9sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCQlUQUlMUV9DT05DQVQoJnB2X2NodW5rcywgJm5ld190YWls LCBwY19scnUpOworCQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCX0KK30KKworLyoK KyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gcmVtb3ZlIHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNp ZmllZCBwbWFwIGFuZCB2aXJ0dWFsCisgKiBhZGRyZXNzIGZyb20gdGhlIHNwZWNpZmllZCBwdiBs aXN0LiAgUmV0dXJucyB0aGUgcHYgZW50cnkgaWYgZm91bmQgYW5kIE5VTEwKKyAqIG90aGVyd2lz ZS4gIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhl ciA0S0Igb3IKKyAqIDJNQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgcHZfZW50cnlfdAor cG1hcF9wdmhfcmVtb3ZlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZz ZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xv Y2ssIFJBX0xPQ0tFRCk7CisJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4 dCkgeworCQlpZiAocG1hcCA9PSBQVl9QTUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKKwkJ CVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQlwdmgtPnB2X2dl bisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChwdik7Cit9CisKKy8qCisgKiBBZnRl ciBkZW1vdGlvbiBmcm9tIGEgMk1CIHBhZ2UgbWFwcGluZyB0byA1MTIgNEtCIHBhZ2UgbWFwcGlu Z3MsCisgKiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5k IHJlaW5zdGFudGlhdGUgdGhlIHB2CisgKiBlbnRyaWVzIGZvciBlYWNoIG9mIHRoZSA0S0IgcGFn ZSBtYXBwaW5ncy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpwYzsK Kwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisJ aW50IGJpdCwgZmllbGQ7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VE KTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKChwYSAmIFBE Uk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVu Y19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgor CSAqIFRyYW5zZmVyIHRoZSAybXBhZ2UncyBwdiBlbnRyeSBmb3IgdGhpcyBtYXBwaW5nIHRvIHRo ZSBmaXJzdAorCSAqIHBhZ2UncyBwdiBsaXN0LiAgT25jZSB0aGlzIHRyYW5zZmVyIGJlZ2lucywg dGhlIHB2IGxpc3QgbG9jaworCSAqIG11c3Qgbm90IGJlIHJlbGVhc2VkIHVudGlsIHRoZSBsYXN0 IHB2IGVudHJ5IGlzIHJlaW5zdGFudGlhdGVkLgorCSAqLworCXB2aCA9IHBhX3RvX3B2aChwYSk7 CisJdmEgPSB0cnVuY18ybXBhZ2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1h cCwgdmEpOworCUtBU1NFUlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5j X18pKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+ bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCW0tPm1kLnB2X2dlbisrOworCS8qIEluc3RhbnRp YXRlIHRoZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCVBWX1NUQVQoYXRv bWljX2FkZF9sb25nKCZwdl9lbnRyeV9hbGxvY3MsIE5QVEVQRyAtIDEpKTsKKwl2YV9sYXN0ID0g dmEgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKDs7KSB7CisJCXBjID0gVEFJTFFfRklSU1Qo JnBtYXAtPnBtX3B2Y2h1bmspOworCQlLQVNTRVJUKHBjLT5wY19tYXBbMF0gIT0gMCB8fCBwYy0+ cGNfbWFwWzFdICE9IDAgfHwKKwkJICAgIHBjLT5wY19tYXBbMl0gIT0gMCwgKCIlczogbWlzc2lu ZyBzcGFyZSIsIF9fZnVuY19fKSk7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBm aWVsZCsrKSB7CisJCQl3aGlsZSAocGMtPnBjX21hcFtmaWVsZF0pIHsKKwkJCQliaXQgPSBmZnNs KHBjLT5wY19tYXBbZmllbGRdKSAtIDE7CisJCQkJcGMtPnBjX21hcFtmaWVsZF0gJj0gfigxdWwg PDwgYml0KTsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtmaWVsZCAqIDY0ICsgYml0XTsKKwkJ CQl2YSArPSBQQUdFX1NJWkU7CisJCQkJcHYtPnB2X3ZhID0gdmE7CisJCQkJbSsrOworCQkJCUtB U1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJCQkJICAgKCIlczogcGFn ZSAlcCBpcyBub3QgbWFuYWdlZCIsIF9fZnVuY19fLCBtKSk7CisJCQkJVEFJTFFfSU5TRVJUX1RB SUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCQltLT5tZC5wdl9nZW4rKzsKKwkJ CQlpZiAodmEgPT0gdmFfbGFzdCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJVEFJTFFf UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9U QUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJfQorb3V0OgorCWlmIChwYy0+ cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmIHBjLT5wY19tYXBbMl0gPT0g MCkgeworCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwl9CisJ UFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCBOUFRFUEcgLSAxKSk7CisJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9lbnRyeV9zcGFyZSwgTlBURVBHIC0gMSkp OworfQorCisvKgorICogQWZ0ZXIgcHJvbW90aW9uIGZyb20gNTEyIDRLQiBwYWdlIG1hcHBpbmdz IHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBpbmcsCisgKiByZXBsYWNlIHRoZSBtYW55IHB2IGVu dHJpZXMgZm9yIHRoZSA0S0IgcGFnZSBtYXBwaW5ncyBieSBhIHNpbmdsZSBwdiBlbnRyeQorICog Zm9yIHRoZSAyTUIgcGFnZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdl9wcm9t b3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAg c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50 cnlfdCBwdjsKKwl2bV9vZmZzZXRfdCB2YV9sYXN0OworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJS0FTU0VSVCgocGEgJiBQRFJNQVNL KSA9PSAwLAorCSAgICAoIiVzOiBwYSBpcyBub3QgMm1wYWdlIGFsaWduZWQiLCBfX2Z1bmNfXykp OworCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCisJLyoKKwkgKiBU cmFuc2ZlciB0aGUgZmlyc3QgcGFnZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhl IDJtcGFnZSdzCisJICogcHYgbGlzdC4gIEFzaWRlIGZyb20gYXZvaWRpbmcgdGhlIGNvc3Qgb2Yg YSBjYWxsIHRvIGdldF9wdl9lbnRyeSgpLAorCSAqIGEgdHJhbnNmZXIgYXZvaWRzIHRoZSBwb3Nz aWJpbGl0eSB0aGF0IGdldF9wdl9lbnRyeSgpIGNhbGxzCisJICogcmVjbGFpbV9wdl9jaHVuaygp IGFuZCB0aGF0IHJlY2xhaW1fcHZfY2h1bmsoKSByZW1vdmVzIG9uZSBvZiB0aGUKKwkgKiBtYXBw aW5ncyB0aGF0IGlzIGJlaW5nIHByb21vdGVkLgorCSAqLworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo cGEpOworCXZhID0gdHJ1bmNfMm1wYWdlKHZhKTsKKwlwdiA9IHBtYXBfcHZoX3JlbW92ZSgmbS0+ bWQsIHBtYXAsIHZhKTsKKwlLQVNTRVJUKHB2ICE9IE5VTEwsICgiJXM6IHB2IG5vdCBmb3VuZCIs IF9fZnVuY19fKSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgm cHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJcHZoLT5wdl9nZW4rKzsKKwkvKiBGcmVlIHRo ZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCXZhX2xhc3QgPSB2YSArIE5C UERSIC0gUEFHRV9TSVpFOworCWRvIHsKKwkJbSsrOworCQl2YSArPSBQQUdFX1NJWkU7CisJCXBt YXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJfSB3aGlsZSAodmEgPCB2YV9sYXN0KTsK K30KKworLyoKKyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gZGVzdHJveSB0aGUgcHYgZW50cnkgZm9y IHRoZSBzcGVjaWZpZWQgcG1hcCBhbmQgdmlydHVhbAorICogYWRkcmVzcy4gIFRoaXMgb3BlcmF0 aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhlciA0S0Igb3IgMk1CCisg KiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdmhfZnJlZShzdHJ1Y3Qg bWRfcGFnZSAqcHZoLCBwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHZfZW50cnlf dCBwdjsKKworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1hcCwgdmEpOworCUtBU1NFUlQo cHYgIT0gTlVMTCwgKCJwbWFwX3B2aF9mcmVlOiBwdiBub3QgZm91bmQsIHBhICVseCB2YSAlbHgi LAorCSAgICAgKHVfbG9uZylWTV9QQUdFX1RPX1BIWVMoX19jb250YWluZXJvZihwdmgsIHN0cnVj dCB2bV9wYWdlLCBtZCkpLAorCSAgICAgKHVfbG9uZyl2YSkpOworCWZyZWVfcHZfZW50cnkocG1h cCwgcHYpOworfQorCisvKgorICogQ29uZGl0aW9uYWxseSBjcmVhdGUgdGhlIHB2IGVudHJ5IGZv ciBhIDRLQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJlcXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFs bG9jYXRlZCB3aXRob3V0IHJlc3RvcnRpbmcgdG8gcmVjbGFtYXRpb24uCisgKi8KK3N0YXRpYyBi b29sZWFuX3QKK3BtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdl9l bnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJ UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJaWYgKChwdiA9IGdldF9wdl9lbnRy eShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2VuKys7CisJCXJldHVybiAo VFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOworfQorCisvKgorICogQ29uZGl0aW9u YWxseSBjcmVhdGUgdGhlIFBWIGVudHJ5IGZvciBhIDJNQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJl cXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlc29ydGluZyB0byBy ZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9wdl9pbnNlcnRfcGRlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcnds b2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2Owor CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FT U0VSVChwbWFwLCBNQV9PV05FRCk7CisJLyogUGFzcyBOVUxMIGluc3RlYWQgb2YgdGhlIGxvY2sg cG9pbnRlciB0byBkaXNhYmxlIHJlY2xhbWF0aW9uLiAqLworCWlmICgocHYgPSBnZXRfcHZfZW50 cnkocG1hcCwgTlVMTCkpICE9IE5VTEwpIHsKKwkJcHYtPnB2X3ZhID0gdmE7CisJCUNIQU5HRV9Q Vl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCQlwdmggPSBwYV90b19wdmgocGEpOwor CQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCXB2aC0+ cHZfZ2VuKys7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor fQorCisKKy8qCisgKiBGaWxscyBhIHBhZ2UgdGFibGUgcGFnZSB3aXRoIG1hcHBpbmdzIHRvIGNv bnNlY3V0aXZlIHBoeXNpY2FsIHBhZ2VzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9maWxsX3B0 cChwdF9lbnRyeV90ICpmaXJzdHB0ZSwgcHRfZW50cnlfdCBuZXdwdGUpCit7CisJcHRfZW50cnlf dCAqcHRlOworCisJZm9yIChwdGUgPSBmaXJzdHB0ZTsgcHRlIDwgZmlyc3RwdGUgKyBOUFRFUEc7 IHB0ZSsrKSB7CisJCSpwdGUgPSBuZXdwdGU7CisJCW5ld3B0ZSArPSAoUEFHRV9TSVpFID4+IFRM QkxPX1BGTl9TSElGVCk7CisJfQorfQorCisvKgorICogVHJpZXMgdG8gZGVtb3RlIGEgMk1CIHBh Z2UgbWFwcGluZy4gIElmIGRlbW90aW9uIGZhaWxzLCB0aGUgMk1CIHBhZ2UKKyAqIG1hcHBpbmcg aXMgaW52YWxpZGF0ZWQuCisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfZGVtb3RlX3BkZShw bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3Qg cndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWxvY2sgPSBOVUxMOworCXJ2ID0gcG1h cF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisJaWYgKGxvY2sgIT0g TlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGJv b2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJIHBk X2VudHJ5X3QgbmV3cGRlLCBvbGRwZGU7CisJIHB0X2VudHJ5X3Qgb2xkcHRlLCAqZmlyc3RwdGUs IG5ld3B0ZTsKKwkgdm1fcGFkZHJfdCBtcHRlcGE7CisJIHZtX3BhZ2VfdCBtcHRlOworCSBzdHJ1 Y3Qgc3BnbGlzdCBmcmVlOworCisJIFBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwor CSBvbGRwZGUgPSAqcGRlOworCSBvbGRwdGUgPSAocHRfZW50cnlfdClvbGRwZGU7CisJIEtBU1NF UlQocHRlX2lzXzFtX3N1cGVycGFnZSgmb2xkcHRlKSAmJiBwdGVfaXNfdmFsaWQoJm9sZHB0ZSks CisJICAgICAoIiVzOiBvbGRwZGUgaXMgbm90IHN1cGVycGFnZSBhbmQvb3IgdmFsaWQuIiwgX19m dW5jX18pKTsKKwkgaWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkgJiYgKG1wdGUgPSBwbWFwX2xvb2t1 cF9wdF9wYWdlKHBtYXAsIHZhKSkgIT0KKwkgICAgIE5VTEwpCisJCSBwbWFwX3JlbW92ZV9wdF9w YWdlKHBtYXAsIG1wdGUpOworCSBlbHNlIHsKKwkJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUs IFBURV9XKSwKKwkJICAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgZm9yIGEgd2lyZWQgbWFwcGlu ZyBpcyBtaXNzaW5nIiwKKwkJICAgICBfX2Z1bmNfXykpOworCQkgLyoKKwkJICAqIEludmFsaWRh dGUgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5kIHJldHVybiAiZmFpbHVyZSIgaWYgdGhlCisJCSAg KiBtYXBwaW5nIHdhcyBuZXZlciBhY2Nlc3NlZCBvciB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3 CisJCSAgKiBwYWdlIHRhYmxlIHBhZ2UgZmFpbHMuICBJZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBi ZWxvbmdzIHRvCisJCSAgKiB0aGUgZGlyZWN0IG1hcCByZWdpb24gb2YgdGhlIGtlcm5lbCdzIGFk ZHJlc3Mgc3BhY2UsIHRoZW4KKwkJICAqIHRoZSBwYWdlIGFsbG9jYXRpb24gcmVxdWVzdCBzcGVj aWZpZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUKKwkJICAqIHByaW9yaXR5IChWTV9BTExPQ19JTlRF UlJVUFQpLiAgT3RoZXJ3aXNlLCB0aGUgcHJpb3JpdHkgaXMKKwkJICAqIG5vcm1hbC4gIFBhZ2Ug dGFibGUgcGFnZXMgYXJlIHByZWFsbG9jYXRlZCBmb3IgZXZlcnkgb3RoZXIKKwkJICAqIHBhcnQg b2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCBzbyB0aGUgZGlyZWN0IG1hcCByZWdpb24KKwkJ ICAqIGlzIHRoZSBvbmx5IHBhcnQgb2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlIHRoYXQgbXVz dCBiZQorCQkgICogaGFuZGxlZCBoZXJlLgorCQkgICovCisJCSBpZiAoIXB0ZV9pc19yZWYoJm9s ZHB0ZSkgfHwgKG1wdGUgPSB2bV9wYWdlX2FsbG9jKE5VTEwsCisJCSAgICAgcG1hcF9wZGVfcGlu ZGV4KHZhKSwgKHZhID49IFZNX01JTl9LRVJORUxfQUREUkVTUyAmJiB2YSA8CisJCSAgICAgVk1f TUFYX0FERFJFU1MgPyBWTV9BTExPQ19JTlRFUlJVUFQgOiBWTV9BTExPQ19OT1JNQUwpIHwKKwkJ ICAgICBWTV9BTExPQ19OT09CSiB8IFZNX0FMTE9DX1dJUkVEKSkgPT0gTlVMTCkgeworCQkJIFNM SVNUX0lOSVQoJmZyZWUpOworCQkJIHBtYXBfcmVtb3ZlX3BkZShwbWFwLCBwZGUsIHRydW5jXzJt cGFnZSh2YSksICZmcmVlLAorCQkJICAgICBsb2NrcCk7CisJCQkgcG1hcF9pbnZhbGlkYXRlX3Jh bmdlKHBtYXAsCisJCQkgICAgICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSyksCisJCQkgICAg ICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSykgKyBOQlBEUik7CisJCQkgcG1hcF9mcmVlX3pl cm9fcGFnZXMoJmZyZWUpOworCQkJIENUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEg JSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCSByZXR1 cm4gKEZBTFNFKTsKKwkJIH0KKwkJIGlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykKKwkJCSBw bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKwkgfQorCSBtcHRlcGEgPSBWTV9QQUdF X1RPX1BIWVMobXB0ZSk7CisJIG5ld3BkZSA9IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19ESVJF Q1QobXB0ZXBhKTsKKwkgZmlyc3RwdGUgPSBuZXdwZGU7CisJIEtBU1NFUlQocHRlX2lzX3JlZigm b2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHB0ZSBpcyBub3QgcmVmZXJlbmNlZCIsIF9fZnVuY19f KSk7CisJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9STykgJiYgcHRlX3Rlc3QoJm9s ZHB0ZSwgUFRFX0QpLAorCSAgICAgKCIlczogb2xkcHRlIGlzIG1pc3NpbmcgUFRFX0QiLCBfX2Z1 bmNfXykpOworCSBuZXdwdGUgPSBvbGRwdGUgJiB+UFRFX1BTX0lEWF9NQVNLOworCisJIC8qCisJ ICAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbmV3LCBpbml0aWFsaXplIGl0LgorCSAgKi8K KwkgaWYgKG1wdGUtPndpcmVfY291bnQgPT0gMSkgeworCQkgbXB0ZS0+d2lyZV9jb3VudCA9IE5Q VEVQRzsKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0ZSk7CisJIH0KKwkgS0FTU0VS VChUTEJMT19QVEVfVE9fUEEoKmZpcnN0cHRlKSA9PSBUTEJMT19QVEVfVE9fUEEobmV3cHRlKSwK KwkgICAgICgiJXM6IGZpcnN0cHRlIGFuZCBuZXdwdGUgbWFwIGRpZmZlcmVudCBwaHlzaWNhbCBh ZGRyZXNzZXMiLAorCSAgICAgX19mdW5jX18pKTsKKworCSAvKgorCSAgKiBJZiB0aGUgbWFwcGlu ZyBoYXMgY2hhbmdlZCBhdHRyaWJ1dGVzLCB1cGRhdGUgdGhlIHBhZ2UgdGFibGUKKwkgICogZW50 cmllcy4KKwkgICovCisJIGlmICgoKmZpcnN0cHRlICYgUEdfUFJPTU9URV9NQVNLKSAhPSAobmV3 cHRlICYgUEdfUFJPTU9URV9NQVNLKSkKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0 ZSk7CisKKworCSAvKgorCSAgKiBUaGUgc3BhcmUgUFYgZW50cmllcyBtdXN0IGJlIHJlc2VydmVk IHByaW9yIHRvIGRlbW90aW5nIHRoZQorCSAgKiBtYXBwaW5nLCB0aGF0IGlzLCBwcmlvciB0byBj aGFuZ2luZyB0aGUgUERFLiAgT3RoZXJ3aXNlLCB0aGUgc3RhdGUKKwkgICogb2YgdGhlIFBERSBh bmQgdGhlIFBWIGxpc3RzIHdpbGwgYmUgaW5jb25zaXN0ZW50LCB3aGljaCBjYW4gcmVzdWx0CisJ ICAqIGluIHJlY2xhaW1fcHZfY2h1bmsoKSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhIFBWIGVudHJ5 IGZyb20gdGhlCisJICAqIHdyb25nIFBWIGxpc3QgYW5kIHBtYXBfcHZfZGVtb3RlX3BkZSgpIGZh aWxpbmcgdG8gZmluZCB0aGUgZXhwZWN0ZWQKKwkgICogUFYgZW50cnkgZm9yIHRoZSAyTUIgcGFn ZSBtYXBwaW5nIHRoYXQgaXMgYmVpbmcgZGVtb3RlZC4KKwkgICovCisJIGlmIChwZGVfdGVzdCgm b2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCSByZXNlcnZlX3B2X2VudHJpZXMocG1hcCwgTlBURVBH IC0gMSwgbG9ja3ApOworCisJIC8qCisJICAqIERlbW90ZSB0aGUgbWFwcGluZy4gIFRoaXMgcG1h cCBpcyBsb2NrZWQuICBUaGUgb2xkIFBERSBoYXMKKwkgICogUFRFX1JFRiBzZXQuICBJZiB0aGUg b2xkIFBERSBoYXMgUFRFX1JPIGNsZWFyLCBpdCBhbHNvIGhhcworCSAgKiBQVEVfRCBzZXQuICBU aHVzLCB0aGVyZSBpcyBubyBkYW5nZXIgb2YgYSByYWNlIHdpdGggYW5vdGhlcgorCSAgKiBwcm9j ZXNzb3IgY2hhbmdpbmcgdGhlIHNldHRpbmcgb2YgUFRFX1JFRiBhbmQvb3IgUFRFX0QgYmV0d2Vl bgorCSAgKiB0aGUgcmVhZCBhYm92ZSBhbmQgdGhlIHN0b3JlIGJlbG93LgorCSAgKi8KKwkgcG1h cF91cGRhdGVfcGRlKHBtYXAsIHZhLCBwZGUsIChwdF9lbnRyeV90KW5ld3BkZSk7CisKKwkgLyoK KwkgICogSW52YWxpZGF0ZSBhIHN0YWxlIHJlY3Vyc2l2ZSBtYXBwaW5nIG9mIHRoZSBwYWdlIHRh YmxlIHBhZ2UuCisJICAqLworCSBpZiAodmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkgcG1h cF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgKHZtX29mZnNldF90KXBtYXBfcHRlKHBtYXAsIHZhKSk7 CisKKwkgLyoKKwkgICogRGVtb3RlIHRoZSBQViBlbnRyeS4KKwkgICovCisJIGlmIChwZGVfdGVz dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwLCB2 YSwgVExCTE9fUERFX1RPX1BBKG9sZHBkZSksIGxvY2twKTsKKwkgfQorCSBhdG9taWNfYWRkX2xv bmcoJnBtYXBfcGRlX2RlbW90aW9ucywgMSk7CisJIENUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICAgcG1hcCk7CisK KwkgcmV0dXJuIChUUlVFKTsKK30KKworLyoKKyAqIHBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IFJl bW92ZSBhIGtlcm5lbCBzdXBlcnBhZ2UgbWFwcGluZy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBf cmVtb3ZlX2tlcm5lbF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJLyogWFhYIE5vdCBkb2luZyBrZXJuZWwgc3VwZXJwYWdlcyB5ZXQuICovCisJ cGFuaWMoInBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IGtlcm5lbCBzdXBlcnBhZ2UiKTsKK30KKwor LyoKKyAqIHBtYXBfcmVtb3ZlX3BkZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHN1cGVycGFn ZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1vdmVfcGRlKHBtYXBfdCBw bWFwLCBwZF9lbnRyeV90ICpwZHEsIHZtX29mZnNldF90IHN2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlz dCAqZnJlZSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7 CisJcGRfZW50cnlfdCBvbGRwZGU7CisJdm1fb2Zmc2V0X3QgZXZhLCB2YTsKKwl2bV9wYWdlX3Qg bSwgbXB0ZTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUg c3VwZXJwYWdlIGJlaW5nIHVubWFwcGVkLgorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl X2luZGV4KChzdmEgJiB+UERSTUFTSyksIE5CUERSKTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1h cCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHN2YSAmIFBEUk1BU0spID09IDAsCisJICAgICgicG1h cF9yZW1vdmVfcGRlOiBzdmEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIikpOworCisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKQorCQlvbGRwZGUgPSBwZGVfbG9hZF9zdG9yZShwZHEsIFBURV9HKTsK KwllbHNlCisJCW9sZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgMCk7CisJaWYgKHBkZV90ZXN0 KCZvbGRwZGUsIFBURV9XKSkKKwkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQgLT0gTkJQRFIg LyBQQUdFX1NJWkU7CisKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX0cpKQorCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShrZXJuZWxfcG1hcCwgc3ZhKTsKKworCXBtYXBfcmVzaWRlbnRfY291bnRf ZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRF X01BTkFHRUQpKSB7CisJICAgIENIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgVExC TE9fUERFX1RPX1BBKG9sZHBkZSkpOworCSAgICBwdmggPSBwYV90b19wdmgoVExCTE9fUERFX1RP X1BBKG9sZHBkZSkpOworCSAgICBwbWFwX3B2aF9mcmVlKHB2aCwgcG1hcCwgc3ZhKTsKKwkgICAg ZXZhID0gc3ZhICsgTkJQRFI7CisJICAgIGZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RPX1ZNX1BB R0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQl2YSA8IGV2YTsgdmEgKz0gUEFHRV9TSVpF LCBtKyspIHsKKwkJICAgIGlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYgIXBkZV90ZXN0 KCZvbGRwZGUsIFBURV9STykpCisJCQkgICAgdm1fcGFnZV9kaXJ0eShtKTsKKwkJICAgIGlmIChw ZGVfdGVzdCgmb2xkcGRlLCBQVEVfUkVGKSkKKwkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9S RUZFUkVOQ0VEKTsKKwkJICAgIGlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ CVRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIo bSwgUEdBX1dSSVRFQUJMRSk7CisJICAgIH0KKwl9CisJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXAp IHsKKwkJcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwLCBwZHEsIHN2YSk7CisJfSBlbHNlIHsK KwkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgc3ZhKTsKKwkJaWYgKG1wdGUgIT0g TlVMTCkgeworCQkJcG1hcF9yZW1vdmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCXBtYXBfcmVz aWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09 IE5QVEVQRywKKwkJCSAgICAoInBtYXBfcmVtb3ZlX3BkZTogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl cnJvciIpKTsKKwkJCW1wdGUtPndpcmVfY291bnQgPSAwOworCQkJcG1hcF9hZGRfZGVsYXllZF9m cmVlX2xpc3QobXB0ZSwgZnJlZSwgRkFMU0UpOworCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1f Y250LnZfd2lyZV9jb3VudCwgMSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBt YXAsIHN2YSwgKnBtYXBfc2VnbWFwKHBtYXAsIHN2YSksIGZyZWUpKTsKK30KKworLyoKKyAqIHBt YXBfcmVtb3ZlX3B0ZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHBhZ2UgaW4gYSBwcm9jZXNz CisgKi8KK3N0YXRpYyBpbnQKK3BtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRf ZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3Ry dWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf cGFnZSAqcHZoOworCXB0X2VudHJ5X3Qgb2xkcHRlOworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9M T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNh Y2hlIGxpbmVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJICovCisJbWlwc19kY2Fj aGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7CisKKwlvbGRwdGUgPSAqcHRxOwor CWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJKnB0cSA9IFBURV9HOworCWVsc2UKKwkJKnB0 cSA9IDA7CisKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQlwbWFwLT5wbV9zdGF0 cy53aXJlZF9jb3VudCAtPSAxOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7 CisJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9NQU5BR0VEKSkgeworCQltID0gUEhZU19UT19W TV9QQUdFKFRMQkxPX1BURV9UT19QQShvbGRwdGUpKTsKKwkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUs IFBURV9EKSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSwKKwkJCSAg ICgiJXM6IG1vZGlmaWVkIHBhZ2Ugbm90IHdyaXRhYmxlOiB2YTogJXAsIHB0ZTogJSNqeCIsCisJ CQkgICAgX19mdW5jX18sICh2b2lkICopdmEsICh1aW50bWF4X3Qpb2xkcHRlKSk7CisJCQl2bV9w YWdlX2RpcnR5KG0pOworCQl9CisJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJdm1fcGFn ZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RP X1ZNX1BBR0UobG9ja3AsIG0pOworCQlwbWFwX3B2aF9mcmVlKCZtLT5tZCwgcG1hcCwgdmEpOwor CQlpZiAoVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJCSAgICAobS0+ZmxhZ3MgJiBQ R19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlT KG0pKTsKKwkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9saXN0KSkKKwkJCQl2bV9wYWdlX2Fm bGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCQl9CisJfQorCXJldHVybiAocG1hcF91bnVz ZV9wdChwbWFwLCB2YSwgcHRlcGRlLCBmcmVlKSk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBzaW5n bGUgcGFnZSBmcm9tIGEgcHJvY2VzcyBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkCitw bWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0 IHNwZ2xpc3QgKmZyZWUpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05F RCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRl ID09IDApCisJCXJldHVybjsKKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisKKwkv KgorCSAqIElmIHRoZXJlIGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQh CisJICovCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkKKwkJcmV0dXJuOworCisJbG9jayA9IE5V TEw7CisJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0ZSwgdmEsICpwZGUsIGZyZWUsICZs b2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKK30KKworLyoKKyAqCVJlbW92ZSB0aGUgZ2l2ZW4gcmFu Z2Ugb2YgYWRkcmVzc2VzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAuCisgKgorICoJSXQgaXMgYXNz dW1lZCB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGFyZSBwcm9wZXJseQorICoJcm91bmRlZCB0byB0 aGUgcGFnZSBzaXplLgorICovCit2b2lkCitwbWFwX3JlbW92ZShwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2 bV9vZmZzZXRfdCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90IHB0cGFkZHIsICpwZGUsICpwZHBl OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCWludCBhbnl2YWxp ZDsKKworCS8qCisJICogUGVyZm9ybSBhbiB1bnN5bmNocm9uaXplZCByZWFkLiAgVGhpcyBpcywg aG93ZXZlciwgc2FmZS4KKwkgKi8KKwlpZiAocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQg PT0gMCkKKwkJcmV0dXJuOworCisJYW55dmFsaWQgPSAwOworCVNMSVNUX0lOSVQoJmZyZWUpOwor CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCisJLyoK KwkgKiBzcGVjaWFsIGhhbmRsaW5nIG9mIHJlbW92aW5nIG9uZSBwYWdlLiAgYSB2ZXJ5IGNvbW1v biBvcGVyYXRpb24KKwkgKiBhbmQgZWFzeSB0byBzaG9ydCBjaXJjdWl0IHNvbWUgY29kZS4KKwkg Ki8KKwlpZiAoKHN2YSArIFBBR0VfU0laRSkgPT0gZXZhKSB7CisJCXBkZSA9IHBtYXBfcGRlKHBt YXAsIHN2YSk7CisJCWlmICghcGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlwbWFwX3Jl bW92ZV9wYWdlKHBtYXAsIHN2YSwgJmZyZWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwls b2NrID0gTlVMTDsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCWlmIChw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJcGRwZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0 ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIENhbGN1bGF0ZSBp bmRleCBmb3IgbmV4dCBwYWdlIHRhYmxlLgorCQkgKi8KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBE UikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOwor CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJcHRwYWRkciA9ICpwZGU7 CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmIChw dHBhZGRyID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHN1cGVy cGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKCZwdHBhZGRyKSkgeworCQkJ LyoKKwkJCSAqIEFyZSB3ZSByZW1vdmluZyB0aGUgZW50aXJlIHN1cGVycGFnZT8gIElmIG5vdCwK KwkJCSAqIGRlbW90ZSB0aGUgbWFwcGluZyBhbmQgZmFsbCB0aHJvdWdoLgorCQkJICovCisJCQlp ZiAoc3ZhICsgTkJQRFIgPT0gdmFfbmV4dCAmJiBldmEgPj0gdmFfbmV4dCkgeworCQkJCS8qCisJ CQkJICogVGhlIFRMQiBlbnRyeSBmb3IgYSBQVEVfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxp ZGF0ZWQgYnkgcG1hcF9yZW1vdmVfcGRlKCkuCisJCQkJICovCisJCQkJaWYgKCFwZGVfdGVzdCgm cHRwYWRkciwgUFRFX0cpKQorCQkJCQlhbnl2YWxpZCA9IFRSVUU7CisJCQkJcG1hcF9yZW1vdmVf cGRlKHBtYXAsIHBkZSwgc3ZhLCAmZnJlZSwgJmxvY2spOworCQkJCWNvbnRpbnVlOworCQkJfSBl bHNlIGlmICghcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwKKwkJCSAgICAm bG9jaykpIHsKKwkJCQkvKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRlc3Ryb3llZC4gKi8K KwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHRwYWRkciA9ICpwZGU7CisJCQl9CisJ CX0KKworCQkvKgorCQkgKiBMaW1pdCBvdXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUg dmEgcmVwcmVzZW50ZWQKKwkJICogYnkgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0 byB0aGUgZW5kIG9mIHRoZQorCQkgKiByYW5nZSBiZWluZyByZW1vdmVkLgorCQkgKi8KKwkJaWYg KHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJ Zm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRl KyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUp KSB7CisJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKKwkJCQkJcG1hcF9pbnZhbGlkYXRlX3Jhbmdl KHBtYXAsIHZhLCBzdmEpOworCQkJCQl2YSA9IHZhX25leHQ7CisJCQkJfQorCQkJCWNvbnRpbnVl OworCQkJfQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlhbnl2YWxpZCA9IFRS VUU7CisJCQlpZiAodmEgPT0gdmFfbmV4dCkKKwkJCQl2YSA9IHN2YTsKKwkJCWlmIChwbWFwX3Jl bW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsIHB0cGFkZHIsICZmcmVlLAorCQkJICAgICZsb2NrKSkg eworCQkJCXN2YSArPSBQQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHZh ICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJ fQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CitvdXQ6CisJaWYgKGFu eXZhbGlkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworfQorCisvKgorICoJUm91dGluZToJcG1hcF9yZW1vdmVfYWxsCisgKglGdW5jdGlv bjoKKyAqCQlSZW1vdmVzIHRoaXMgcGh5c2ljYWwgcGFnZSBmcm9tCisgKgkJYWxsIHBoeXNpY2Fs IG1hcHMgaW4gd2hpY2ggaXQgcmVzaWRlcy4KKyAqCQlSZWZsZWN0cyBiYWNrIG1vZGlmeSBiaXRz IHRvIHRoZSBwYWdlci4KKyAqCisgKglOb3RlczoKKyAqCQlPcmlnaW5hbCB2ZXJzaW9ucyBvZiB0 aGlzIHJvdXRpbmUgd2VyZSB2ZXJ5CisgKgkJaW5lZmZpY2llbnQgYmVjYXVzZSB0aGV5IGl0ZXJh dGl2ZWx5IGNhbGxlZAorICoJCXBtYXBfcmVtb3ZlIChzbG93Li4uKQorICovCit2b2lkCitwbWFw X3JlbW92ZV9hbGwodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9l bnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKwlwZF9l bnRyeV90ICpwZGU7CisJdm1fb2Zmc2V0X3QgdmE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwor CUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9y ZW1vdmVfYWxsOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCVNMSVNUX0lOSVQoJmZy ZWUpOworCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQR19G SUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2aCA9IHBhX3RvX3B2 aChWTV9QQUdFX1RPX1BIWVMobSkpOworCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmcHZoLT5w dl9saXN0KSkgIT0gTlVMTCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCVBNQVBfTE9DSyhw bWFwKTsKKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJ KHZvaWQpcG1hcF9kZW1vdGVfcGRlKHBtYXAsIHBkZSwgdmEpOworCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwl3aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1k LnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NL KHBtYXApOworCisJCS8qCisJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg Y2FjaGVzIGZyb20KKwkJICogdGhlIHBhZ2UgYmVpbmcgZGVzdHJveWVkCisJCSAqLworCQlpZiAo VEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgPT0gTlVMTCkKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh bmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsKKworCQlwbWFwX3Jlc2lkZW50X2NvdW50 X2RlYyhwbWFwLCAxKTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT U0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsICgicG1hcF9yZW1vdmVfYWxsOiBwZGUiKSk7 CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFwX3JlbW92ZV9hbGw6IGZv dW5kIgorCQkgICAgIiBhIHN1cGVycGFnZSBpbiBwYWdlICVwICdzIHB2IGxpc3QiLCBtKSk7CisJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisKKwkJdHB0ZSA9ICpwdGU7 CisJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9wbWFwKHBtYXApID8gUFRFX0cgOiAwKTsKKwor CQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv dW50LS07CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgZGlydHkgYW5kIHJlZmVy ZW5jZSBiaXRzLgorCQkgKi8KKwkJaWYgKHB0ZV9pc19yZWYoJnRwdGUpKQorCQkJdm1fcGFnZV9h ZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9E KSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJnRwdGUsIFBURV9STyksCisJCQkgICAgKCIlczog bW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IgorCQkJICAgICwg X19mdW5jX18sICh2b2lkICopcHYtPnB2X3ZhLCAodWludG1heF90KXRwdGUpKTsKKwkJCXZtX3Bh Z2VfZGlydHkobSk7CisJCX0KKwkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUs ICZmcmVlKTsKKwkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKworCQlU QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2Vu Kys7CisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9 CisKKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxvY2so JnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworfQorCisv KgorICogcG1hcF9wcm90ZWN0X3BkZTogZG8gdGhlIHRoaW5ncyB0byBwcm90ZWN0IGEgc3VwZXJw YWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3Byb3RlY3RfcGRl KHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHN2YSwgdm1fcHJvdF90 IHByb3QpCit7CisJcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwl2bV9vZmZzZXRfdCBldmEs IHZhOworCXZtX3BhZ2VfdCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkOworCisJUE1BUF9MT0NL X0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3ZhICYgUERSTUFTSykgPT0gMCwK KwkgICAgKCIlczogc3ZhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJYW55 Y2hhbmdlZCA9IEZBTFNFOworcmV0cnk6CisJb2xkcGRlID0gbmV3cGRlID0gKnBkZTsKKwlpZiAo cGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKSB7CisJCWV2YSA9IHN2YSArIE5CUERSOwor CQlmb3IgKHZhID0gc3ZhLCBtID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BERV9UT19QQShvbGRw ZGUpKTsKKwkJICAgIHZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykKKwkJCWlmIChwZGVf dGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JP KSkKKwkJCQl2bV9wYWdlX2RpcnR5KG0pOworCX0KKwlpZiAoKHByb3QgJiBWTV9QUk9UX1dSSVRF KSA9PSAwKSB7CisJCXBkZV9zZXQoJm5ld3BkZSwgUFRFX1JPKTsKKwkJcGRlX2NsZWFyKCZuZXdw ZGUsIFBURV9EKTsKKwl9CisJaWYgKG5ld3BkZSAhPSBvbGRwZGUpIHsKKwkJaWYgKCFhdG9taWNf Y21wc2V0X2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIChwdF9lbnRyeV90KW9sZHBkZSwKKwkJICAg IChwdF9lbnRyeV90KW5ld3BkZSkpCisJCQlnb3RvIHJldHJ5OworCQlpZiAocGRlX3Rlc3QoJm9s ZHBkZSwgUFRFX0cpKQorCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJZWxz ZQorCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJfQorCXJldHVybiAoYW55Y2hhbmdlZCk7Cit9CisK Ky8qLQorICoJU2V0IHRoZSBwaHlzaWNhbCBwcm90ZWN0aW9uIG9uIHRoZQorICoJc3BlY2lmaWVk IHJhbmdlIG9mIHRoaXMgbWFwIGFzIHJlcXVlc3RlZC4KKyAqLwordm9pZAorcG1hcF9wcm90ZWN0 KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSwgdm1fcHJvdF90 IHByb3QpCit7CisJdm1fb2Zmc2V0X3QgdmEsIHZhX25leHQ7CisJcGRfZW50cnlfdCAqcGRlLCAq cGRwZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3Rz X2xvY2tlZDsKKworCWlmICgocHJvdCAmIFZNX1BST1RfUkVBRCkgPT0gVk1fUFJPVF9OT05FKSB7 CisJCXBtYXBfcmVtb3ZlKHBtYXAsIHN2YSwgZXZhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocHJv dCAmIFZNX1BST1RfV1JJVEUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNF OworcmVzdW1lOgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlm b3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3NlZ21hcChw bWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJdmFfbmV4dCA9IChzdmEgKyBOQlNF RykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25leHQgPSBldmE7 CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNL OworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1h cF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCisJCS8qCisJCSAqIFdlZWQgb3V0IGludmFsaWQg bWFwcGluZ3MuCisJCSAqLworCQlpZiAoKnBkZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJ LyoKKwkJICogQ2hlY2sgZm9yIHN1cGVycGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkZSkpIHsKKwkJCS8qCisJCQkgKiBBcmUgd2UgcHJvdGVjdGluZyB0aGUgZW50aXJl IHN1cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRo cm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2 YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBHX0cgbWFwcGlu ZyBpcworCQkJCSAqIGludmFsaWRhdGVkIGJ5IHBtYXBfcHJvdGVjdF9wZGUoKS4KKwkJCQkgKi8K KwkJCQlpZiAocG1hcF9wcm90ZWN0X3BkZShwbWFwLCBwZGUsIHN2YSwgcHJvdCkpCisJCQkJCWFu eWNoYW5nZWQgPSBUUlVFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXB2 X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOworCQkJCQlpZiAo IXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJaWYgKGFueWNoYW5nZWQp CisJCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbCgKKwkJCQkJCQkgICAgcG1hcCk7CisJCQkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJ CQkJZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUo cG1hcCwgcGRlLCBzdmEpKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGlu ZyB3YXMgZGVzdHJveWVkLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQor CQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2 YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRv IHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5nIHdyaXRlIHByb3RlY3RlZC4KKwkJICov CisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQl2YSA9IHZhX25l eHQ7CisJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25l eHQ7IHB0ZSsrLAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJcHRfZW50cnlfdCBwYml0 czsKKwkJCXZtX3BhZ2VfdCBtOworCQkJdm1fcGFkZHJfdCBwYTsKKworCQkJcGJpdHMgPSAqcHRl OworCQkJaWYgKCFwdGVfaXNfdmFsaWQoJnBiaXRzKSB8fCBwdGVfdGVzdCgmcGJpdHMsIFBURV9S TykpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu Z2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGlu dWU7CisJCQl9CisJCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKwkJCWlmIChwdGVfdGVzdCgm cGJpdHMsIFBURV9EKSkgeworCQkJCXB0ZV9jbGVhcigmcGJpdHMsIFBURV9EKTsKKwkJCQlpZiAo cHRlX3Rlc3QoJnBiaXRzLCBQVEVfTUFOQUdFRCkpIHsKKwkJCQkJcGEgPSBUTEJMT19QVEVfVE9f UEEocGJpdHMpOworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQkJdm1fcGFnZV9k aXJ0eShtKTsKKwkJCQl9CisJCQkJaWYgKHZhID09IHZhX25leHQpCisJCQkJCXZhID0gc3ZhOwor CQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFVubGVzcyBQVEVfRCBpcyBzZXQsIGFueSBUTEIg ZW50cmllcworCQkJCSAqIG1hcHBpbmcgInN2YSIgZG9uJ3QgYWxsb3cgd3JpdGUgYWNjZXNzLCBz bworCQkJCSAqIHRoZXkgbmVlZG4ndCBiZSBpbnZhbGlkYXRlZC4KKwkJCQkgKi8KKwkJCQlpZiAo dmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2 YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQl9CisJCQkqcHRlID0gcGJpdHM7CisJ CX0KKwkJaWYgKHZhICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwg dmEsIHN2YSk7CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBt YXApOworCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s b2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qLQorICogVHJpZXMgdG8gcHJv bW90ZSB0aGUgNTEyLCBjb250aWd1b3VzIDRLQiBwYWdlIG1hcHBpbmdzIHRoYXQgYXJlIHdpdGhp biBhCisgKiBzaW5nbGUgcGFnZSB0YWJsZSBwYWdlIHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBp bmcuICBGb3IgcHJvbW90aW9uIHRvCisgKiBvY2N1ciwgdHdvIGNvbmRpdGlvbnMgbXVzdCBiZSBt ZXQ6ICgxKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBtYXAKKyAqIGFsaWduZWQsIGNvbnRp Z3VvdXMgcGh5c2ljYWwgbWVtb3J5IGFuZCAoMikgdGhlIDRLQiBwYWdlIG1hcHBpbmdzIG11c3Qg aGF2ZQorICogaWRlbnRpY2FsIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBPbiBNSVBTNjQgcHJv bW90aW9ucyBhcmUgYWN0dWFsbHkgZG9uZSBpbiBwYWlycyBvZiB0d28gMU1CIHN1cGVycGFnZXMK KyAqIGJlY2F1c2Ugb2YgdGhlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZSAodHdvIHBoeXNpY2FsIHBh Z2VzIGFyZSBpbiBhIHNpbmdsZQorICogVExCIGVudHJ5KSBldmVuIHRob3VnaCBWTSBsYXllciBp cyB1bmRlciB0aGUgaW1wcmVzc2lvbiB0aGF0IHRoZSBzdXBlcnBhZ2UKKyAqIHNpemUgaXMgYWN0 dWFsbHkgMk1CLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1h cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoq bG9ja3ApCit7CisJcHRfZW50cnlfdCBuZXdwZGU7CisJcHRfZW50cnlfdCAqZmlyc3RwdGUsIG9s ZHB0ZSwgcGEsICpwdGU7CisJdm1fb2Zmc2V0X3Qgb2xkcHRldmE7CisJdm1fcGFnZV90IG1wdGU7 CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKgorCSAqIEV4YW1pbmUg dGhlIGZpcnN0IFBURSBpbiB0aGUgc3BlY2lmaWVkIFBUUC4gIEFib3J0IGlmIHRoaXMgUFRFIGlz CisJICogZWl0aGVyIGludmFsaWQsIHVudXNlZCwgb3IgZG9lcyBub3QgbWFwIHRoZSBmaXJzdCA0 S0IgcGh5c2ljYWwgcGFnZQorCSAqIHdpdGhpbiBhIDJNQiBwYWdlLgorCSAqLworCWZpcnN0cHRl ID0gcG1hcF9wdGUocG1hcCwgdHJ1bmNfMm1wYWdlKHZhKSk7CitzZXRwZGU6CisJbmV3cGRlID0g KmZpcnN0cHRlOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQkvKiBYWFggbm90IGRv aW5nIGtlcm5lbCBwbWFwIHlldCAqLworCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFp bHVyZXMsIDEpOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g cG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm47CisJfQorCWlm ICghcHRlX2lzX3ZhbGlkKCZuZXdwZGUpIHx8ICFwdGVfaXNfcmVmKCZuZXdwZGUpKSB7CisJCWF0 b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRCkg JiYgIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9STykpIHsKKwkJLyoKKwkJICogV2hlbiBQVEVfRCBp cyBhbHJlYWR5IGNsZWFyLCBQVEVfUk8gY2FuIGJlIHNldCB3aXRob3V0CisJCSAqIGEgVExCIGlu dmFsaWRhdGlvbi4KKwkJICovCisJCWlmICghYXRvbWljX2NtcHNldF9sb25nKCh1X2xvbmcgKilm aXJzdHB0ZSwgbmV3cGRlLCBuZXdwZGUgfAorCQkgICAgUFRFX1JPKSkKKwkJCWdvdG8gc2V0cGRl OworCQluZXdwZGUgfD0gUFRFX1JPOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIG9mIHRo ZSBvdGhlciBQVEVzIGluIHRoZSBzcGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcworCSAqIFBU RSBtYXBzIGFuIHVuZXhwZWN0ZWQgNEtCIHBoeXNpY2FsIHBhZ2Ugb3IgZG9lcyBub3QgaGF2ZSBp ZGVudGljYWwKKwkgKiBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIGZpcnN0IFBURS4KKwkgKi8KKwlw YSA9IFRMQkxPX1BURV9UT19QQShuZXdwZGUpICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZm9yIChw dGUgPSBmaXJzdHB0ZSArIE5QVEVQRyAtIDE7IHB0ZSA+IGZpcnN0cHRlOyBwdGUtLSkgeworc2V0 cHRlOgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoVExCTE9fUFRFX1RPX1BBKG9sZHB0ZSkgIT0g cGEpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCQlD VFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkg ICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXB0ZV90ZXN0 KCZvbGRwdGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJaWYg KCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsIG9sZHB0ZSB8IFBURV9STykpCisJCQkJ Z290byBzZXRwdGU7CisJCQlvbGRwdGUgfD0gUFRFX1JPOworCQkJb2xkcHRldmEgPSAodmEgJiB+ UERSTUFTSykgfAorCQkJICAgIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAmIFBEUk1BU0spOwor CQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBwcm90ZWN0IGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAor CQkJICAgIF9fZnVuY19fLCBvbGRwdGV2YSwgcG1hcCk7CisJCX0KKwkJaWYgKChvbGRwdGUgJiBQ R19QUk9NT1RFX01BU0spICE9IChuZXdwZGUgJiBQR19QUk9NT1RFX01BU0spKSB7CisJCQlhdG9t aWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFpbHVyZXMsIDEpOworCQkJQ1RSMyhLVFJfUE1BUCwg IiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCQlyZXR1cm47CisJCX0KKwkJcGEgLT0gUEFHRV9TSVpFOworCX0KKworCS8q CisJICogU2F2ZSB0aGUgcGFnZSB0YWJsZSBwYWdlIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGls IHRoZSBQREUKKwkgKiBtYXBwaW5nIHRoZSBzdXBlcnBhZ2UgaXMgZGVtb3RlZCBieSBwbWFwX2Rl bW90ZV9wZGUoKSBvcgorCSAqIGRlc3Ryb3llZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4KKwkgKi8K KwltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZSkpOworCUtB U1NFUlQobXB0ZSA+PSB2bV9wYWdlX2FycmF5ICYmCisJICAgIG1wdGUgPCAmdm1fcGFnZV9hcnJh eVt2bV9wYWdlX2FycmF5X3NpemVdLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgaXMgb3V0 IG9mIHJhbmdlIiwgX19mdW5jX18pKTsKKwlLQVNTRVJUKG1wdGUtPnBpbmRleCA9PSBwbWFwX3Bk ZV9waW5kZXgodmEpLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UncyBwaW5kZXggaXMgd3Jv bmciLCBfX2Z1bmNfXykpOworCWlmIChwbWFwX2luc2VydF9wdF9wYWdlKHBtYXAsIG1wdGUpKSB7 CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFByb21vdGUgdGhlIHB2 IGVudHJpZXMuCisJICovCisJaWYgKHB0ZV90ZXN0KCZuZXdwZGUsIFBURV9NQU5BR0VEKSkKKwkJ cG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwLCB2YSwgVExCTE9fUFRFX1RPX1BBKG5ld3BkZSksIGxv Y2twKTsKKworCS8qCisJICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICovCisJcG1hcF91cGRhdGVf cGRlKHBtYXAsIHZhLCBwZGUsIG5ld3BkZSB8IFBURV9QU18xTSk7CisKKwlhdG9taWNfYWRkX2xv bmcoJnBtYXBfcGRlX3Byb21vdGlvbnMsIDEpOworCUNUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICBwbWFwKTsKK30K KworLyoKKyAqCUluc2VydCB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFnZSAocCkgYXQKKyAqCXRoZSBz cGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzICh2KSBpbiB0aGUKKyAqCXRhcmdldCBwaHlzaWNhbCBt YXAgd2l0aCB0aGUgcHJvdGVjdGlvbiByZXF1ZXN0ZWQuCisgKgorICoJSWYgc3BlY2lmaWVkLCB0 aGUgcGFnZSB3aWxsIGJlIHdpcmVkIGRvd24sIG1lYW5pbmcKKyAqCXRoYXQgdGhlIHJlbGF0ZWQg cHRlIGNhbiBub3QgYmUgcmVjbGFpbWVkLgorICoKKyAqCU5COiAgVGhpcyBpcyB0aGUgb25seSBy b3V0aW5lIHdoaWNoIE1BWSBOT1QgbGF6eS1ldmFsdWF0ZQorICoJb3IgbG9zZSBpbmZvcm1hdGlv bi4gIFRoYXQgaXMsIHRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5CisgKglpbnNlcnQgdGhpcyBw YWdlIGludG8gdGhlIGdpdmVuIG1hcCBOT1cuCisgKi8KK2ludAorcG1hcF9lbnRlcihwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwKKyAgICB1 X2ludCBmbGFncywgaW50OF90IHBzaW5kIF9fdW51c2VkKQoreworICAgICAgICBzdHJ1Y3Qgcnds b2NrICpsb2NrOworICAgICAgICB2bV9wYWRkcl90IHBhLCBvcGE7CisgICAgICAgIHBkX2VudHJ5 X3QgKnBkZTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworICAgICAgICBwdF9lbnRyeV90IG9y aWdwdGUsIG5ld3B0ZTsKKyAgICAgICAgcHZfZW50cnlfdCBwdjsKKyAgICAgICAgdm1fcGFnZV90 IG1wdGUsIG9tOworICAgICAgICBib29sZWFuX3Qgbm9zbGVlcDsKKworICAgICAgICB2YSA9IHRy dW5jX3BhZ2UodmEpOworICAgICAgICBLQVNTRVJUKHZhIDw9IFZNX01BWF9LRVJORUxfQUREUkVT UywgKCJwbWFwX2VudGVyOiB0b29iaWciKSk7CisgICAgICAgIEtBU1NFUlQoKG0tPm9mbGFncyAm IFZQT19VTk1BTkFHRUQpICE9IDAgfHwgdmEgPCBrbWkuY2xlYW5fc3ZhIHx8CisgICAgICAgICAg ICB2YSA+PSBrbWkuY2xlYW5fZXZhLAorICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtYW5hZ2Vk IG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiKSk7CisgICAgICAgIGlmICgobS0+b2Zs YWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAmJiAhdm1fcGFnZV94YnVzaWVkKG0pKQorICAgICAg ICAgICAgICAgIFZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG0tPm9iamVjdCk7CisKKyAgICAgICAg bXB0ZSA9IE5VTEw7CisKKyAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIHJ3X3Jsb2NrKCZw dmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX0xPQ0socG1hcCk7CisKKyAgICAgICAgLyoK KyAgICAgICAgICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFibGUgcGFnZSBpcyBub3QgcmVz aWRlbnQsIHdlIGFyZQorICAgICAgICAgKiBjcmVhdGluZyBpdCBoZXJlLgorICAgICAgICAgKi8K KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKyAgICAgICAgICAgICAgICAvKgorICAg ICAgICAgICAgICAgICAqIEhlcmUgaWYgdGhlIHB0ZSBwYWdlIGlzbid0IG1hcHBlZCwgb3IgaWYg aXQgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgKiBkZWFsbG9jYXRlZC4KKyAgICAgICAgICAg ICAgICAgKi8KKyAgICAgICAgICAgICAgICBub3NsZWVwID0gKGZsYWdzICYgUE1BUF9FTlRFUl9O T1NMRUVQKSAhPSAwOworICAgICAgICAgICAgICAgIG1wdGUgPSBwbWFwX2FsbG9jcHRlKHBtYXAs IHZhLCBub3NsZWVwID8gTlVMTCA6ICZsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobXB0ZSA9 PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG5vc2xlZXAgIT0gMCwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBtYXBfYWxsb2NwdGUgZmFpbGVkIHdpdGgg c2xlZXAgYWxsb3dlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrICE9IE5V TEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7Cisg ICAgICAgICAgICAgICAgICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAg ICAgICAgICAgICAgICAgICAgICAgUE1BUF9VTkxPQ0socG1hcCk7CisgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gKEtFUk5fUkVTT1VSQ0VfU0hPUlRBR0UpOworICAgICAgICAgICAgICAg IH0KKyAgICAgICAgfQorCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKSB7CisJCXBhbmljKCIlczogYXR0ZW1wdGVkIHBtYXBfZW50ZXIgb24g c3VwZXJwYWdlIiwgX19mdW5jX18pOworCX0KKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2 YSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFBhZ2UgRGlyZWN0b3J5IHRhYmxlIGVudHJ5 IG5vdCB2YWxpZCwgd2UgbmVlZCBhIG5ldyBQVCBwYWdlCisgICAgICAgICAqLworICAgICAgICBp ZiAocHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygicG1hcF9lbnRlcjogaW52 YWxpZCBwYWdlIGRpcmVjdG9yeSwgcGRpcj0lcCwgdmE9JXAiLAorICAgICAgICAgICAgICAgICAg ICAodm9pZCAqKXBtYXAtPnBtX3NlZ3RhYiwgKHZvaWQgKil2YSk7CisgICAgICAgIH0KKworICAg ICAgICBwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKyAgICAgICAgb20gPSBOVUxMOworICAgICAg ICBvcmlncHRlID0gKnB0ZTsKKwlvcGEgPSBUTEJMT19QVEVfVE9fUEEob3JpZ3B0ZSk7CisKKyAg ICAgICAgbmV3cHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGluaXRfcHRlX3Byb3QobSwgZmxh Z3MsIHByb3QpOworICAgICAgICAvKgorICAgICAgICAgKiBwbWFwX2VudGVyKCkgaXMgY2FsbGVk IGR1cmluZyBhIGZhdWx0IG9yIHNpbXVsYXRlZCBmYXVsdCBzbworICAgICAgICAgKiBzZXQgdGhl IHJlZmVyZW5jZSBiaXQgbm93IHRvIGF2b2lkIGEgZmF1bHQuCisgICAgICAgICAqLworICAgICAg ICBwdGVfcmVmX3NldCgmbmV3cHRlKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf V0lSRUQpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9XOworICAgICAgICBp ZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9H OworICAgICAgICBpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKyAgICAgICAgICAgICAgICBp ZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAg ICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworICAgICAgICAgICAgICAg IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKyAg ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor I2lmZGVmIENQVV9DSEVSSQorICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9OT0xPQURU QUdTKSAhPSAwKQorICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfTEM7CisgICAgICAgIGlm ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU1RPUkVUQUdTKSAhPSAwKQorICAgICAgICAgICAgICAg IG5ld3B0ZSB8PSBQVEVfU0M7CisjZW5kaWYKKworCS8qCisJICogU2V0IG1vZGlmaWVkIGJpdCBn cmF0dWl0b3VzbHkgZm9yIHdyaXRlYWJsZSBtYXBwaW5ncyBpZgorCSAqIHRoZSBwYWdlIGlzIHVu bWFuYWdlZC4gV2UgZG8gbm90IHdhbnQgdG8gdGFrZSBhIGZhdWx0CisJICogdG8gZG8gdGhlIGRp cnR5IGJpdCBlbXVsYXRpb24gZm9yIHRoZXNlIG1hcHBpbmdzLgorCSAqLworCWlmICgobS0+b2Zs YWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkgeworCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBU RV9STykpCisJCQluZXdwdGUgfD0gUFRFX0Q7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAq IE1hcHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNo YW5nZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGVfaXNfdmFsaWQoJm9yaWdwdGUpICYm IG9wYSA9PSBwYSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2ly aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CisgICAg ICAgICAgICAgICAgICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lkZW50IGFz IGxvbmcgYXMgdGhlcmUKKyAgICAgICAgICAgICAgICAgKiBhcmUgdmFsaWQgbWFwcGluZ3MgaW4g dGhlbS4gSGVuY2UsIGlmIGEgdXNlciBwYWdlIGlzCisgICAgICAgICAgICAgICAgICogd2lyZWQs IHRoZSBQVCBwYWdlIHdpbGwgYmUgYWxzby4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgICAgICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpICYmICFwdGVfdGVzdCgmb3JpZ3B0 ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRf Y291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRF X1cpICYmIHB0ZV90ZXN0KCZvcmlncHRlLAorICAgICAgICAgICAgICAgICAgICBQVEVfVykpCisg ICAgICAgICAgICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudC0tOworCisg ICAgICAgICAgICAgICAgS0FTU0VSVCghcHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EIHwgUFRFX1JP KSwKKyAgICAgICAgICAgICAgICAgICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6 IHZhOiAlcCwgcHRlOiAlI2p4IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICh2b2lk ICopdmEsICh1aW50bWF4X3Qpb3JpZ3B0ZSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAg ICAgICAgICAgICAgKiBSZW1vdmUgdGhlIGV4dHJhIFBUIHBhZ2UgcmVmZXJlbmNlCisgICAgICAg ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG1wdGUgIT0gTlVMTCkgeworICAgICAg ICAgICAgICAgICAgICAgICAgbXB0ZS0+d2lyZV9jb3VudC0tOworICAgICAgICAgICAgICAgICAg ICAgICAgS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID4gMCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoInBtYXBfZW50ZXI6IG1pc3NpbmcgcmVmZXJlbmNlIHRvIHBhZ2UgdGFibGUgcGFn ZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmE6IDB4JWx4IiwgdmEpKTsKKyAg ICAgICAgICAgICAgICB9CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7 CisJCQlvbSA9IG07CisJCQluZXdwdGUgfD0gUFRFX01BTkFHRUQ7CisJCQlpZiAoIXB0ZV90ZXN0 KCZuZXdwdGUsIFBURV9STykpCisJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1dSSVRFQUJM RSk7CisJCX0KKwkJZ290byB2YWxpZGF0ZTsKKwl9CisKKwlwdiA9IE5VTEw7CisKKyAgICAgICAg LyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgY2hhbmdlZCwgaW52YWxpZGF0ZSBvbGQgcmFuZ2Ug YW5kIGZhbGwgdGhyb3VnaCB0bworICAgICAgICAgKiBoYW5kbGUgdmFsaWRhdGluZyBuZXcgbWFw cGluZy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChvcGEpIHsKKyAgICAgICAgICAgICAgICBp ZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBt YXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBpZiAocHRlX3Rl c3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb20g PSBQSFlTX1RPX1ZNX1BBR0Uob3BhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HRV9Q Vl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgb20pOworICAgICAgICAgICAgICAgICAgICAg ICAgcHYgPSBwbWFwX3B2aF9yZW1vdmUoJm9tLT5tZCwgcG1hcCwgdmEpOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAg ICAgICAgICAgICBtcHRlLT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBL QVNTRVJUKG1wdGUtPndpcmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgicG1hcF9lbnRlcjogbWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZhOiAlcCIsICh2b2lkICopdmEpKTsKKyAgICAg ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHBtYXBfcmVzaWRl bnRfY291bnRfaW5jKHBtYXAsIDEpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEVudGVyIG9u IHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFnZWQgbWVtb3J5LgorICAgICAgICAgKi8K KyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisgICAgICAg ICAgICAgICAgbmV3cHRlIHw9IFBURV9NQU5BR0VEOworCQkvKiBJbnNlcnQgRW50cnkgKi8KKwkJ aWYgKHB2ID09IE5VTEwpCisJCQlwdiA9IGdldF9wdl9lbnRyeShwbWFwLCAmbG9jayk7CisgICAg ICAgICAgICAgICAgcHYtPnB2X3ZhID0gdmE7CisgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJ U1RfTE9DS19UT19QSFlTKCZsb2NrLCBwYSk7CisgICAgICAgICAgICAgICAgVEFJTFFfSU5TRVJU X1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKyAgICAgICAgICAgICAgICBtLT5t ZC5wdl9nZW4rKzsKKyAgICAgICAgICAgICAgICBpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9S TykpCisgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJ VEVBQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwdiAhPSBOVUxMKQorCQlmcmVlX3B2X2VudHJ5 KHBtYXAsIHB2KTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEluY3JlbWVudCBjb3VudGVy cworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHB0ZV90ZXN0KCZuZXdwdGUsIFBURV9XKSkKKyAg ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworCit2YWxpZGF0ZToK KyNpZmRlZiBQTUFQX0RFQlVHCisgICAgICAgIHByaW50ZigicG1hcF9lbnRlcjogIHZhOiAlcCAt PiBwYTogJXBcbiIsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisgICAgICAgIC8q CisgICAgICAgICAqIGlmIHRoZSBtYXBwaW5nIG9yIHBlcm1pc3Npb24gYml0cyBhcmUgZGlmZmVy ZW50LCB3ZSBuZWVkIHRvCisgICAgICAgICAqIHVwZGF0ZSB0aGUgcHRlLgorICAgICAgICAgKi8K KyAgICAgICAgaWYgKChvcmlncHRlICYgfiAoUFRFX0R8UFRFX1JFRikpICE9IG5ld3B0ZSkgewor ICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfVlI7CisgICAgICAgICAgICAgICAgaWYgKChm bGFncyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdw dGUgfD0gUFRFX0Q7CisgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkp IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBpbnZsdmEgPSBGQUxTRTsKKwor CQkJb3JpZ3B0ZSA9IHB0ZV9sb2FkX3N0b3JlKHB0ZSwgbmV3cHRlKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIGlmIChwdGVfaXNfcmVmKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChvbSwg UEdBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bh ICE9IHBhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmx2YSA9 IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg ICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdCgmb3Jp Z3B0ZSwgUFRFX1JPKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRl X3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2bV9wYWdlX2RpcnR5KG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZsdmEgPSBUUlVFOworICAgICAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV90ZXN0KCZvcmlncHRl LCBQVEVfTUFOQUdFRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUlMUV9FTVBU WSgmb20tPm1kLnB2X2xpc3QpICYmCisJCQkgICAgKChvbS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSAhPSAwIHx8CisJCQkgICAgVEFJTFFfRU1QVFkoJnBhX3RvX3B2aChvcGEpLT5wdl9saXN0KSkp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIob20s IFBHQV9XUklURUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludmx2YSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwg dmEpOworICAgICAgICAgICAgICAgIH0gZWxzZQorCQkJcHRlX3N0b3JlKHB0ZSwgbmV3cHRlKTsK KyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBJZiBib3RoIHRoZSBwYWdlIHRh YmxlIHBhZ2UgYW5kIHRoZSByZXNlcnZhdGlvbiBhcmUgZnVsbHkKKyAgICAgICAgICogIHBvcHVs YXRlZCwgdGhlbiBhdHRlbXB0IHByb21vdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgo bXB0ZSA9PSBOVUxMIHx8IG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHKSAmJgorICAgICAgICAg ICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorICAgICAgICAgICAgcGdfc3Bf ZW5hYmxlZCAmJiB2bV9yZXNlcnZfbGV2ZWxfaWZmdWxscG9wKG0pID09IDApCisgICAgICAgICAg ICAgICAgcG1hcF9wcm9tb3RlX3BkZShwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisKKyAgICAgICAg LyoKKyAgICAgICAgICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUgcGFnZXMuICBE byB0aGlzIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhl IGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKyAgICAgICAgICogdW5yZXNvbHZhYmxl IFRMQiBtaXNzIG1heSBvY2N1ci4KKyAgICAgICAgICovCisgICAgICAgIGlmICghaXNfa2VybmVs X3BtYXAocG1hcCkgJiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYK KyAgICAgICAgICAgIChwcm90ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworICAgICAgICAgICAgICAg IG1pcHNfaWNhY2hlX3N5bmNfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgICAgICAgICAg bWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgIH0KKyAgICAg ICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByd193dW5sb2NrKGxvY2spOwor ICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX1VOTE9D SyhwbWFwKTsKKyAgICAgICAgcmV0dXJuIChLRVJOX1NVQ0NFU1MpOworfQorCisvKgorICogdGhp cyBjb2RlIG1ha2VzIHNvbWUgKk1BSk9SKiBhc3N1bXB0aW9uczoKKyAqIDEuIEN1cnJlbnQgcG1h cCAmIHBtYXAgZXhpc3RzLgorICogMi4gTm90IHdpcmVkLgorICogMy4gUmVhZCBhY2Nlc3MuCisg KiA0LiBObyBwYWdlIHRhYmxlIHBhZ2VzLgorICogYnV0IGlzICpNVUNIKiBmYXN0ZXIgdGhhbiBw bWFwX2VudGVyLi4uCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfcXVpY2socG1hcF90IHBtYXAsIHZt X29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3 bG9jayAqbG9jazsKKworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp OworCVBNQVBfTE9DSyhwbWFwKTsKKwkodm9pZClwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw LCB2YSwgbSwgcHJvdCwgTlVMTCwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1 bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9D SyhwbWFwKTsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9lbnRlcl9xdWlja19sb2NrZWQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3Qg cHJvdCwgdm1fcGFnZV90IG1wdGUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRy eV90ICpwdGUsIG5ld3B0ZTsKKwl2bV9wYWRkcl90IHBhOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7 CisKKwlLQVNTRVJUKHZhIDwga21pLmNsZWFuX3N2YSB8fCB2YSA+PSBrbWkuY2xlYW5fZXZhIHx8 CisJICAgIChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwLAorCSAgICAoIiVzOiBtYW5h Z2VkIG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiLCBfX2Z1bmNfXykpOworCXJ3X2Fz c2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1h cCwgTUFfT1dORUQpOworCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IGEgcGFnZSB0YWJsZSBw YWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisJICogY3JlYXRpbmcgaXQgaGVyZS4KKwkgKi8K KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlOworCQl1 bnNpZ25lZCBwdGVwaW5kZXg7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdl IGluZGV4CisJCSAqLworCQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQlpZiAo bXB0ZSAmJiAobXB0ZS0+cGluZGV4ID09IHB0ZXBpbmRleCkpIHsKKwkJCW1wdGUtPndpcmVfY291 bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHBhZ2UgZGlyZWN0b3J5IGVu dHJ5CisJCQkgKi8KKwkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCQkJLyoKKwkJCSAq IElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0CisJCQkgKiBpbmNyZW1l bnQgdGhlIGhvbGQgY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkJCSAqLworCQkJaWYgKHBkZSAm JiAqcGRlICE9IDApIHsKKwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQly ZXR1cm4gKE5VTEwpOworCQkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJICAgIE1JUFNf RElSRUNUX1RPX1BIWVMoKnBkZSkpOworCQkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJCX0gZWxz ZSB7CisJCQkJLyoKKwkJCQkgKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgUFYgbGlzdCBsb2Nr CisJCQkJICogcG9pbnRlciwgYmVjYXVzZSB3ZSBkb24ndCBpbnRlbmQgdG8gc2xlZXAuCisJCQkJ ICovCisJCQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRleCwgTlVMTCk7CisJ CQkJaWYgKG1wdGUgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIChtcHRlKTsKKwkJCX0KKwkJfQorCX0g ZWxzZSB7CisJCW1wdGUgPSBOVUxMOworCX0KKworCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsK KwlpZiAocHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJbXB0 ZS0+d2lyZV9jb3VudC0tOworCQkJbXB0ZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIChtcHRlKTsK Kwl9CisKKwkvKgorCSAqIEVudGVyIG9uIHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFn ZWQgbWVtb3J5LgorCSAqLworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAm JgorCSAgICAhcG1hcF90cnlfaW5zZXJ0X3B2X2VudHJ5KHBtYXAsIHZhLCBtLCBsb2NrcCkpIHsK KwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlpZiAocG1h cF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcHRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2ludmFsaWRh dGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworCQkJ fQorCisJCQltcHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJ ICogSW5jcmVtZW50IGNvdW50ZXJzCisJICovCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1h cCwgMSk7CisKKwlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCS8qCisJICogTm93IHZhbGlk YXRlIG1hcHBpbmcgd2l0aCBSTyBwcm90ZWN0aW9uCisJICovCisJbmV3cHRlID0gUFRFX1JPIHwg VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJRDsKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19V Tk1BTkFHRUQpID09IDApCisJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKKworCWlmIChpc19jYWNo ZWFibGVfbWVtKHBhKSkgeworCQlpZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VO Q0FDSEVBQkxFKQorCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCQllbHNlCisJCQluZXdw dGUgfD0gUFRFX0NfQ0FDSEU7CisJfSBlbHNlCisJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsK KworCXNjaGVkX3BpbigpOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQluZXdwdGUg fD0gUFRFX0c7CisJCXB0ZV9yZWZfc2V0KCZuZXdwdGUpOworCQlwdGVfc3RvcmUocHRlLCBuZXdw dGUpOworCX0gZWxzZSB7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJCS8qCisJCSAqIFN5 bmMgSSAmIEQgY2FjaGVzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBi ZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVz b2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJCSAqLworCQlpZiAocG1hcCA9PSAmY3VycHJv Yy0+cF92bXNwYWNlLT52bV9wbWFwKSB7CisJCQl2YSAmPSB+UEFHRV9NQVNLOworCQkJbWlwc19p Y2FjaGVfc3luY19yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh bmdlKHZhLCBQQUdFX1NJWkUpOworCQl9CisJfQorCXNjaGVkX3VucGluKCk7CisKKwlyZXR1cm4g KG1wdGUpOworfQorCisvKgorICogTWFrZSBhIHRlbXBvcmFyeSBtYXBwaW5nIGZvciBhIHBoeXNp Y2FsIGFkZHJlc3MuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKKyAqIHRvIGJlIHVzZWQgZm9yIHBh bmljIGR1bXBzLgorICoKKyAqIFVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitw bWFwX2tlbnRlcl90ZW1wb3Jhcnkodm1fcGFkZHJfdCBwYSwgaW50IGkpCit7CisKKwlpZiAoaSAh PSAwKQorCQlwcmludGYoIiVzOiBFUlJPUiEhISBNb3JlIHRoYW4gb25lIHBhZ2Ugb2YgdmlydHVh bCBhZGRyZXNzICIKKwkJICAgICJtYXBwaW5nIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsK KworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKSk7Cit9CisKK3ZvaWQK K3BtYXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7CisKKwkvKiBub3Ro aW5nIHRvIGRvIGZvciBtaXBzNjQgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2bV9wYWdlX3QK K3BtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgcndsb2Nr ICoqbG9ja3ApCit7CisJdm1fcGluZGV4X3QgcGRwaW5kZXgsIHB0ZXBpbmRleDsKKwlwZF9lbnRy eV90ICpwZHBlOworCXZtX3BhZ2VfdCBtcHRlID0gTlVMTDsKKworCWlmICh2YSA8IFZNX01BWFVT RVJfQUREUkVTUykgeworcmV0cnk6CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJ CWlmIChwZHBlICE9IE5VTEwgJiYgKCpwZHBlICE9IE5VTEwpKSB7CisJCQkvKiBBZGQgYSByZWZl cmVuY2UgdG8gdGhlIHBkIHBhZ2UuICovCisJCQltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNf RElSRUNUX1RPX1BIWVMoKnBkcGUpKTsKKwkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJfSBlbHNl IHsKKwkJCS8qIEFsbG9jYXRlIGEgcGQgcGFnZS4gKi8KKworCQkJLyogQ2FsY3VsYXRlIHBhZ2V0 YWJsZSBwYWdlIGluZGV4LiAqLworCQkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsK KwkJCXBkcGluZGV4ID0gcHRlcGluZGV4ID4+IE5QREVQR1NISUZUOyAgLyogWFhYICovCisJCQlt cHRlID0gX3BtYXBfYWxsb2NwdGUocG1hcCwgTlVQREUgKyBwZHBpbmRleCwgbG9ja3ApOworCQkJ aWYgKG1wdGUgPT0gTlVMTCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7CisJCX0K Kwl9CisJcmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIFRyaWVzIHRvIGNyZWF0ZSBhIDJNQiBw YWdlIG1hcHBpbmcuICBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCBhbmQgRkFMU0UKKyAqIG90 aGVyd2lzZS4gIEZhaWxzIGlmICgxKSBhIHBhZ2UgdGFibGUgcGFnZSBjYW5ub3QgYmUgYWxsb2Nh dGVkIHdpdGhvdXQKKyAqIGJsb2NraW5nLCAoMikgYSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGF0 IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzLCBvcgorICogKDMpIGEgcHYgZW50cnkgY2Fu bm90IGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlY2xhaW1pbmcgYW5vdGhlciBwdiBlbnRyeS4KKyAq Lworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QsCisgICAgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG5ld3BkZTsKKwl2bV9w YWdlX3QgbXBkZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZGRyX3QgcGE7CisKKwor CXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NF UlQocG1hcCwgTUFfT1dORUQpOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8q IE5vdCBkb2luZyB0aGUga2VybmVsIHBtYXAgZm9yIG5vdyAqLworCQlDVFIzKEtUUl9QTUFQLCAi JXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcDoga2VybmVsIG1hcCIsCisJCSAgICBf X2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJaWYgKChtcGRlID0g cG1hcF9hbGxvY3BkZShwbWFwLCB2YSwgTlVMTCkpID09IE5VTEwpIHsKKwkJQ1RSMyhLVFJfUE1B UCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18s IHZhLCBwbWFwKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCS8qIHBkZSA9IHBtYXBfcGRlKHBt YXAsIHZhKTsgKi8KKwlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1f UEFHRV9UT19QSFlTKG1wZGUpKTsKKwlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KHZhKV07CisJ aWYgKHBkZSA9PSBOVUxMKSB7CisJCUtBU1NFUlQobXBkZS0+d2lyZV9jb3VudCA+IDEsCisJCSAg ICAoIiVzOiBtcGRlJ3Mgd2lyZSBjb3VudCBpcyB0b28gbG93IiwgX19mdW5jX18pKTsKKwkJbXBk ZS0+d2lyZV9jb3VudC0tOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj bHggaW4gcG1hcCAlcCIsIF9fZnVuY19fLAorCQkgICAgdmEsIHBtYXApOworCQlyZXR1cm4gKEZB TFNFKTsKKwl9CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisgICAgICAgIG5ld3BkZSA9IFBU RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQgfCBQVEVfUFNfMU07CisJaWYg KGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F TUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UK KwkJCW5ld3BkZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UKKwkJbmV3cGRlIHw9IFBURV9DX1VO Q0FDSEVEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkgeworCQluZXdw ZGUgfD0gUFRFX01BTkFHRUQ7CisKKwkJLyoKKwkJICogQWJvcnQgdGhpcyBtYXBwaW5nIGlmIGl0 cyBQViBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KKwkJICovCisJCWlmICghcG1hcF9wdl9p bnNlcnRfcGRlKHBtYXAsIHZhLCBWTV9QQUdFX1RPX1BIWVMobSksCisJCSAgICBsb2NrcCkpIHsK KwkJCVNMSVNUX0lOSVQoJmZyZWUpOworCQkJaWYgKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg bXBkZSwgJmZyZWUpKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworCQkJ CXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwkJCX0KKwkJCUNUUjMoS1RSX1BNQVAsICIl czogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEs IHBtYXApOworCQkJcmV0dXJuIChGQUxTRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEluY3JlbWVu dCBjb3VudGVycy4KKwkgKi8KKwkgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIg LyBQQUdFX1NJWkUpOworCisJIC8qCisJICAqIE1hcCB0aGUgc3VwZXJwYWdlLgorCSAgKi8KKwkg c2NoZWRfcGluKCk7CisJIHBkZV9zdG9yZShwZGUsIG5ld3BkZSk7CisKKwkvKgorCSAqIFN5bmMg SSAmIEQgY2FjaGVzIGZvciBleGVjdXRhYmxlIHBhZ2VzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZQor CSAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lz ZSwgYW4KKwkgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorCSAqLworCSBpZiAo IWlzX2tlcm5lbF9wbWFwKHBtYXApICYmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZt X3BtYXApICYmCisJICAgICAocHJvdCAmIFZNX1BST1RfRVhFQ1VURSkpIHsKKwkJCSB2YSAmPSB+ UERSTUFTSzsKKwkJCSBtaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBOQlBEUik7CisJCQkgbWlw c19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIE5CUERSKTsKKworCSB9CisJIHNjaGVkX3VucGluKCk7 CisKKwkgYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9tYXBwaW5ncywgMSk7CisJIENUUjMoS1RS X1BNQVAsICIlczogc3VjY2VzcyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZh LAorCSAgICAgcG1hcCk7CisJIHJldHVybiAoVFJVRSk7Cit9CisKKy8qCisgKiBNYXBzIGEgc2Vx dWVuY2Ugb2YgcmVzaWRlbnQgcGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAq IFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0YXJ0LiAgVGhpcyBw YWdlIGlzCisgKiBtYXBwZWQgYXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzdGFydC4gIEVh Y2ggc3Vic2VxdWVudCBwYWdlIGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhh dCBpcyBvZmZzZXQgZnJvbSBzdGFydCBieSB0aGUgc2FtZQorICogYW1vdW50IGFzIHRoZSBwYWdl IGlzIG9mZnNldCBmcm9tIG1fc3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBUaGUKKyAqIGxhc3Qg cGFnZSBpbiB0aGUgc2VxdWVuY2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFyZ2VzdCBvZmZzZXQg ZnJvbQorICogbV9zdGFydCB0aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3Mg bGVzcyB0aGFuIHRoZSBnaXZlbgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4gIE5vdCBldmVyeSB2 aXJ0dWFsIHBhZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBwZWQ7IG9ubHkgdGhv c2UgZm9yIHdoaWNoIGEgcmVzaWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUKKyAqIGNvcnJlc3Bv bmRpbmcgb2Zmc2V0IGZyb20gbV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2b2lkCitwbWFwX2Vu dGVyX29iamVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZtX29mZnNldF90IGVu ZCwKKyAgICB2bV9wYWdlX3QgbV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3 bG9jayAqbG9jazsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWdlX3QgbSwgbXB0ZTsKKwl2bV9w aW5kZXhfdCBkaWZmLCBwc2l6ZTsKKworCVZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG1fc3RhcnQt Pm9iamVjdCk7CisKKwlwc2l6ZSA9IGF0b3AoZW5kIC0gc3RhcnQpOworCW1wdGUgPSBOVUxMOwor CW0gPSBtX3N0YXJ0OworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp OworCVBNQVBfTE9DSyhwbWFwKTsKKwl3aGlsZSAobSAhPSBOVUxMICYmIChkaWZmID0gbS0+cGlu ZGV4IC0gbV9zdGFydC0+cGluZGV4KSA8IHBzaXplKSB7CisJCXZhID0gc3RhcnQgKyBwdG9hKGRp ZmYpOworCQlpZiAoKHZhICYgUERSTUFTSykgPT0gMCAmJiB2YSArIE5CUERSIDw9IGVuZCAmJgor CQkgICAgbS0+cHNpbmQgPT0gMSAmJiBwZ19zcF9lbmFibGVkICYmCisJCSAgICBwbWFwX2VudGVy X3BkZShwbWFwLCB2YSwgbSwgcHJvdCwgJmxvY2spKQorCQkJbSA9ICZtW05CUERSIC8gUEFHRV9T SVpFIC0gMV07CisJCWVsc2UKKwkJCW1wdGUgPSBwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw LCB2YSwgbSwgcHJvdCwKKwkJCSAgICBtcHRlLCAmbG9jayk7CisJCW0gPSBUQUlMUV9ORVhUKG0s IGxpc3RxKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwly d19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisv KgorICogcG1hcF9vYmplY3RfaW5pdF9wdCBwcmVsb2FkcyB0aGUgcHRlcyBmb3IgYSBnaXZlbiBv YmplY3QKKyAqIGludG8gdGhlIHNwZWNpZmllZCBwbWFwLiAgVGhpcyBlbGltaW5hdGVzIHRoZSBi bGFzdCBvZiBzb2Z0CisgKiBmYXVsdHMgb24gcHJvY2VzcyBzdGFydHVwIGFuZCBpbW1lZGlhdGVs eSBhZnRlciBhIG1tYXAoKS4KKyAqCisgKiBUaGlzIGNvZGUgbWFwcyBsYXJnZSBwaHlzaWNhbCBt bWFwIHJlZ2lvbnMgaW50byB0aGUKKyAqIHByb2Nlc3NvciBhZGRyZXNzIHNwYWNlLiBOb3RlIHRo YXQgc29tZSBzaG9ydGN1dHMKKyAqIGFyZSB0YWtlbiwgYnV0IHRoZSBjb2RlIHdvcmtzLgorICov Cit2b2lkCitwbWFwX29iamVjdF9pbml0X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRy LCB2bV9vYmplY3RfdCBvYmplY3QsCisgICAgdm1fcGluZGV4X3QgcGluZGV4LCB2bV9zaXplX3Qg c2l6ZSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1fcGFkZHJfdCBwYSwgcHRlcGE7CisJdm1f cGFnZV90IHAsIHBkcGc7CisJdm1fbWVtYXR0cl90IG1lbWF0dHI7CisKKwlWTV9PQkpFQ1RfQVNT RVJUX1dMT0NLRUQob2JqZWN0KTsKKwlLQVNTRVJUKG9iamVjdC0+dHlwZSA9PSBPQkpUX0RFVklD RSB8fCBvYmplY3QtPnR5cGUgPT0gT0JKVF9TRywKKwkgICAgKCJwbWFwX29iamVjdF9pbml0X3B0 OiBub24tZGV2aWNlIG9iamVjdCIpKTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgewor CQkvKiBOb3QgZG9pbmcgdGhlIGtlcm5lbCBwbWFwIGZvciBub3cuICovCisJCXJldHVybjsKKwl9 CisKKwlpZiAoKGFkZHIgJiAoTkJQRFIgLSAxKSkgPT0gMCAmJiAoc2l6ZSAmIChOQlBEUiAtIDEp KSA9PSAwKSB7CisJCWlmICghcGdfc3BfZW5hYmxlZCkKKwkJCXJldHVybjsKKwkJaWYgKCF2bV9v YmplY3RfcG9wdWxhdGUob2JqZWN0LCBwaW5kZXgsIHBpbmRleCArIGF0b3Aoc2l6ZSkpKQorCQkJ cmV0dXJuOworCQlwID0gdm1fcGFnZV9sb29rdXAob2JqZWN0LCBwaW5kZXgpOworCQlLQVNTRVJU KHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2Ug JXAiLCBfX2Z1bmNfXywgcCkpOworCQltZW1hdHRyID0gcC0+bWQucHZfbWVtYXR0cjsKKworCQkv KgorCQkgKiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgZmlyc3QgcGFnZSBpcyBub3QgcGh5c2lj YWxseQorCQkgKiBhbGlnbmVkIHRvIGEgMk1CIHBhZ2UgYm91bmRhcnkuCisJCSAqLworCQlwdGVw YSA9IFZNX1BBR0VfVE9fUEhZUyhwKTsKKwkJaWYgKHB0ZXBhICYgKE5CUERSIC0gMSkpCisJCQly ZXR1cm47CisKKwkJLyoKKwkJICogU2tpcCB0aGUgZmlyc3QgcGFnZS4gQWJvcnQgdGhlIG1hcHBp bmcgaWYgdGhlIHJlc3Qgb2YKKwkJICogdGhlIHBhZ2VzIGFyZSBub3QgcGh5c2ljYWxseSBjb250 aWd1b3VzIG9yIGhhdmUgZGlmZmVyaW5nCisJCSAqIG1lbW9yeSBhdHRyaWJ1dGVzLgorCQkgKi8K KwkJcCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQlmb3IgKHBhID0gcHRlcGEgKyBQQUdFX1NJ WkU7IHBhIDwgcHRlcGEgKyBzaXplOworCQkgICAgcGEgKz0gUEFHRV9TSVpFKSB7CisJCQlLQVNT RVJUKHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCQkgICAgKCIlczogaW52YWxpZCBw YWdlICVwIiwgX19mdW5jX18sIHApKTsKKwkJCWlmIChwYSAhPSBWTV9QQUdFX1RPX1BIWVMocCkg fHwKKwkJCSAgICBtZW1hdHRyICE9IHAtPm1kLnB2X21lbWF0dHIpCisJCQkJcmV0dXJuOworCQkJ cCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQl9CisKKwkJLyoKKwkJICogTWFwIHVzaW5nIDJN QiBwYWdlcy4gICJwdGVwYSIgaXMgMk0gYWxpZ25lZCBhbmQgInNpemUiCisJCSAqIGlzIGEgbXVs dGlwbGUgb2YgMk0uCisJCSAqLworCQlQTUFQX0xPQ0socG1hcCk7CisJCWZvciAocGEgPSBwdGVw YTsgcGEgPCBwdGVwYSArIHNpemU7IHBhICs9IE5CUERSKSB7CisJCQlwZHBnID0gcG1hcF9hbGxv Y3BkZShwbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChwZHBnID09IE5VTEwpIHsKKwkJCQkvKgor CQkJCSAqIFRoZSBjcmVhdGlvbiBvZiBtYXBwaW5ncyBiZWxvdyBpcyBvbmx5IGFuCisJCQkJICog b3B0aW1pemF0aW9uLiAgSWYgYSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJCQkJICogY2Fubm90IGJl IGFsbG9jYXRlZCB3aXRob3V0IGJsb2NraW5nLAorCQkJCSAqIGNvbnRpbnVlIG9uIHRvIHRoZSBu ZXh0IG1hcHBpbmcgcmF0aGVyIHRoYW4KKwkJCQkgKiBibG9ja2luZy4KKwkJCQkgKi8KKwkJCQlh ZGRyICs9IE5CUERSOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGRlID0gKHBkX2VudHJ5X3Qg KilNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhwZHBnKSk7CisJ CQlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KGFkZHIpXTsKKwkJCWlmICghcHRlX2lzX3ZhbGlk KChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJCXB0X2VudHJ5X3QgbmV3cHRlID0gVExCTE9fUEFf VE9fUEZOKHBhKSB8CisJCQkJICAgIFBURV9QU18xTSB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9W QUxJRDsKKworCQkJCWlmIChpc19jYWNoZWFibGVfbWVtKHBhKSkgeworCQkJCQlpZiAocGRwZy0+ bWQucHZfbWVtYXR0ciA9PQorCQkJCQkgICAgVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCQkJ CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJCQkJZWxzZQorCQkJCQkJbmV3cHRlIHw9IFBU RV9DX0NBQ0hFOworCQkJCX0gZWxzZQorCQkJCQluZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisK KwkJCQlwZGVfc3RvcmUocGRlLCBuZXdwdGUpOworCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5j KHBtYXAsIE5CUERSL1BBR0VfU0laRSk7CisJCQkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9t YXBwaW5ncywgMSk7CisJCQl9IGVsc2UgeworCQkJCS8qIENvbnRpbnVlIG9uIGlmIHRoZSBQREUg aXMgYWxyZWFkeSB2YWxpZC4gKi8KKwkJCQlwZHBnLT53aXJlX2NvdW50LS07CisJCQkJS0FTU0VS VChwZHBnLT53aXJlX2NvdW50ID4gMCwKKwkJCQkgICAgKCIlczogbWlzc2luZyByZWZlcmVuY2Ug dG8gcGFnZSBkaXJlY3RvcnkgIgorCQkJCSAgICAicGFnZSwgdmE6IDB4JWx4IiwgX19mdW5jX18s IGFkZHIpKTsKKwkJCX0KKwkJCWFkZHIgKz0gTkJQRFI7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1h cCk7CisJfQorfQorCisvKgorICoJQ2xlYXIgdGhlIHdpcmVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBt YXBwaW5ncyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZSBvZgorICoJYWRkcmVzc2VzIGluIHRoZSBn aXZlbiBwbWFwLiAgRXZlcnkgdmFsaWQgbWFwcGluZyB3aXRoaW4gdGhhdCByYW5nZQorICoJbXVz dCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LiAgSW4gY29udHJhc3QsIGludmFsaWQgbWFw cGluZ3MKKyAqCWNhbm5vdCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LCBzbyB0aGV5IGFy ZSBpZ25vcmVkLgorICoKKyAqCVRoZSB3aXJlZCBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgdGFibGUg ZW50cnkgaXMgbm90IGEgaGFyZHdhcmUgZmVhdHVyZSwKKyAqCXNvIHRoZXJlIGlzIG5vIG5lZWQg dG8gaW52YWxpZGF0ZSBhbnkgVExCIGVudHJpZXMuCisgKi8KK3ZvaWQKK3BtYXBfdW53aXJlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkKK3sKKwlwZF9lbnRy eV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0 OworCWJvb2xlYW5fdCBwdl9saXN0c19sb2NrZWQ7CisKKwlwdl9saXN0c19sb2NrZWQgPSBGQUxT RTsKK3Jlc3VtZToKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8IGV2YTsgc3ZhID0g dmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBl ID09IE5VTEwpIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlp ZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7CisJCX0K KwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBz dmEpCisJCQl2YV9uZXh0ID0gZXZhOworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2 YSk7CisJCWlmICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHBkZV9pc18xbV9z dXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9XKSkKKwkJCQlwYW5p YygicG1hcF91bndpcmU6IHBkZSAlI2p4IGlzIG1pc3NpbmcgUFRFX1ciLAorCQkJCSAgICAodWlu dG1heF90KSpwZGUpOworCQkJLyoKKwkJCSAqIEFyZSB3ZSB1bndpcmluZyB0aGUgZW50aXJlIHN1 cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRocm91 Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2YV9u ZXh0KSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKTsK KwkJCQlwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKwkJ CQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJ CQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQkJaWYgKCFyd190cnlfcmxvY2soJnB2aF9n bG9iYWxfbG9jaykpIHsKKwkJCQkJCSBQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCSByd19ybG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJCSAvKiBSZXBlYXQgc3ZhLiAqLworCQkJCQkJIGdv dG8gcmVzdW1lOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghcG1hcF9kZW1vdGVfcGRlKHBtYXAs IHBkZSwgc3ZhKSkKKwkJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBkZW1vdGlvbiBmYWlsZWQiKTsK KwkJCX0KKwkJfQorCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCWZv ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr LAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkK KwkJCQljb250aW51ZTsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQkJcGFuaWMo InBtYXBfdW53aXJlOiBwdGUgJSNqeCBpcyBtaXNzaW5nIFBHX1ciLAorCQkJCSAgICAodWludG1h eF90KSpwdGUpOworCQkJLyoKKwkJCSAqIFBURV9XIG11c3QgYmUgY2xlYXJlZCBhdG9taWNhbGx5 LiAgQWx0aG91Z2ggdGhlIHBtYXAKKwkJCSAqIGxvY2sgc3luY2hyb25pemVzIGFjY2VzcyB0byBQ VEVfVywgYW5vdGhlciBwcm9jZXNzb3IKKwkJCSAqIGNvdWxkIGJlIHNldHRpbmcgUFRFX0QgYW5k L29yIFBURV9SRUYgY29uY3VycmVudGx5LgorCQkJICovCisJCQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgUFRFX1cpOworCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKwkJfQorCX0KKwlp ZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJ fQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ29weSB0aGUgcmFuZ2Ugc3BlY2lm aWVkIGJ5IHNyY19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291cmNlIG1hcCB0byB0aGUgcmFuZ2Ug ZHN0X2FkZHIvbGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24gbWFwLgorICoKKyAqCVRoaXMgcm91 dGluZSBpcyBvbmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBkbyBhbnl0aGluZy4KKyAqLworCit2 b2lkCitwbWFwX2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFwX3Qgc3JjX3BtYXAsIHZtX29mZnNl dF90IGRzdF9hZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZtX29mZnNldF90IHNyY19hZGRyKQor eworI2lmIDAKKy8qCisgKiBYWFggVGhpcyBkb2Vzbid0IGhlbHAgd2l0aCBmb3JrKCkgcGVyZm9y bWFuY2UgYW5kCisgKiBhZGRzIG1vcmUgb3ZlcmhlYWQuICBNYXliZSB0aGUgcmVmZXJlbmNlIGJp dCBlbXVsYXRpb24KKyAqIGlzIGNhdXNpbmcgZmF1bHQtbGlrZSBvdmVyaGVhZCBhbnl3YXk/Cisg Ki8KKworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9v ZmZzZXRfdCBhZGRyLCBlbmRfYWRkciwgdmFfbmV4dDsKKworCWlmIChkc3RfYWRkciAhPSBzcmNf YWRkcikKKwkJcmV0dXJuOworCisJaWYgKFBDUFVfR0VUKGN1cnBtYXApICE9IHNyY19wbWFwKQor CQlyZXR1cm47CisKKwllbmRfYWRkciA9IHNyY19hZGRyICsgbGVuOworCisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJLyogTG9jayB0aGUgcG1hcHMgaW4gdGhl IHNhbWUgb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2suICovCisJaWYgKGRzdF9wbWFwIDwgc3JjX3Bt YXApIHsKKwkJUE1BUF9MT0NLKGRzdF9wbWFwKTsKKwkJUE1BUF9MT0NLKHNyY19wbWFwKTsKKwl9 IGVsc2UgeworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCQlQTUFQX0xPQ0soZHN0X3BtYXApOwor CX0KKworCWZvciAoYWRkciA9IHNyY19hZGRyOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIgPSB2YV9u ZXh0KSB7CisJCXB0X2VudHJ5X3QgKnNyY19wdGUsICpkc3RfcHRlOworCQl2bV9wYWdlX3QgZHN0 bXBkZSwgZHN0bXB0ZSwgc3JjbXB0ZTsKKwkJcGRfZW50cnlfdCAqc3JjX3BkcGUsICpzcmNfcGRl LCAqZHN0X3BkZTsKKwkJcHRfZW50cnlfdCBzcmNwdGU7CisJCXZtX3BhZGRyX3Qgc3JjcGFkZHI7 CisJCXZtX3BhZ2VfdCBtOworCisKKwkJc3JjX3BkcGUgPSBwbWFwX3NlZ21hcChzcmNfcG1hcCwg YWRkcik7CisJCWlmIChzcmNfcGRwZSA9PSBOVUxMIHx8ICpzcmNfcGRwZSA9PSAwKSB7CisJCQl2 YV9uZXh0ID0gKGFkZHIgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCS8qCisJCQkgKiBJZiB0aGUg bmV4dCB2YSBpcyBvdXQgb2YgdGhlIGNvcHkgcmFuZ2UgdGhlbiBzZXQKKwkJCSAqIGl0IHRvIGVu ZF9hZGRyIGluIG9yZGVyIHRvIGNvcHkgYWxsIG1hcHBpbmdzIHVudGlsCisJCQkgKiBnaXZlbiBs aW1pdC4KKwkJCSAqLworCQkJaWYgKHZhX25leHQgPCBhZGRyKQorCQkJCXZhX25leHQgPSBlbmRf YWRkcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFfbmV4dCA9IChhZGRyICsgTkJQRFIpICYg flBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsK KworCQlzcmNfcGRlID0gcG1hcF9wZHBlX3RvX3BkZShzcmNfcGRwZSwgYWRkcik7CisJCWlmIChz cmNfcGRlID09IE5VTEwgfHwgKnNyY19wZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzcmNwdGUg PSAocHRfZW50cnlfdCkqc3JjX3BkZTsKKworCQlpZiAocHRlX2lzXzFtX3N1cGVycGFnZSgmc3Jj cHRlKSkgeworCQkJLyogQ29weSBzdXBlcnBhZ2UgcGRlLiAqLworCQkJaWYgKChhZGRyICYgUERS TUFTSykgIT0gMCB8fCBhZGRyICsgTkJQRFIgPiBlbmRfYWRkcikKKwkJCQljb250aW51ZTsKKwkJ CWRzdG1wZGUgPSBwbWFwX2FsbG9jcGRlKGRzdF9wbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChk c3RtcGRlID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCS8qIGRzdF9wZGUgPSBwbWFwX3BkZShk c3RfcG1hcCwgYWRkcik7ICovCisJCQlkc3RfcGRlID0gKHBkX2VudHJ5X3QgKilNSVBTX1BIWVNf VE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhkc3RtcGRlKSk7CisJCQlkc3RfcGRl ID0gJmRzdF9wZGVbcG1hcF9wZGVfaW5kZXgoYWRkcildOworCisJCQlpZiAoKmRzdF9wZGUgPT0g MCAmJgorCQkJICAgICghcHRlX3Rlc3QoJnNyY3B0ZSwgUFRFX01BTkFHRUQpIHx8CisJCQkgICAg cG1hcF9wdl9pbnNlcnRfcGRlKGRzdF9wbWFwLCBhZGRyLAorCQkJICAgIFRMQkxPX1BURV9UT19Q QShzcmNwdGUpLCAmbG9jaykpKSB7CisJCQkJKmRzdF9wZGUgPSAocGRfZW50cnlfdCkoc3JjcHRl ICYgflBURV9XKTsKKwkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgTkJQRFIg LworCQkJCSAgICBQQUdFX1NJWkUpOworCQkJfSBlbHNlCisJCQkJZHN0bXBkZS0+d2lyZV9jb3Vu dC0tOworCQkJY29udGludWU7CisJCX0KKworCQlzcmNwYWRkciA9IE1JUFNfRElSRUNUX1RPX1BI WVMoKnNyY19wZGUpOworCQlzcmNtcHRlID0gUEhZU19UT19WTV9QQUdFKHNyY3BhZGRyKTsKKwkJ S0FTU0VSVChzcmNtcHRlLT53aXJlX2NvdW50ID4gMCwKKwkJICAgICgicG1hcF9jb3B5OiBzb3Vy Y2UgcGFnZSB0YWJsZSBwYWdlIGlzIHVudXNlZCIpKTsKKworCQkvKgorCQkgKiBMaW1pdCBvdXIg c2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmFkZHIgcmVwcmVzZW50ZWQKKwkJICogYnkg dGhlIHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlCisJ CSAqIGJlaW5nIGNvcGllZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZW5kX2FkZHIpCisJCQl2 YV9uZXh0ID0gZW5kX2FkZHI7CisKKwkJLyoKKwkJICogV2FsayB0aGUgc291cmNlIHBhZ2UgdGFi bGUgZW50cmllcyBhbmQgY29weSB0aGUgbWFuYWdlZAorCQkgKiBlbnRyaWVzLgorCQkgKi8KKwor CQkvKiBzcmNfcHRlID0gcG1hcF9wZGVfdG9fcHRlKHNyY19wZGUsIGFkZHIpOyAqLworCQlzcmNf cHRlID0gKHB0X2VudHJ5X3QgKilNSVBTX1BIWVNfVE9fRElSRUNUKHNyY3BhZGRyKTsKKwkJc3Jj X3B0ZSA9ICZzcmNfcHRlW3BtYXBfcHRlX2luZGV4KGFkZHIpXTsKKworCQlpZiAoc3JjX3B0ZSA9 PSBOVUxMIHx8ICpzcmNfcHRlID09IDApCisJCQljb250aW51ZTsKKworCQlkc3RtcHRlID0gTlVM TDsKKwkJd2hpbGUgKGFkZHIgPCB2YV9uZXh0KSB7CisJCQl1bnNpZ25lZCBwZGVwaW5kZXg7CisJ CQlwdF9lbnRyeV90IHB0ZXRlbXA7CisKKworCQkJcHRldGVtcCA9ICpzcmNfcHRlOworCisJCQkv KgorCQkJICogd2Ugb25seSB2aXJ0dWFsIGNvcHkgbWFuYWdlZCBwYWdlcworCQkJICovCisJCQlp ZiAocHRlX3Rlc3QoJnB0ZXRlbXAsIFBURV9NQU5BR0VEKSkgeworCQkJCS8qIENhbGN1bGF0ZSBw YWdldGFibGUgcGFnZSBpbmRleCAqLworCQkJCXBkZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleChh ZGRyKTsKKworCQkJCS8qIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkuICovCisJCQkJZHN0 X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsKKworCQkJCWlmIChkc3RfcGRlICE9IE5V TEwgJiYgKmRzdF9wZGUgIT0gMCkgeworCQkJCQlkc3RtcHRlID0gUEhZU19UT19WTV9QQUdFKAor CQkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqZHN0X3BkZSkpOworCQkJCX0gZWxzZQorCQkJ CQlkc3RtcHRlID0gTlVMTDsKKworCQkJCWlmIChkc3RtcHRlICE9IE5VTEwgJiYKKwkJCQkgICAg ZHN0bXB0ZS0+cGluZGV4ID09IHBkZXBpbmRleCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFn ZSB0YWJsZSBpcyBtYXBwZWQgc28ganVzdAorCQkJCQkgKiBpbmNyZW1lbnQgdGhlIGhvbGQgY291 bnQuCisJCQkJCSAqLworCQkJCQlkc3RtcHRlLT53aXJlX2NvdW50Kys7CisJCQkJfSBlbHNlIHsK KwkJCQkJLyoKKwkJCQkJICogVGhlIHBhZ2UgdGFibGUgaXNuJ3QgbWFwcGVkLCBvciBpdAorCQkJ CQkgKiBoYXMgYmVlbiBkZWFsbG9jYXRlZC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUgPSBwbWFw X2FsbG9jcHRlKGRzdF9wbWFwLAorCQkJCQkgICAgYWRkciwgTlVMTCk7CisKKwkJCQkJLyoKKwkJ CQkJICogSWYgd2UgYXJlIGhhdmluZyBtZW1vcnkgYWxsb2MgaXNzdWVzCisJCQkJCSAqIHRoZW4g YWJhbmRvbiB0cnlpbmcgdG8gY29weSB0aGUgcGFnZQorCQkJCQkgKiB0YWJsZXMuCisJCQkJCSAq LworCQkJCQlpZiAoZHN0bXB0ZSA9PSBOVUxMKQorCQkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJ CS8qCisJCQkJICogTm93IHRoYXQgd2UgaGF2ZSBhIHBhZ2UgZGlyZWN0b3J5LCBnZXQgdGhlCisJ CQkJICogcHRlLgorCQkJCSAqLworCisJCQkJLyogZHN0X3B0ZSA9IHBtYXBfcHRlKGRzdF9wbWFw LCBhZGRyKTsgKi8KKwkJCQlkc3RfcHRlID0gKHB0X2VudHJ5X3QgKikKKwkJCQkgICAgTUlQU19Q SFlTX1RPX0RJUkVDVCgKKwkJCQkJVk1fUEFHRV9UT19QSFlTKGRzdG1wdGUpKTsKKwkJCQlkc3Rf cHRlID0gJmRzdF9wdGVbcG1hcF9wdGVfaW5kZXgoYWRkcildOworCisJCQkJLyogVHJ5IGFuZCBp bnNlcnQgdGhlIHB2X2VudHJ5LiAqLworCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRF X1RPX1BBKHB0ZXRlbXApKTsKKwkJCQlpZiAoKmRzdF9wdGUgPT0gMCAmJgorCQkJCSAgICBwbWFw X3RyeV9pbnNlcnRfcHZfZW50cnkoZHN0X3BtYXAsIGFkZHIsIG0sCisJCQkJICAgICZsb2NrKSkg eworCQkJCQkvKgorCQkJCQkgKiBQb3B1bGF0ZSB0aGUgZW50cnkuCisJCQkJCSAqCisJCQkJCSAq IENsZWFyIHRoZSB3aXJlZCwgbW9kaWZpZWQsIGFuZAorCQkJCQkgKiBhY2Nlc3NlZCAocmVmZXJl bmNlZCkgYml0cworCQkJCQkgKiBkdXJpbmcgdGhlIGNvcHkuCisJCQkJCSAqLworCQkJCQlwdGVf Y2xlYXIoJnB0ZXRlbXAsIFBURV9XIHwgUFRFX0QgfAorCQkJCQkgICAgUFRFX1JFRik7CisJCQkJ CSpkc3RfcHRlID0gcHRldGVtcDsKKwkJCQkJLyogVXBkYXRlIHN0YXRzLiAqLworCQkJCQlwbWFw X3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0xJ U1RfSU5JVCgmZnJlZSk7CisJCQkJCWlmIChwbWFwX3Vud2lyZV9wdHAoZHN0X3BtYXAsIGFkZHIs CisJCQkJCSAgICBkc3RtcHRlLCAmZnJlZSkpIHsKKwkJCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl KGRzdF9wbWFwLAorCQkJCQkJICAgIGFkZHIpOworCQkJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworCQkJCQl9CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBDaGVjayB0aGUg d2lyZV9jb3VudCB0byBzZWUgaWYgd2UncmUgZG9uZS4gKi8KKwkJCQlpZiAoZHN0bXB0ZS0+d2ly ZV9jb3VudCA+PSBzcmNtcHRlLT53aXJlX2NvdW50KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWFk ZHIgKz0gUEFHRV9TSVpFOworCQkJc3JjX3B0ZSsrOworCQl9CisJfQorb3V0OgorCWlmIChsb2Nr ICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s b2NrKTsKKwlQTUFQX1VOTE9DSyhzcmNfcG1hcCk7CisJUE1BUF9VTkxPQ0soZHN0X3BtYXApOwor I2VuZGlmIC8qICNpZiAwICovCit9CisKKy8qCisgKglwbWFwX3plcm9fcGFnZSB6ZXJvcyB0aGUg c3BlY2lmaWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0g YW5kIHVzaW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKiAJVXNlIFhLUEhZ UyBmb3IgNjQgYml0LgorICovCit2b2lkCitwbWFwX3plcm9fcGFnZSh2bV9wYWdlX3QgbSkKK3sK Kwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7 CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnpl cm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEs IFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqCXBtYXBfemVyb19wYWdl X2FyZWEgemVyb3MgdGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKKyAqCXRo ZSBwYWdlIGludG8gS1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCisg KgorICoJb2ZmIGFuZCBzaXplIG1heSBub3QgY292ZXIgYW4gYXJlYSBiZXlvbmQgYSBzaW5nbGUg aGFyZHdhcmUgcGFnZS4KKyAqLwordm9pZAorcG1hcF96ZXJvX3BhZ2VfYXJlYSh2bV9wYWdlX3Qg bSwgaW50IG9mZiwgaW50IHNpemUpCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBw aHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBo eXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjaGFyICopKGNhZGRyX3QpdmEgKyBvZmYsIHNp emUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhICsgb2ZmLCBzaXplKTsKKwlzY2hlZF91 bnBpbigpOworfQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxlKHZtX3BhZ2VfdCBtKQorewor CXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsK KworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVy bygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigpOworfQorCisvKgorICoJcG1hcF9jb3B5X3BhZ2Ug Y29waWVzIHRoZSBzcGVjaWZpZWQgKG1hY2hpbmUgaW5kZXBlbmRlbnQpCisgKglwYWdlIGJ5IG1h cHBpbmcgdGhlIHBhZ2UgaW50byB2aXJ0dWFsIG1lbW9yeSBhbmQgdXNpbmcKKyAqCWJjb3B5IHRv IGNvcHkgdGhlIHBhZ2UsIG9uZSBtYWNoaW5lIGRlcGVuZGVudCBwYWdlIGF0IGEKKyAqCXRpbWUu CisgKgorICogCVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLworI2RlZmluZQlQTUFQX0NPUFlf VEFHUwkweDAwMDAwMDAxCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwodm1f cGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90IHZh X3NyYywgdmFfZHN0OworCXZtX3BhZGRyX3QgcGh5c19zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3Jj KTsKKwl2bV9wYWRkcl90IHBoeXNfZHN0ID0gVk1fUEFHRV9UT19QSFlTKGRzdCk7CisKKwkvKiBl YXN5IGNhc2UsIGFsbCBjYW4gYmUgYWNjZXNzZWQgdmlhIEtTRUcwICovCisJLyoKKwkgKiBGbHVz aCBhbGwgY2FjaGVzIGZvciBWQSB0aGF0IGFyZSBtYXBwZWQgdG8gdGhpcyBwYWdlCisJICogdG8g bWFrZSBzdXJlIHRoYXQgZGF0YSBpbiBTRFJBTSBpcyB1cCB0byBkYXRlCisJICovCisJc2NoZWRf cGluKCk7CisJcG1hcF9mbHVzaF9wdmNhY2hlKHNyYyk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu Z2VfaW5kZXgoTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX2RzdCksIFBBR0VfU0laRSk7CisJdmFf c3JjID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX3NyYyk7CisJdmFfZHN0ID0gTUlQU19QSFlT X1RPX0RJUkVDVChwaHlzX2RzdCk7CisjaWZkZWYgQ1BVX0NIRVJJCisJaWYgKGZsYWdzICYgUE1B UF9DT1BZX1RBR1MpCisJCWNoZXJpX2Jjb3B5KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3QpdmFf ZHN0LCBQQUdFX1NJWkUpOworCWVsc2UKKyNlbHNlCisJCWJjb3B5KChjYWRkcl90KXZhX3NyYywg KGNhZGRyX3QpdmFfZHN0LCBQQUdFX1NJWkUpOworI2VuZGlmCisJbWlwc19kY2FjaGVfd2JpbnZf cmFuZ2UodmFfZHN0LCBQQUdFX1NJWkUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKiBX aXRoIENIRVJJLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlIHRvIGV4cGxpY2l0bHkgcHJvcGFn YXRlIHRhZ3MgYmV0d2VlbgorICogcGFnZXMgKGUuZy4sIGR1cmluZyBjb3B5LW9uLXdyaXRlKSwg YnV0IG5vdCBvdGhlciB0aW1lcyAoZS5nLiwgY29weWluZyBkYXRhCisgKiBmcm9tIFZNIHRvIGJ1 ZmZlciBjYWNoZSkuICBUaGVyZSBpcyBtb3JlIHBsYXlpbmcgb3V0IGhlcmUgeWV0IHRvIGRvIChl LmcuLAorICogaWYgYW55IGZpbGVzeXN0ZW1zIGxlYXJuIHRvIHByZXNlcnZlIHRhZ3MpIGJ1dCB0 aGVzZSBLUElzIGFsbG93IHVzIHRvCisgKiBjYXB0dXJlIHRoYXQgZGlmZmVyZW5jZSBpbiB0aGUg bWVhbiB0aW1lLgorICovCit2b2lkCitwbWFwX2NvcHlfcGFnZSh2bV9wYWdlX3Qgc3JjLCB2bV9w YWdlX3QgZHN0KQoreworCisJcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwoc3JjLCBkc3QsIDApOwor fQorCisjaWZkZWYgQ1BVX0NIRVJJCit2b2lkCitwbWFwX2NvcHlfcGFnZV90YWdzKHZtX3BhZ2Vf dCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMs IGRzdCwgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKK2ludCB1bm1hcHBlZF9idWZfYWxs b3dlZDsKKworc3RhdGljIHZvaWQKK3BtYXBfY29weV9wYWdlc19pbnRlcm5hbCh2bV9wYWdlX3Qg bWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNl dF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUsIGludCBmbGFncykKK3sKKwljaGFyICphX2NwLCAq Yl9jcDsKKwl2bV9wYWdlX3QgYV9tLCBiX207CisJdm1fb2Zmc2V0X3QgYV9wZ19vZmZzZXQsIGJf cGdfb2Zmc2V0OworCXZtX3BhZGRyX3QgYV9waHlzLCBiX3BoeXM7CisJaW50IGNudDsKKworCXNj aGVkX3BpbigpOworCXdoaWxlICh4ZmVyc2l6ZSA+IDApIHsKKwkJYV9wZ19vZmZzZXQgPSBhX29m ZnNldCAmIFBBR0VfTUFTSzsKKwkJY250ID0gbWluKHhmZXJzaXplLCBQQUdFX1NJWkUgLSBhX3Bn X29mZnNldCk7CisJCWFfbSA9IG1hW2Ffb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQlhX3BoeXMg PSBWTV9QQUdFX1RPX1BIWVMoYV9tKTsKKwkJYl9wZ19vZmZzZXQgPSBiX29mZnNldCAmIFBBR0Vf TUFTSzsKKwkJY250ID0gbWluKGNudCwgUEFHRV9TSVpFIC0gYl9wZ19vZmZzZXQpOworCQliX20g PSBtYltiX29mZnNldCA+PiBQQUdFX1NISUZUXTsKKwkJYl9waHlzID0gVk1fUEFHRV9UT19QSFlT KGJfbSk7CisJCXBtYXBfZmx1c2hfcHZjYWNoZShhX20pOworCQltaXBzX2RjYWNoZV93Ymludl9y YW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cyksCisJCSAgICBQQUdFX1NJWkUp OworCQlhX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGFfcGh5cykgKyBhX3BnX29m ZnNldDsKKwkJYl9jcCA9IChjaGFyICopTUlQU19QSFlTX1RPX0RJUkVDVChiX3BoeXMpICsgYl9w Z19vZmZzZXQ7CisjaWZkZWYgQ1BVX0NIRVJJCisJCWlmIChmbGFncyAmIFBNQVBfQ09QWV9UQUdT KQorCQkJY2hlcmlfYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKwkJZWxzZQorI2Vsc2UKKwkJCWJj b3B5KGFfY3AsIGJfY3AsIGNudCk7CisjZW5kaWYKKwkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo KHZtX29mZnNldF90KWJfY3AsIGNudCk7CisJCWFfb2Zmc2V0ICs9IGNudDsKKwkJYl9vZmZzZXQg Kz0gY250OworCQl4ZmVyc2l6ZSAtPSBjbnQ7CisJfQorCXNjaGVkX3VucGluKCk7Cit9CisKKy8q CisgKiBBcyB3aXRoIHBtYXBfY29weV9wYWdlKCksIENIRVJJIHJlcXVpcmVzIHRhZ2dlZCBhbmQg bm9uLXRhZ2dlZCB2ZXJzaW9ucworICogZGVwZW5kaW5nIG9uIHRoZSBjaXJjdW1zdGFuY2VzLgor ICovCit2b2lkCitwbWFwX2NvcHlfcGFnZXModm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3Bt YXBfY29weV9wYWdlc190YWdzKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwg dm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSkK K3sKKworCXBtYXBfY29weV9wYWdlc19pbnRlcm5hbChtYSwgYV9vZmZzZXQsIG1iLCBiX29mZnNl dCwgeGZlcnNpemUsCisJICAgIFBNQVBfQ09QWV9UQUdTKTsKK30KKyNlbmRpZgorCisvKgorICog UmV0dXJucyB0cnVlIGlmIHRoZSBwbWFwJ3MgcHYgaXMgb25lIG9mIHRoZSBmaXJzdAorICogMTYg cHZzIGxpbmtlZCB0byBmcm9tIHRoaXMgcGFnZS4gIFRoaXMgY291bnQgbWF5CisgKiBiZSBjaGFu Z2VkIHVwd2FyZHMgb3IgZG93bndhcmRzIGluIHRoZSBmdXR1cmU7IGl0CisgKiBpcyBvbmx5IG5l Y2Vzc2FyeSB0aGF0IHRydWUgYmUgcmV0dXJuZWQgZm9yIGEgc21hbGwKKyAqIHN1YnNldCBvZiBw bWFwcyBmb3IgcHJvcGVyIHBhZ2UgYWdpbmcuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2V4 aXN0c19xdWljayhwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2Ug KnB2aDsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxvb3Bz ID0gMDsKKwlib29sZWFuX3QgcnY7CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5B R0VEKSA9PSAwLAorCSAgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5jX18s IG0pKTsKKwlydiA9IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlpZiAoUFZfUE1BUChwdikg PT0gcG1hcCkgeworCQkJcnYgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcHMrKzsKKwkJ aWYgKGxvb3BzID49IDE2KQorCQkJYnJlYWs7CisJfQorCWlmICghcnYgJiYgbG9vcHMgPCAxNiAm JiAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBw dl9uZXh0KSB7CisJCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgeworCQkJCXJ2ID0gVFJVRTsK KwkJCQlicmVhazsKKwkJCX0KKwkJCWxvb3BzKys7CisJCQlpZiAobG9vcHMgPj0gMTYpCisJCQkJ YnJlYWs7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xv YmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9wYWdlX3dpcmVkX21h cHBpbmdzOgorICoKKyAqCVJldHVybiB0aGUgbnVtYmVyIG9mIG1hbmFnZWQgbWFwcGluZ3MgdG8g dGhlIGdpdmVuIHBoeXNpY2FsIHBhZ2UKKyAqCXRoYXQgYXJlIHdpcmVkLgorICovCitpbnQKK3Bt YXBfcGFnZV93aXJlZF9tYXBwaW5ncyh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICps b2NrOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJcHRfZW50cnlfdCAqcHRlOwor CWludCBjb3VudCwgbWRfZ2VuOworCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh PSAwKQorCQlyZXR1cm4gKDApOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6 CisJY291bnQgPSAwOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0 KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsK KwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQlQTUFQ X0xPQ0socG1hcCk7CisJCQlyd19ybG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQu cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJ fQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVz dChwdGUsIFBURV9XKSkKKwkJCWNvdW50Kys7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKwlp ZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlzdHJ1Y3QgbWRfcGFnZSAq cHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYs ICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlm ICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJaW50IHB2aF9nZW4gPSBwdmgtPnB2X2dlbjsK KwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQ TUFQX0xPQ0socG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBt LT5tZC5wdl9nZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXBk X2VudHJ5X3QgKnBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAocHRlX3Rl c3QoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKSkKKwkJCQljb3VudCsrOworCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhf Z2xvYmFsX2xvY2spOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogIFJldHVybnMgVFJV RSBpZiB0aGUgZ2l2ZW4gcGFnZSBpcyBtYXBwZWQgaW5kaXZpZHVhbGx5IG9yIGFzIHBhcnQgb2YK KyAqICBhIDJtcGFnZS4gT3RoZXJ3aXNlLCByZXR1cm5zIEZBTFNFLgorICovCitib29sZWFuX3QK K3BtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90IG0pCit7CisJc3RydWN0IHJ3bG9jayAqbG9j azsKKwlib29sZWFuX3QgcnY7CisKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9 IDApCisJCXJldHVybiAoRkFMU0UpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxv Y2sgPSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlydiA9 ICFUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgfHwKKwkgICAgKChtLT5mbGFncyAmIFBHX0ZJ Q1RJVElPVVMpID09IDAgJiYKKwkJIVRBSUxRX0VNUFRZKCZwYV90b19wdmgoVk1fUEFHRV9UT19Q SFlTKG0pKS0+cHZfbGlzdCkpOworCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIERlc3Ryb3kgYWxsIG1h bmFnZWQsIG5vbi13aXJlZCBtYXBwaW5ncyBpbiB0aGUgZ2l2ZW4gdXNlci1zcGFjZQorICogcG1h cC4gIFRoaXMgcG1hcCBjYW5ub3QgYmUgYWN0aXZlIG9uIGFueSBwcm9jZXNzb3IgYmVzaWRlcyB0 aGUKKyAqIGNhbGxlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRv IHRoZSBrZXJuZWwgcG1hcC4gIE1vcmVvdmVyLCBpdAorICogaXMgbm90IGludGVuZGVkIGZvciBn ZW5lcmFsIHVzZS4gIEl0IGlzIG9ubHkgdG8gYmUgdXNlZCBkdXJpbmcKKyAqIHByb2Nlc3MgdGVy bWluYXRpb24uICBDb25zZXF1ZW50bHksIGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB3YXlzCisg KiB0aGF0IG1ha2UgaXQgZmFzdGVyIHRoYW4gcG1hcF9yZW1vdmUoKS4gIEZpcnN0LCBpdCBjYW4g bW9yZSBxdWlja2x5CisgKiBkZXN0cm95IG1hcHBpbmdzIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBw bWFwJ3MgY29sbGVjdGlvbiBvZiBQVgorICogZW50cmllcywgcmF0aGVyIHRoYW4gc2VhcmNoaW5n IHRoZSBwYWdlIHRhYmxlLiAgU2Vjb25kLCBpdCBkb2Vzbid0CisgKiBoYXZlIHRvIHRlc3QgYW5k IGNsZWFyIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgYXRvbWljYWxseSwgYmVjYXVzZQorICogbm8g cHJvY2Vzc29yIGlzIGN1cnJlbnRseSBhY2Nlc3NpbmcgdGhlIHVzZXIgYWRkcmVzcyBzcGFjZS4g IEluCisgKiBwYXJ0aWN1bGFyLCBhIHBhZ2UgdGFibGUgZW50cnkncyBkaXJ0eSBiaXQgd29uJ3Qg Y2hhbmdlIHN0YXRlIG9uY2UKKyAqIHRoaXMgZnVuY3Rpb24gc3RhcnRzLgorICovCit2b2lkCitw bWFwX3JlbW92ZV9wYWdlcyhwbWFwX3QgcG1hcCkKK3sKKwlwZF9lbnRyeV90IHB0ZXBkZSwgKnBk ZTsKKwlwdF9lbnRyeV90ICpwdGUsIHRwdGU7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9w YWdlX3QgbSwgbXB0ZSwgbXQ7CisJcHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZo OworCXN0cnVjdCBwdl9jaHVuayAqcGMsICpucGM7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlp bnQgYml0OworCXVpbnQ2NF90IGludXNlLCBiaXRtYXNrOworCWludCBhbGxmcmVlLCBmaWVsZCwg ZnJlZWQsIGlkeDsKKwlib29sZWFuX3Qgc3VwZXJwYWdlOworCXZtX3BhZGRyX3QgcGE7CisKKwkv KgorCSAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwbWFwIGlzIG9ubHkgYWN0aXZlIG9uIHRoZSBj dXJyZW50CisJICogQ1BVLiAgVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IGJsb2NrIGFub3RoZXIg Q1BVIGZyb20KKwkgKiBhY3RpdmF0aW5nIHRoZSBwbWFwIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMg ZXhlY3V0aW5nLgorCSAqLworCUtBU1NFUlQocG1hcCA9PSB2bXNwYWNlX3BtYXAoY3VydGhyZWFk LT50ZF9wcm9jLT5wX3Ztc3BhY2UpLAorCSAgICAoIiVzOiBub24tY3VycmVudCBwbWFwICVwIiwg X19mdW5jX18sIHBtYXApKTsKKworCWxvY2sgPSBOVUxMOworCVNMSVNUX0lOSVQoJmZyZWUpOwor CXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfTE9DSyhwbWFwKTsKKwlUQUlMUV9G T1JFQUNIX1NBRkUocGMsICZwbWFwLT5wbV9wdmNodW5rLCBwY19saXN0LCBucGMpIHsKKwkJYWxs ZnJlZSA9IDE7CisJCWZyZWVkID0gMDsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007 IGZpZWxkKyspIHsKKwkJCWludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb ZmllbGRdOworCQkJd2hpbGUgKGludXNlICE9IDApIHsKKwkJCQliaXQgPSBmZnNsKGludXNlKSAt IDE7CisJCQkJYml0bWFzayA9IDFVTCA8PCBiaXQ7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2Yo aW51c2UpICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJ CWludXNlICY9IH5iaXRtYXNrOworCisJCQkJcGRlID0gcG1hcF9zZWdtYXAocG1hcCwgcHYtPnB2 X3ZhKTsKKwkJCQlwdGVwZGUgPSAqcGRlOworCQkJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRl LCBwdi0+cHZfdmEpOworCQkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCQkJ c3VwZXJwYWdlID0gVFJVRTsKKwkJCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCQkJfSBl bHNlIHsKKwkJCQkJc3VwZXJwYWdlID0gRkFMU0U7CisJCQkJCXB0ZXBkZSA9ICpwZGU7CisJCQkJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCQkJfQorCQkJCXRwdGUg PSAqcHRlOworCQkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpICB7CisJCQkJCXBhbmljKCIlczog YmFkICVzIHB0ZSB2YSAlbHggcHRlICVseCIsCisJCQkJCSAgICBfX2Z1bmNfXywgc3VwZXJwYWdl ID8gInN1cGVycGFnZSIgOgorCQkJCQkgICAgIiIsIHB2LT5wdl92YSwgdHB0ZSk7CisJCQkJfQor CisvKgorICogV2UgY2Fubm90IHJlbW92ZSB3aXJlZCBwYWdlcyBmcm9tIGEgcHJvY2VzcycgbWFw cGluZyBhdCB0aGlzIHRpbWUKKyAqLworCQkJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKSB7 CisJCQkJCWFsbGZyZWUgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlwYSA9IFRM QkxPX1BURV9UT19QQSh0cHRlKTsKKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwYSAmPSB+UERS TUFTSzsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQlLQVNTRVJUKG0tPnBoeXNf YWRkciA9PSBwYSwKKwkJCQkgICAgKCIlczogdm1fcGFnZV90ICVwIHBoeXNfYWRkciBtaXNtYXRj aCAiCisJCQkJICAgICIlMDE2anggJTAxNmp4IiwgX19mdW5jX18sIG0sCisJCQkJICAgICh1aW50 bWF4X3QpbS0+cGh5c19hZGRyLCAodWludG1heF90KXRwdGUpKTsKKworCQkJCUtBU1NFUlQoKG0t PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAorCQkJCSAgICBtIDwgJnZtX3BhZ2VfYXJy YXlbdm1fcGFnZV9hcnJheV9zaXplXSwKKwkJCQkgICAgKCIlczogYmFkIHRwdGUgJSNqeCIsIF9f ZnVuY19fLAorCQkJCSAgICAodWludG1heF90KXRwdGUpKTsKKworCQkJCS8qIENsZWFyIFBURSAq LworCQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXB0ZV9zdG9yZShwdGUsIDApOworCQkJCWVsc2UK KwkJCQkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVsX3BtYXAocG1hcCkgPworCQkJCQkgICAgUFRF X0cgOiAwKTsKKworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgY2xlYW4gYW5k IHJlZmVyZW5jZSBiaXRzCisJCQkJICovCisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfRCkg JiYKKwkJCQkgICAgIXB0ZV90ZXN0KCZ0cHRlLCBQVEVfUk8pKSB7CisJCQkJCWlmIChzdXBlcnBh Z2UpIHsKKwkJCQkJCXZtX3BhZ2VfdCBtdDsKKworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1b TkJQRFIgLyBQQUdFX1NJWkVdOyBtdCsrKQorCQkJCQkJCXZtX3BhZ2VfZGlydHkobXQpOworCQkJ CQl9IGVsc2UKKwkJCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJfQorCisJCQkJQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2NrLCBtKTsKKworCQkJCS8qIE1hcmsgZnJlZSAqLwor CQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CisJCQkJaWYgKHN1cGVycGFnZSkgewor CQkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisJ CQkJCXB2aCA9IHBhX3RvX3B2aChUTEJMT19QVEVfVE9fUEEodHB0ZSkpOworCQkJCQlUQUlMUV9S RU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlwdmgtPnB2X2dlbisrOwor CQkJCQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCWZvciAobXQgPSBt OyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJCQlpZiAoVEFJTFFfRU1Q VFkoJm10LT5tZC5wdl9saXN0KSkKKwkJCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtdCwgUEdB X1dSSVRFQUJMRSk7CisJCQkJCX0KKwkJCQkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1h cCwgcHYtPnB2X3ZhKTsKKwkJCQkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJCQkJcG1hcF9yZW1v dmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBt YXAsIDEpOworCQkJCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09IE5QVEVQRywKKwkJCQkJ CSAgICAoIiVzOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIiwKKwkJCQkJCSAgICBfX2Z1bmNf XykpOworCQkJCQkJbXB0ZS0+d2lyZV9jb3VudCA9IDA7CisJCQkJCQlwbWFwX2FkZF9kZWxheWVk X2ZyZWVfbGlzdChtcHRlLCAmZnJlZSwgRkFMU0UpOworCQkJCQkJYXRvbWljX3N1YnRyYWN0X2lu dCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlw bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCQlpZiAo KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpICE9IDAgJiYKKwkJCQkJICAgIFRBSUxRX0VNUFRZ KCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykg PT0gMCkgeworCQkJCQkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJ CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpCisJCQkJCQkJdm1fcGFnZV9hZmxhZ19j bGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlwbWFwX3VudXNlX3B0 KHBtYXAsIHB2LT5wdl92YSwgcHRlcGRlLCAmZnJlZSk7CisJCQkJZnJlZWQrKzsKKwkJCX0KKwkJ fQorCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIGZyZWVkKSk7CisJ CVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBmcmVlZCkpOworCQlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9jb3VudCwgZnJlZWQpKTsKKwkJaWYg KGFsbGZyZWUpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xp c3QpOworCQkJZnJlZV9wdl9jaHVuayhwYyk7CisJCX0KKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK KwkJcndfd3VubG9jayhsb2NrKTsKKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCVBNQVBf VU5MT0NLKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVl X3plcm9fcGFnZXMoJmZyZWUpOworfQorCisvKgorICogQ2xlYXIgdGhlIHdyaXRlIGFuZCBtb2Rp ZmllZCBiaXRzIGluIGVhY2ggb2YgdGhlIGdpdmVuIHBhZ2UncyBtYXBwaW5ncy4KKyAqLwordm9p ZAorcG1hcF9yZW1vdmVfd3JpdGUodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2 aDsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdl9lbnRyeV90IG5leHRfcHY7CisJaW50IHB2aF9nZW47 CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGU7 CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbWRfZ2Vu OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJw bWFwX3JlbW92ZV93cml0ZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJ ICogSWYgdGhlIHBhZ2UgaXMgbm90IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJM RSBjYW5ub3QgYmUKKwkgKiBzZXQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIG9iamVjdCBp cyBsb2NrZWQuICBUaHVzLAorCSAqIGlmIFBHQV9XUklURUFCTEUgaXMgY2xlYXIsIG5vIHBhZ2Ug dGFibGUgZW50cmllcyBuZWVkIHVwZGF0aW5nLgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xP Q0tFRChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3Mg JiBQR0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcndfcmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXB2aCA9IHBhX3Rv X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworcmV0cnlfcHZfbG9vcDoKKwlyd193bG9jayhsb2Nr KTsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9t YXBwaW5nczsKKwlUQUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQs IG5leHRfcHYpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2Nr KGxvY2spOworCQkJCWdvdG8gcmV0cnlfcHZfbG9vcDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5w dl92YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlpZiAocGRlX2lzXzFtX3N1cGVy cGFnZShwZGUpICYmICFwZGVfdGVzdChwZGUsIFBURV9STykpCisJCQkodm9pZClwbWFwX2RlbW90 ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKwkJS0FTU0VSVChsb2NrID09IFZN X1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLAorCQkgICAgKCJpbmNvbnNpc3RlbnQgcHYgbG9jayAl cCAlcCBmb3IgcGFnZSAlcCIsCisJCSAgICBsb2NrLCBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyht KSwgbSkpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlM UV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1B UChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5w dl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOwor CQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAh PSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2NrKGxvY2spOworCQkJCWdvdG8gcmV0cnlf cHZfbG9vcDsKKwkJCX0KKwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOwor CQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAgICAoIiVzOiBmb3VuZCBhIHN1 cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBfX2Z1bmNfXywgbSkpOworCQlw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHB0ZSAhPSBO VUxMICYmIHB0ZV9pc192YWxpZChwdGUpLAorCQkgICAgKCIlczpwYWdlIG9uIHB2X2xpc3QgaGFz IG5vIHB0ZSIsIF9fZnVuY19fKSk7CityZXRyeToKKwkJb2xkcHRlID0gKnB0ZTsKKwkJaWYgKCFw dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsIG9sZHB0ZSwKKwkJCSAgICAoKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKSkKKwkJCQln b3RvIHJldHJ5OworCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9EKSkKKwkJCQl2bV9wYWdl X2RpcnR5KG0pOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0Ff V1JJVEVBQkxFKTsKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf bG9jayk7Cit9CisKKyNkZWZpbmUJUE1BUF9UU19SRUZFUkVOQ0VEX01BWAk1CisKKy8qLQorICoJ cG1hcF90c19yZWZlcmVuY2VkOgorICoKKyAqICBSZXR1cm4gYSBjb3VudCBvZiBwYWdlcyB0aGF0 IGhhdmUgYmVlbiByZWZlcmVuY2VkLCBhbmQgcmVzZXQgdGhlCisgKiAgcmVmZXJlbmNlIGJpdC4g IEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIGV2ZXJ5IHJlZmVyZW5jZSBiaXQgdG8gYmUKKyAqICBy ZXNldCwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0aGF0IDAgb25seSBiZSByZXR1cm5lZCB3aGVuIHRo ZXJlIGFyZQorICogIHRydWx5IGhhdmUgYmVlbiBwYWdlcyByZWZlcmVuY2VkLgorICoKKyAqICBY WFg6IFRoZSBleGFjdCBudW1iZXIgb2YgZmxhZ3MgdG8gY2hlY2sgYW5kIHJlc2V0IGlzIGEgbWF0 dGVyIHRoYXQKKyAqICBzaG91bGQgYmUgdGVzdGVkIGFuZCBzdGFuZGFyZGl6ZWQgYXQgc29tZSBw b2ludCBpbiB0aGUgZnV0dXJlIGZvcgorICogIG9wdGltYWwgYWdpbmcgb2Ygc2hhcmVkIHBhZ2Vz LgorICovCitpbnQKK3BtYXBfdHNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qg bWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHYsIHB2ZjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1 Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJ dm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgY2xlYXJlZCwgbWRfZ2VuLCBu b3RfY2xlYXJlZCwgcHZoX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH RUQpID09IDAsCisJICAgICgicG1hcF90c19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5h Z2VkIiwgbSkpOworCWNsZWFyZWQgPSAwOworCXBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCWxv Y2sgPSBQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwly d19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyd193bG9jayhsb2NrKTsKK3JldHJ5OgorCW5v dF9jbGVhcmVkID0gMDsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAor CSAgICAocHZmID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpID09IE5VTEwpCisJCWdvdG8g c21hbGxfbWFwcGluZ3M7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5 OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBw di0+cHZfdmEpOworCQlpZiAocHRlX2lzX3JlZigocHRfZW50cnlfdCAqKXBkZSkpIHsKKwkJCS8q CisJCQkgKiBTaW5jZSB0aGlzIHJlZmVyZW5jZSBiaXQgaXMgc2hhcmVkIGJ5IDUxMiA0S0IKKwkJ CSAqIHBhZ2VzLCBpdCBzaG91bGQgbm90IGJlIGNsZWFyZWQgZXZlcnkgdGltZSBpdCBpcworCQkJ ICogdGVzdGVkLiAgQXBwbHkgYSBzaW1wbGUgImhhc2giIGZ1bmN0aW9uIG9uIHRoZQorCQkJICog cGh5c2ljYWwgcGFnZSBudW1iZXIsIHRoZSB2aXJ0dWFsIHN1cGVycGFnZSBudW1iZXIsCisJCQkg KiBhbmQgdGhlIHBtYXAgYWRkcmVzcyB0byBzZWxlY3Qgb25lIDRLQiBwYWdlIG91dCBvZgorCQkJ ICogdGhlIDUxMiBvbiB3aGljaCB0ZXN0aW5nIHRoZSByZWZlcmVuY2UgYml0IHdpbGwKKwkJCSAq IHJlc3VsdCBpbiBjbGVhcmluZyB0aGF0IHJlZmVyZW5jZSBiaXQuICBUaGlzCisJCQkgKiBmdW5j dGlvbiBpcyBkZXNpZ25lZCB0byBhdm9pZCB0aGUgc2VsZWN0aW9uIG9mIHRoZQorCQkJICogc2Ft ZSA0S0IgcGFnZSBmb3IgZXZlcnkgMk1CIHBhZ2UgbWFwcGluZy4KKwkJCSAqCisJCQkgKiBPbiBk ZW1vdGlvbiwgYSBtYXBwaW5nIHRoYXQgaGFzbid0IGJlZW4gcmVmZXJlbmNlZAorCQkJICogaXMg c2ltcGx5IGRlc3Ryb3llZC4gIFRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBhCisJCQkgKiBz dWJzZXF1ZW50IHBhZ2UgZmF1bHQgb24gYSBkZW1vdGVkIHdpcmVkIG1hcHBpbmcsCisJCQkgKiBh bHdheXMgbGVhdmUgaXRzIHJlZmVyZW5jZSBiaXQgc2V0LiAgTW9yZW92ZXIsCisJCQkgKiBzaW5j ZSB0aGUgc3VwZXJwYWdlIGlzIHdpcmVkLCB0aGUgY3VycmVudCBzdGF0ZSBvZgorCQkJICogaXRz IHJlZmVyZW5jZSBiaXQgd29uJ3QgYWZmZWN0IHBhZ2UgcmVwbGFjZW1lbnQuCisJCQkgKi8KKwkJ CWlmICgoKChwYSA+PiBQQUdFX1NISUZUKSBeIChwdi0+cHZfdmEgPj4gUERSU0hJRlQpIF4KKwkJ CSAgICAodWludHB0cl90KXBtYXApICYgKE5QVEVQRyAtIDEpKSA9PSAwICYmCisJCQkgICAgIXBk ZV90ZXN0KHBkZSwgUFRFX1cpKSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3Qg KilwZGUsIFBURV9SRUYpOworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92 YSk7CisJCQkJY2xlYXJlZCsrOworCQkJfSBlbHNlCisJCQkJbm90X2NsZWFyZWQrKzsKKworCQl9 CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhlIFBWIGxpc3QgaWYgaXQgaGFz IG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBOVUxMICYmIFRBSUxRX05FWFQo cHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw diwgcHZfbmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZf bmV4dCk7CisJCX0KKwkJaWYgKChjbGVhcmVkICsgbm90X2NsZWFyZWQpID49IFBNQVBfVFNfUkVG RVJFTkNFRF9NQVgpCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm cHZoLT5wdl9saXN0KSkgIT0gcHZmKTsKK3NtYWxsX21hcHBpbmdzOgorCWlmICgocHZmID0gVEFJ TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlwdiA9IHB2 ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0gUFZf UE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZo LT5wdl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2sp OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAoCisJCQkg ICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9n ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQl9 CisKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lz X3N1cGVycGFnZShwZGUpLAorCQkgICAgKCJwbWFwX3RzX3JlZmVyZW5jZWQ6IGZvdW5kIHN1cGVy cGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBtKSk7CisJCXB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfaXNfcmVmKHB0ZSkpIHsKKwkJCWF0 b21pY19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQljbGVhcmVkKys7CisJCX0KKwkJUE1B UF9VTkxPQ0socG1hcCk7CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0 aGFuIG9uZSBlbnRyeS4gKi8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZf bmV4dCkgIT0gTlVMTCkgeworCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZf bmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQp OworCQkJbS0+bWQucHZfZ2VuKys7CisJCX0KKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm bS0+bWQucHZfbGlzdCkpICE9IHB2ZiAmJiBjbGVhcmVkICsKKwkgICAgbm90X2NsZWFyZWQgPCBQ TUFQX1RTX1JFRkVSRU5DRURfTUFYKTsKK291dDoKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChjbGVhcmVkICsgbm90X2NsZWFyZWQp OworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyh2bV9wYWdl X3QgbSwgYm9vbGVhbl90IGFjY2Vzc2VkLCBib29sZWFuX3QgbW9kaWZpZWQpCit7CisJc3RydWN0 IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJ cHRfZW50cnlfdCAqcHRlOworCXBtYXBfdCBwbWFwOworCWludCBtZF9nZW4sIHB2aF9nZW47CisJ Ym9vbGVhbl90IHJ2OworCisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CityZXN0YXJ0OgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7 CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJ CSBtZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkgcndfcnVubG9jayhsb2NrKTsKKwkJCSBQTUFQ X0xPQ0socG1hcCk7CisJCQkgcndfcmxvY2sobG9jayk7CisJCQkgaWYgKG1kX2dlbiAhPSBtLT5t ZC5wdl9nZW4pIHsKKwkJCQkgUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJIGdvdG8gcmVzdGFydDsK KwkJCSB9CisJCX0KKwkJcHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKG1v ZGlmaWVkKSB7CisJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFwdGVfdGVzdChwdGUs IFBURV9STyk7CisJCQlpZiAoYWNjZXNzZWQpCisJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQo cHRlKSAmJiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0gZWxzZSBpZiAoYWNjZXNzZWQpIHsKKwkJCXJ2 ID0gcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9CisJCVBNQVBfVU5M T0NLKHBtYXApOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKChtLT5mbGFncyAm IFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZ UyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJ bWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCQly d19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQlyd19ybG9jayhsb2Nr KTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAgICBwdmhfZ2VuICE9 IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlnb3RvIHJlc3Rh cnQ7CisJCQkJfQorCQkJfQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwbWFwX3BkZShwbWFwLCBw di0+cHZfdmEpOworCQkJaWYgKG1vZGlmaWVkKSB7CisJCQkJcnYgPSBwdGVfdGVzdChwdGUsIFBU RV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJCWlmIChhY2Nlc3Nl ZCkKKwkJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCQkgICAgcHRlX2lz X3JlZihwdGUpOworCQkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJCXJ2ID0gcHRlX2lzX3Zh bGlkKHB0ZSkgJiYKKwkJCQkgICAgcHRlX2lzX3JlZihwdGUpOworCQkJfQorCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQlpZiAocnYpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcndf cnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAo cnYpOworfQorCisKKy8qCisgKglwbWFwX2lzX21vZGlmaWVkOgorICoKKyAqCVJldHVybiB3aGV0 aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2Ugd2FzIG1vZGlmaWVkCisgKglp biBhbnkgcGh5c2ljYWwgbWFwcy4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX21vZGlmaWVkKHZt X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g MCwKKwkgICAgKCJwbWFwX2lzX21vZGlmaWVkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkp OworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQ R0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIGNvbmN1cnJlbnRseSBzZXQgd2hpbGUgdGhlIG9i amVjdCBpcyBsb2NrZWQuICBUaHVzLCBpZiBQR0FfV1JJVEVBQkxFCisJICogaXMgY2xlYXIsIG5v IFBURXMgY2FuIGhhdmUgUFRFX0Qgc2V0LgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tF RChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQ R0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKwlyZXR1cm4gKHBtYXBfcGFn ZV90ZXN0X21hcHBpbmdzKG0sIEZBTFNFLCBUUlVFKSk7Cit9CisKKy8qCisgKglwbWFwX2lzX3By ZWZhdWx0YWJsZToKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCB2 aXJ0dWFsIGFkZHJlc3MgaXMgZWxnaWJsZQorICoJZm9yIHByZWZhdWx0LgorICovCitib29sZWFu X3QKK3BtYXBfaXNfcHJlZmF1bHRhYmxlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyKQor eworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IHJ2Owor CisJcnYgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwg YWRkcik7CisJaWYgKHBkZSAhPSBOVUxMICYmICpwZGUgIT0gMCkgeworCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKwkJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIGFkZHIpOworCQlydiA9ICgqcHRlID09IDApIHx8 ICgqcHRlID09IFBURV9HKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIChydik7 Cit9CisKKy8qCisgKglwbWFwX2lzX3JlZmVyZW5jZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIg b3Igbm90IHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3YXMgcmVmZXJlbmNlZAorICoJaW4g YW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19yZWZlcmVuY2VkKHZt X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g MCwKKwkgICAgKCJwbWFwX2lzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBt KSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBUUlVFLCBGQUxTRSkpOwor fQorCisvKgorICoJQXBwbHkgdGhlIGdpdmVuIGFkdmljZSB0byB0aGUgc3BlY2lmaWVkIHJhbmdl IG9mIGFkZHJlc3NlcyB3aXRoaW4gdGhlCisgKglnaXZlbiBwbWFwLiAgRGVwZW5kaW5nIG9uIHRo ZSBhZHZpY2UsIGNsZWFyIHRoZSByZWZlcmVuY2VkIGFuZC9vcgorICoJbW9kaWZpZWQgZmxhZ3Mg aW4gZWFjaCBtYXBwaW5nIGFuZCBzZXQgdGhlIG1hcHBlZCBwYWdlJ3MgZGlydHkgZmllbGQuCisg Ki8KK3ZvaWQKK3BtYXBfYWR2aXNlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29m ZnNldF90IGV2YSwgaW50IGFkdmljZSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2Vu dHJ5X3QgKnBkZSwgKnBkcGUsIG9sZHBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0 X3QgdmFfbmV4dDsKKwl2bV9wYWdlX3QgbTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlz dHNfbG9ja2VkOworCisJaWYgKGFkdmljZSAhPSBNQURWX0RPTlRORUVEICYmIGFkdmljZSAhPSBN QURWX0ZSRUUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1l OgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8 IGV2YTsgc3ZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsK KwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01B U0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGlu dWU7CisJCX0KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZh X25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXBkZSA9IHBtYXBfcGRwZV90b19w ZGUocGRwZSwgc3ZhKTsKKwkJb2xkcGRlID0gKnBkZTsKKwkJaWYgKHBkZSA9PSBOVUxMIHx8ICpw ZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk ZSkpIHsKKwkJCWlmICghcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp bnVlOworCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJCQlwdl9saXN0c19sb2NrZWQgPSBU UlVFOworCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spKSB7CisJCQkJCWlm IChhbnljaGFuZ2VkKQorCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQkJUE1B UF9VTkxPQ0socG1hcCk7CisJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQln b3RvIHJlc3VtZTsKKwkJCQl9CisJCQl9CisJCQlsb2NrID0gTlVMTDsKKwkJCWlmICghcG1hcF9k ZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwgJmxvY2spKSB7CisJCQkJaWYgKGxvY2sg IT0gTlVMTCkKKwkJCQkJcndfd3VubG9jayhsb2NrKTsKKworCQkJCS8qCisJCQkJICogVGhlIHN1 cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJICovCisJCQkJY29udGludWU7CisJ CQl9CisKKwkJCS8qCisJCQkgKiBVbmxlc3MgdGhlIHBhZ2UgbWFwcGluZ3MgYXJlIHdpcmVkLCBy ZW1vdmUgdGhlCisJCQkgKiBtYXBwaW5nIHRvIGEgc2luZ2xlIHBhZ2Ugc28gdGhhdCBhIHN1YnNl cXVlbnQKKwkJCSAqIGFjY2VzcyBtYXkgcmVwcm9tb3RlLiAgU2luY2UgdGhlIHVuZGVybHlpbmcg cGFnZQorCQkJICogdGFibGUgcGFnZSBpcyBmdWxseSBwb3B1bGF0ZWQsIHRoaXMgcmVtb3ZhbCBu ZXZlcgorCQkJICogZnJlZXMgYSBwYWdlIHRhYmxlIHBhZ2UuCisJCQkgKi8KKwkJCWlmICghcGRl X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg c3ZhKTsKKwkJCQlLQVNTRVJUKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKKwkJCQkgICAgKCJw bWFwX2FkdmlzZTogaW52YWxpZCBQVEUiKSk7CisJCQkJcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0 ZSwgc3ZhLCAqcGRlLCBOVUxMLAorCQkJCSAgICAmbG9jayk7CisJCQkJYW55Y2hhbmdlZCA9IFRS VUU7CisJCQl9CisJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJ CX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZh IHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8g dGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8K KwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCWZvciAocHRlID0g cG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAorCQkgICAg c3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCAhcHRlX3Rl c3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQllbHNlIGlmIChwdGVfdGVz dChwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCQlp ZiAoYWR2aWNlID09IE1BRFZfRE9OVE5FRUQpIHsKKwkJCQkJLyoKKwkJCQkJICogRnV0dXJlIGNh bGxzIHRvIHBtYXBfaXNfbW9kaWZpZWQoKQorCQkJCQkgKiBjYW4gYmUgYXZvaWRlZCBieSBtYWtp bmcgdGhlIHBhZ2UKKwkJCQkJICogZGlydHkgbm93LgorCQkJCQkgKi8KKwkJCQkJbSA9IFBIWVNf VE9fVk1fUEFHRSgKKwkJCQkJICAgIFRMQkxPX1BURV9UT19QQSgqcHRlKSk7CisJCQkJCXZtX3Bh Z2VfZGlydHkobSk7CisJCQkJfQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCB8IFBU RV9SRUYpOworCQkJfSBlbHNlIGlmIChwdGVfaXNfcmVmKHB0ZSkpCisJCQkJcHRlX2F0b21pY19j bGVhcihwdGUsIFBURV9SRUYpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHB0ZV90 ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHN2YSk7CisJ CQllbHNlCisJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCX0KKwl9CisJaWYgKGFueWNoYW5nZWQp CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkgewor CQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFwKTsK K30KKworLyoKKyAqCUNsZWFyIHRoZSBtb2RpZnkgYml0cyBvbiB0aGUgc3BlY2lmaWVkIHBoeXNp Y2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfY2xlYXJfbW9kaWZ5KHZtX3BhZ2VfdCBtKQorewor CXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcG1hcF90IHBtYXA7CisJcHZfZW50cnlfdCBuZXh0X3B2 LCBwdjsKKwlwZF9lbnRyeV90IG9sZHBkZSwgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwgKnB0 ZTsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhOworCWludCBtZF9nZW4s IHB2aF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAor CSAgICAoInBtYXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChtLT5vYmplY3QpOworCUtBU1NFUlQoIXZtX3BhZ2Vf eGJ1c2llZChtKSwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAlcCBpcyBleGNsdXNp dmUgYnVzaWVkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgUEdBX1dSSVRF QUJMRSwgdGhlbiBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKiBJZiB0aGUgb2JqZWN0 IGNvbnRhaW5pbmcgdGhlIHBhZ2UgaXMgbG9ja2VkIGFuZCB0aGUgcGFnZSBpcyBub3QKKwkgKiB3 cml0ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUgY29uY3VycmVudGx5IHNl dC4KKwkgKi8KKwlpZiAoKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJCXJldHVy bjsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwlyd19ybG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndf d2xvY2sobG9jayk7CityZXN0YXJ0OgorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAh PSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwdiwgJnB2 aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJ CWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJ CQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9j ayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBt YXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsKKwkJ cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlvbGRwZGUgPSAqcGRlOworCQlpZiAoIXBkZV90 ZXN0KHBkZSwgUFRFX1JPKSkgeworCQkJaWYgKHBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwg cGRlLCB2YSwgJmxvY2spKSB7CisJCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykpIHsK KwkJCQkJLyoKKwkJCQkJICogV3JpdGUgcHJvdGVjdCB0aGUgbWFwcGluZyB0byBhCisJCQkJCSAq IHNpbmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkJCSAqIHdyaXRlIGFjY2VzcyBt YXkgcmVwcm9tb3RlLgorCQkJCQkgKi8KKwkJCQkJdmEgKz0gVk1fUEFHRV9UT19QSFlTKG0pIC0K KwkJCQkJICAgVExCTE9fUERFX1RPX1BBKG9sZHBkZSk7CisJCQkJCXB0ZSA9IHBtYXBfcGRlX3Rv X3B0ZShwZGUsIHZhKTsKKwkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQkJaWYgKCFwdGVfdGVzdCgm b2xkcHRlLCBQVEVfVkFMSUQpKSB7CisJCQkJCQl3aGlsZSAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsCisJCQkJCQkgICAgb2xkcHRlLAorCQkJCQkJICAgIChvbGRwdGUgJiB+UFRFX0QpIHwgUFRF X1JPKSkKKwkJCQkJCQlvbGRwdGUgPSAqcHRlOworCQkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJ CQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0K KwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChw dik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9n ZW47CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJ UE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAobWRfZ2VuICE9IG0t Pm1kLnB2X2dlbiB8fCBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0so cG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQl9CisJCXBkZSA9IHBtYXBfcGRlKHBt YXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFw X2NsZWFyX21vZGlmeTogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw diBsaXN0IiwgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwor CQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewor CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl KHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXJ3X3d1 bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworLyoKKyAq IE1pc2NlbGxhbmVvdXMgc3VwcG9ydCByb3V0aW5lcyBmb2xsb3cKKyAqLworCisvKgorICogTWFw IGEgc2V0IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAor ICogYWRkcmVzcyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBtYXBwZWQu IFRoaXMKKyAqIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGluZyBkZXZp Y2UgbWVtb3J5LAorICogTk9UIHJlYWwgbWVtb3J5LgorICoKKyAqIFVzZSBYS1BIWVMgdW5jYWNo ZWQgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitwbWFwX21hcGRldih2bV9wYWRkcl90IHBhLCB2 bV9zaXplX3Qgc2l6ZSkKK3sKKworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNU X1VOQ0FDSEVEKHBhKSk7Cit9CisKK3ZvaWQKK3BtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QgdmEs IHZtX3NpemVfdCBzaXplKQoreworCisJLyogTm90aGluZyB0byBkbyBmb3IgbWlwczY0LiAqLwor fQorCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw YWdlLgorICovCit2b2lkCitwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l bWF0dHJfdCBtYSkKK3sKKwkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBw cm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBwaW5ncyBhcmUgY3Jl YXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgorCSAqIEl0IGlzIGFz c3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGJlZm9yZSBhbnkgbWFwcGlu Z3MKKwkgKiBhcmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRo aXMgZnVuY3Rpb24gd2lsbAorCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZfbGlzdCBhbmQgbWFrZSBl YWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncworCSAqIHVuY2FjaGVhYmxlLCBzeW5jIHRoZSBj YWNoZSAod2l0aCBtaXBzX2ljYWNoZV9zeW5jX2FsbCgpIGFuZAorCSAqIG1pcHNfZGNhY2hlX3di aW52X2FsbCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkg KiBhbnkgb2YgdGhlIGN1cnJlbnQgbWFwcGluZ3MgaXQgbW9kaWZpZXMuCisJICovCisJaWYgKFRB SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQlwYW5pYygiQ2FuJ3QgY2hhbmdl IG1lbWF0dHIgb24gcGFnZSB3aXRoIGV4aXN0aW5nIG1hcHBpbmdzIik7Cit9CisKKy8qCisgKiBw ZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKKyAqLworaW50CitwbWFwX21pbmNvcmUo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3BhZGRyX3QgKmxvY2tlZF9wYSkKK3sK KwlwZF9lbnRyeV90ICpwZGVwOworCXB0X2VudHJ5X3QgKnB0ZXAsIHB0ZTsKKwl2bV9wYWRkcl90 IHBhOworCWludCB2YWw7CisKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1h cF9wZGUocG1hcCwgYWRkcik7CisJaWYgKHBkZXAgIT0gTlVMTCkgeworCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGVwKSkgeworCQkJcHRlID0gKHB0X2VudHJ5X3QpKnBkZXA7CisJCQlwYSA9 IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gTUlOQ09SRV9TVVBFUjsKKwkJfSBlbHNl IHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgYWRkcik7CisJCQlwdGUgPSAocHRl cCAhPSBOVUxMKSA/ICpwdGVwIDogMDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJ CQl2YWwgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJcHRlID0gMDsKKwkJcGEgPSAwOworCQl2YWwg PSAwOworCX0KKwlpZiAocHRlX2lzX3ZhbGlkKCZwdGUpKSB7CisJCXZhbCB8PSBNSU5DT1JFX0lO Q09SRTsKKwkJaWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSkKKwkJCXZhbCB8PSBNSU5DT1JFX01P RElGSUVEIHwgTUlOQ09SRV9NT0RJRklFRF9PVEhFUjsKKwkJaWYgKHB0ZV9pc19yZWYoJnB0ZSkp CisJCQl2YWwgfD0gTUlOQ09SRV9SRUZFUkVOQ0VEIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVS OworCX0KKwlpZiAoKHZhbCAmIChNSU5DT1JFX01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZF UkVOQ0VEX09USEVSKSkgIT0KKwkgICAgKE1JTkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JF X1JFRkVSRU5DRURfT1RIRVIpICYmCisJICAgIHB0ZV90ZXN0KCZwdGUsIFBURV9NQU5BR0VEKSkg eworCQkvKiBFbnN1cmUgdGhhdCAiUEhZU19UT19WTV9QQUdFKHBhKS0+b2JqZWN0IiBkb2Vzbid0 IGNoYW5nZS4gKi8KKwkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHBhLCBsb2NrZWRf cGEpKQorCQkJZ290byByZXRyeTsKKwl9IGVsc2UKKwkJUEFfVU5MT0NLX0NPTkQoKmxvY2tlZF9w YSk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICh2YWwpOworfQorCit2b2lkCitwbWFw X2FjdGl2YXRlKHN0cnVjdCB0aHJlYWQgKnRkKQoreworCXBtYXBfdCBwbWFwLCBvbGRwbWFwOwor CXN0cnVjdCBwcm9jICpwID0gdGQtPnRkX3Byb2M7CisJdV9pbnQgY3B1aWQ7CisKKwljcml0aWNh bF9lbnRlcigpOworCisJcG1hcCA9IHZtc3BhY2VfcG1hcChwLT5wX3Ztc3BhY2UpOworCW9sZHBt YXAgPSBQQ1BVX0dFVChjdXJwbWFwKTsKKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKworCWlm IChvbGRwbWFwKQorCQlDUFVfQ0xSX0FUT01JQyhjcHVpZCwgJm9sZHBtYXAtPnBtX2FjdGl2ZSk7 CisJQ1BVX1NFVF9BVE9NSUMoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpOworCXBtYXBfYXNpZF9h bGxvYyhwbWFwKTsKKwlpZiAodGQgPT0gY3VydGhyZWFkKSB7CisJCVBDUFVfU0VUKHNlZ2Jhc2Us IHBtYXAtPnBtX3NlZ3RhYik7CisJCW1pcHNfd3JfZW50cnloaShwbWFwLT5wbV9hc2lkW2NwdWlk XS5hc2lkKTsKKwl9CisKKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwljcml0aWNhbF9leGl0 KCk7Cit9CisKK3ZvaWQKK3BtYXBfc3luY19pY2FjaGUocG1hcF90IHBtLCB2bV9vZmZzZXRfdCB2 YSwgdm1fc2l6ZV90IHN6KQoreworfQorCisvKgorICoJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZp cnR1YWwgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gbWFwcGluZyBpZiBhCisgKglkaWZmZXJlbnQgYWxp Z25tZW50IG1pZ2h0IHJlc3VsdCBpbiBtb3JlIHN1cGVycGFnZSBtYXBwaW5ncy4KKyAqLwordm9p ZAorcG1hcF9hbGlnbl9zdXBlcnBhZ2Uodm1fb2JqZWN0X3Qgb2JqZWN0LCB2bV9vb2Zmc2V0X3Qg b2Zmc2V0LAorICAgIHZtX29mZnNldF90ICphZGRyLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKwl2bV9v ZmZzZXRfdCBzdXBlcnBhZ2Vfb2Zmc2V0OworCisJaWYgKHNpemUgPCBOQlNFRykKKwkJcmV0dXJu OworCWlmIChvYmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAmIE9CSl9DT0xPUkVEKSAh PSAwKQorCQlvZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsKKwlzdXBlcnBhZ2Vfb2Zm c2V0ID0gb2Zmc2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vf b2Zmc2V0KSAmIFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0g c3VwZXJwYWdlX29mZnNldCkKKwkJcmV0dXJuOworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1 cGVycGFnZV9vZmZzZXQpCisJCSphZGRyID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdl X29mZnNldDsKKwllbHNlCisJCSphZGRyID0gKCgqYWRkciArIFNFR01BU0spICYgflNFR01BU0sp ICsgc3VwZXJwYWdlX29mZnNldDsKK30KKworI2lmZGVmIEREQgorREJfU0hPV19DT01NQU5EKHB0 YWJsZSwgZGRiX3BpZF9kdW1wKQoreworCXBtYXBfdCBwbWFwOworCXN0cnVjdCB0aHJlYWQgKnRk ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvYyAqcDsKKwlpbnQgaSwgaiwgazsKKwl2bV9wYWRkcl90IHBh OworCXZtX29mZnNldF90IHZhOworCisJaWYgKGhhdmVfYWRkcikgeworCQl0ZCA9IGRiX2xvb2t1 cF90aHJlYWQoYWRkciwgVFJVRSk7CisJCWlmICh0ZCA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYo IkludmFsaWQgcGlkIG9yIHRpZCIpOworCQkJcmV0dXJuOworCQl9CisJCXAgPSB0ZC0+dGRfcHJv YzsKKwkJaWYgKHAtPnBfdm1zcGFjZSA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYoIk5vIHZtc3Bh Y2UgZm9yIHByb2Nlc3MiKTsKKwkJCXJldHVybjsKKwkJfQorCQkJcG1hcCA9IHZtc3BhY2VfcG1h cChwLT5wX3Ztc3BhY2UpOworCX0gZWxzZQorCQlwbWFwID0ga2VybmVsX3BtYXA7CisKKwlkYl9w cmludGYoInBtYXA6JXAgc2VndGFiOiVwIGFzaWQ6JXggZ2VuZXJhdGlvbjoleFxuIiwKKwkgICAg cG1hcCwgcG1hcC0+cG1fc2VndGFiLCBwbWFwLT5wbV9hc2lkWzBdLmFzaWQsCisJICAgIHBtYXAt PnBtX2FzaWRbMF0uZ2VuKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRf ZW50cnlfdCAqcGRwZTsKKwkJcHRfZW50cnlfdCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKKwor CQlwZHBlID0gKHBkX2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09 IE5VTEwpCisJCQljb250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7 CisJCWZvciAoaiA9IDA7IGogPCBOUERFUEc7IGorKykgeworCQkJcGRlID0gKHB0X2VudHJ5X3Qg KilwZHBlW2pdOworCQkJaWYgKHBkZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGJfcHJp bnRmKCJcdFslNGRdICVwXG4iLCBqLCBwZGUpOworCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsg aysrKSB7CisJCQkJcHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX2lzX3Zh bGlkKCZwdGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUp OworCQkJCXZhID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAo ayA8PCBQQUdFX1NISUZUKTsKKwkJCQlkYl9wcmludGYoIlx0XHRbJTA0ZF0gdmE6ICVwIHB0ZTog JThqeCBwYTolanhcbiIsCisJCQkJICAgICAgIGssICh2b2lkICopdmEsICh1aW50bWF4X3QpcHRl LCAodWludG1heF90KXBhKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5l ZChERUJVRykKKworc3RhdGljIHZvaWQgcGFkcyhwbWFwX3QgcG0pOwordm9pZCBwbWFwX3B2ZHVt cCh2bV9vZmZzZXRfdCBwYSk7CisKKy8qIHByaW50IGFkZHJlc3Mgc3BhY2Ugb2YgcG1hcCovCitz dGF0aWMgdm9pZAorcGFkcyhwbWFwX3QgcG0pCit7CisJdW5zaWduZWQgdmEsIGksIGo7CisJcHRf ZW50cnlfdCAqcHRlcDsKKworCWlmIChwbSA9PSBrZXJuZWxfcG1hcCkKKwkJcmV0dXJuOworCWZv ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJaWYgKHBtLT5wbV9zZWd0YWJbaV0pCisJCQlm b3IgKGogPSAwOyBqIDwgTlBURVBHOyBqKyspIHsKKwkJCQl2YSA9IChpIDw8IFNFR1NISUZUKSAr IChqIDw8IFBBR0VfU0hJRlQpOworCQkJCWlmIChwbSA9PSBrZXJuZWxfcG1hcCAmJiB2YSA8IEtF Uk5CQVNFKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG0gIT0ga2VybmVsX3BtYXAgJiYKKwkJ CQkgICAgdmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGVw ID0gcG1hcF9wdGUocG0sIHZhKTsKKwkJCQlpZiAocHRlX2lzX3ZhbGlkKHB0ZXApKQorCQkJCQlw cmludGYoIiV4OiV4ICIsIHZhLCAqKGludCAqKXB0ZXApOworCQkJfQorCit9CisKK3ZvaWQKK3Bt YXBfcHZkdW1wKHZtX29mZnNldF90IHBhKQoreworCXJlZ2lzdGVyIHB2X2VudHJ5X3QgcHY7CisJ dm1fcGFnZV90IG07CisKKwlwcmludGYoInBhICV4IiwgcGEpOworCW0gPSBQSFlTX1RPX1ZNX1BB R0UocGEpOworCWZvciAocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OworCSAg ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCXByaW50ZigiIC0+IHBtYXAgJXAs IHZhICV4IiwgKHZvaWQgKilwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJcGFkcyhwdi0+cHZf cG1hcCk7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBOL0MgKi8KKyNlbmRpZgorCisKKy8q CisgKiBBbGxvY2F0ZSBUTEIgYWRkcmVzcyBzcGFjZSB0YWcgKGNhbGxlZCBBU0lEIG9yIFRMQlBJ RCkgYW5kIHJldHVybiBpdC4KKyAqIEl0IHRha2VzIGFsbW9zdCBhcyBtdWNoIG9yIG1vcmUgdGlt ZSB0byBzZWFyY2ggdGhlIFRMQiBmb3IgYQorICogc3BlY2lmaWMgQVNJRCBhbmQgZmx1c2ggdGhv c2UgZW50cmllcyBhcyBpdCBkb2VzIHRvIGZsdXNoIHRoZSBlbnRpcmUgVExCLgorICogVGhlcmVm b3JlLCB3aGVuIHdlIGFsbG9jYXRlIGEgbmV3IEFTSUQsIHdlIGp1c3QgdGFrZSB0aGUgbmV4dCBu dW1iZXIuIFdoZW4KKyAqIHdlIHJ1biBvdXQgb2YgbnVtYmVycywgd2UgZmx1c2ggdGhlIFRMQiwg aW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGNvdW50CisgKiBhbmQgc3RhcnQgb3Zlci4gQVNJRCB6 ZXJvIGlzIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9h c2lkX2FsbG9jKHBtYXApCisJcG1hcF90IHBtYXA7Cit7CisJaWYgKHBtYXAtPnBtX2FzaWRbUENQ VV9HRVQoY3B1aWQpXS5hc2lkICE9IFBNQVBfQVNJRF9SRVNFUlZFRCAmJgorCSAgICBwbWFwLT5w bV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID09IFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikp OworCWVsc2UgeworCQlpZiAoUENQVV9HRVQobmV4dF9hc2lkKSA9PSBwbWFwX21heF9hc2lkKSB7 CisJCQl0bGJfaW52YWxpZGF0ZV9hbGxfdXNlcihOVUxMKTsKKwkJCVBDUFVfU0VUKGFzaWRfZ2Vu ZXJhdGlvbiwKKwkJCSAgICAoUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSArIDEpICYgQVNJREdF Tl9NQVNLKTsKKwkJCWlmIChQQ1BVX0dFVChhc2lkX2dlbmVyYXRpb24pID09IDApIHsKKwkJCQlQ Q1BVX1NFVChhc2lkX2dlbmVyYXRpb24sIDEpOworCQkJfQorCQkJUENQVV9TRVQobmV4dF9hc2lk LCAxKTsJLyogMCBtZWFucyBpbnZhbGlkICovCisJCX0KKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dF VChjcHVpZCldLmFzaWQgPSBQQ1BVX0dFVChuZXh0X2FzaWQpOworCQlwbWFwLT5wbV9hc2lkW1BD UFVfR0VUKGNwdWlkKV0uZ2VuID0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKTsKKwkJUENQVV9T RVQobmV4dF9hc2lkLCBQQ1BVX0dFVChuZXh0X2FzaWQpICsgMSk7CisJfQorfQorCitzdGF0aWMg cHRfZW50cnlfdAoraW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vzcywg dm1fcHJvdF90IHByb3QpCit7CisJcHRfZW50cnlfdCBydzsKKworCWlmICghKHByb3QgJiBWTV9Q Uk9UX1dSSVRFKSkKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CisJZWxzZSBpZiAoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKwkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dS SVRFKSAhPSAwKQorCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJZWxzZQorCQkJcncgPSBQ VEVfVkFMSUQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTmVlZG4ndCBlbXVsYXRlIGEgcmVmZXJl bmNlL21vZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkCisJCSAqIHBhZ2VzLgorCQkgKi8KKwkJcncg PSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJcHRlX3JlZl9zZXQoJnJ3KTsKKwl9CisKKwlyZXR1cm4g KHJ3KTsKK30KKworLyoKKyAqIHBtYXBfZW11bGF0ZV9tb2RpZmllZCA6IGRvIGRpcnR5IGJpdCBl bXVsYXRpb24KKyAqCisgKiBPbiBTTVAsIHVwZGF0ZSBqdXN0IHRoZSBsb2NhbCBUTEIsIG90aGVy IENQVXMgd2lsbCB1cGRhdGUgdGhlaXIKKyAqIFRMQnMgZnJvbSBQVEUgbGF6aWx5LCBpZiB0aGV5 IGdldCB0aGUgZXhjZXB0aW9uLgorICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjZXNzLCAxIGlm IHRoZSBwYWdlIGlzIHJlYWQgb25seSBhbmQgd2UKKyAqIG5lZWQgdG8gZmF1bHQuCisgKi8KK2lu dAorcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sK KwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLKHBtYXAp OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShw ZGUpKQorCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwllbHNlCisJCXB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRlID09IE5VTEwpCisJCXBhbmljKCJwbWFwX2VtdWxh dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CisjaWZkZWYgU01QCisJLyogSXQgaXMgcG9z c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCisJaWYgKCFwdGVfaXNf dmFsaWQocHRlKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAs IHZhLCAqcHRlKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2Vs c2UKKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CisJ CXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0 dXJuICgwKTsKKwl9CisjZW5kaWYKKwlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCVBN QVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDEpOworCX0KKwlwdGVfYXRvbWljX3NldChwdGUs IFBURV9EKTsgLyogbWFyayBpdCByZWZlcmVuY2VkIGFuZCBtb2RpZmllZCAqLworCXB0ZV9yZWZf YXRvbWljX3NldChwdGUpOworCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCWlmICghcHRl X3Rlc3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6 IHVubWFuYWdlZCBwYWdlIik7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgwKTsKK30K KworLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkOiBkbyByZWZlcmVuY2UgYml0IGVtdWxh dGlvbgorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuICBSZXR1cm5zIDEgaWYg d2UgbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFw X3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5 X3QgKnB0ZTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJcmV0dXJuICgxKTsKKwlQ TUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0g TlVMTCB8fCAqcGRlID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIGRpcmVjdG9yeS4gKi8K KwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJ CXB0ZSA9IChwdF9lbnRyeV90ICopcGRlOworCX0gZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19w dGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBOVUxMKSB7CisJCS8qIEludmFsaWQgcGFnZSB0YWJs ZS4gKi8KKwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpKSB7CisJ CS8qIEludmFsaWQgUFRFLiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQorCS8qIENoZWNrIHRvIHNl ZSBpZiBhbHJlYWR5IG1hcmtlZCBieSBvdGhlciBDUFUuICAqLworCWlmICghcHRlX2lzX3JlZihw dGUpKQorCQlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKworCXRsYl91cGRhdGUocG1hcCwgdmEs ICpwdGUpOworCVBNQVBfVU5MT0NLKHBtYXApOworCisJcmV0dXJuICgwKTsKKworZG9mYXVsdDoK KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitwbWFwX2ZsdXNo X3B2Y2FjaGUodm1fcGFnZV90IG0pCit7CisJcHZfZW50cnlfdCBwdjsKKworCWlmIChtICE9IE5V TEwpIHsKKwkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJCSAg ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25leHQpKSB7CisJCQltaXBzX2RjYWNoZV93Ymludl9y YW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQg YS9zeXMvbWlwcy9taXBzL3BtYXAuYyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCi0tLSBhL3N5cy9t aXBzL21pcHMvcG1hcC5jCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCkBAIC0yMzIsNyArMjMy LDcgQEAKIAlzeXNtID0gJnN5c21hcF9sbWVtW2NwdV07CiAJc3lzbS0+c2F2ZWRfaW50ciA9IGlu dHI7CiAJdmEgPSBzeXNtLT5iYXNlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQ VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f UEZOKHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJKnB0ZSA9IG5wdGU7CiAJc3lzbS0+dmFs aWQxID0gMTsKQEAgLTI1NCwxMCArMjU0LDEwIEBACiAJc3lzbS0+c2F2ZWRfaW50ciA9IGludHI7 CiAJdmExID0gc3lzbS0+YmFzZTsKIAl2YTIgPSBzeXNtLT5iYXNlICsgUEFHRV9TSVpFOwotCW5w dGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9W IHwgUFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19DQUNIRSB8 IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhMSk7CiAJKnB0ZSA9IG5wdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMikgfCBQ VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f UEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlw dGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEyKTsKIAkqcHRlID0gbnB0ZTsKIAlzeXNtLT52 YWxpZDEgPSAxOwpAQCAtNTU2LDkgKzU1NiwxNSBAQAogCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNn YnVmc2l6ZSk7CiAKIAkvKgotCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLgorCSAqIFN0ZWFsIHRo cmVhZDAga3N0YWNrLiAgVGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0Vf U0laRSAqIDIpIHNvIGl0IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJ ICogWFhYIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgb2YgZ2V0dGluZyBhbGlnbmVkIG1l bW9yeQorCSAqIHdpdGggcG1hcF9zdGVhbF9tZW1vcnkoKS4KIAkgKi8KLQlrc3RhY2swID0gcG1h cF9zdGVhbF9tZW1vcnkoS1NUQUNLX1BBR0VTIDw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSBw bWFwX3N0ZWFsX21lbW9yeSgoS1NUQUNLX1BBR0VTICsgS1NUQUNLX0dVQVJEX1BBR0VTKSBcCisJ CQkJCTw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNL X1BBR0VfU0laRSAqIDIpKTsKIAogCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJF U1M7CiAJdmlydHVhbF9lbmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CkBAIC02MDUsNiArNjEx LDcgQEAKIAogCVRBSUxRX0lOSVQoJm0tPm1kLnB2X2xpc3QpOwogCW0tPm1kLnB2X2ZsYWdzID0g MDsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOwogfQogCiAvKgpAQCAt ODAxLDcgKzgwOCw3IEBACiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKIAlpZiAocHRlcCAh PSBOVUxMKSB7CiAJCXB0ZSA9ICpwdGVwOwotCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1YpICYm ICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAorCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1ZB TElEKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKIAkJICAgIChwcm90ICYgVk1fUFJP VF9XUklURSkgPT0gMCkpIHsKIAkJCXB0ZV9wYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJ aWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwgJnBhKSkKQEAgLTgzNCw5ICs4 NDEsOSBAQAogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAlvcHRlID0gKnB0 ZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGF0dHIgfCBQVEVfRCB8IFBURV9WIHwg UFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf VkFMSUQgfCBQVEVfRzsKIAkqcHRlID0gbnB0ZTsKLQlpZiAocHRlX3Rlc3QoJm9wdGUsIFBURV9W KSAmJiBvcHRlICE9IG5wdGUpCisJaWYgKHB0ZV90ZXN0KCZvcHRlLCBQVEVfVkFMSUQpICYmIG9w dGUgIT0gbnB0ZSkKIAkJcG1hcF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOwog fQogCkBAIC0xNDQ5LDcgKzE0NTYsNyBAQAogCQkJCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RB QkxFX1JFRikKIAkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOwogCQkJ CW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0 LCBwdiwgcHZfbmV4dCk7CiAJCQkJaWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJ CQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwYy0+cGNfbWFw W2ZpZWxkXSB8PSAxVUwgPDwgYml0OwpAQCAtMTYyNyw5ICsxNjM0LDkgQEAKIAlwdl9lbnRyeV90 IHB2OwogCiAJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxR X0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2 LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCWlmIChwbWFwID09IFBWX1BNQVAocHYpICYm IHZhID09IHB2LT5wdl92YSkgewotCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBw dl9saXN0KTsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJ CQlicmVhazsKIAkJfQogCX0KQEAgLTE2NzEsNyArMTY3OCw3IEBACiAJUE1BUF9MT0NLX0FTU0VS VChwbWFwLCBNQV9PV05FRCk7CiAJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBUUlVFKSkg IT0gTlVMTCkgewogCQlwdi0+cHZfdmEgPSB2YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1k LnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xp c3QsIHB2LCBwdl9uZXh0KTsKIAkJcmV0dXJuIChUUlVFKTsKIAl9IGVsc2UKIAkJcmV0dXJuIChG QUxTRSk7CkBAIC0xNzQ0LDcgKzE3NTEsNyBAQAogCS8qCiAJICogSWYgdGhlcmUgaXMgbm8gcHRl IGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKIAkgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0 cSwgUFRFX1YpKQorCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVkFMSUQpKQogCQlyZXR1cm47CiAK IAkodm9pZClwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRxLCB2YSwgKnBkZSk7CkBAIC0xODEwLDcg KzE4MTcsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0la RSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkgeworCQkJaWYgKCFwdGVfdGVzdChw dGUsIFBURV9WQUxJRCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2lu dmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTE4 NjgsNyArMTg3NSw3IEBACiAJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg Y2FjaGVzIGZyb20gCiAJCSAqIHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAogCSAJICovCi0JCWlm IChUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSA9PSBOVUxMKQorCQlpZiAoVEFJTFFfTkVYVChwdiwg cHZfbmV4dCkgPT0gTlVMTCkKIAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5w dl92YSwgUEFHRV9TSVpFKTsKIAogCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwpA QCAtMTg5Nyw3ICsxOTA0LDcgQEAKIAkJfQogCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBw di0+cHZfdmEpOwogCi0JCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3Qp OworCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJcG1hcF91 bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwogCQlmcmVlX3B2X2VudHJ5KHBtYXAsIHB2 KTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CkBAIC0xOTU5LDcgKzE5NjYsNyBAQAogCQlmb3IgKHB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKIAkJCXBiaXRzID0gKnB0ZTsKLQkJCWlmICghcHRlX3Rl c3QoJnBiaXRzLCBQVEVfVikgfHwgcHRlX3Rlc3QoJnBiaXRzLAorCQkJaWYgKCFwdGVfdGVzdCgm cGJpdHMsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QoJnBiaXRzLAogCQkJICAgIFBURV9STykpIHsK IAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1h cCwgdmEsIHN2YSk7CkBAIC0yMDcxLDcgKzIwNzgsNyBAQAogCS8qCiAJICogTWFwcGluZyBoYXMg bm90IGNoYW5nZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgogCSAqLwot CWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpICYmIG9wYSA9PSBwYSkgeworCWlmIChwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX1ZBTElEKSAmJiBvcGEgPT0gcGEpIHsKIAkJLyoKIAkJICogV2ly aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CiAJCSAq IHdpcmluZyBQVCBwYWdlcyBhcyB0aGV5IHJlbWFpbiByZXNpZGVudCBhcyBsb25nIGFzIHRoZXJl CkBAIC0yMTM1LDcgKzIxNDIsNyBAQAogCQlpZiAocHYgPT0gTlVMTCkKIAkJCXB2ID0gZ2V0X3B2 X2VudHJ5KHBtYXAsIEZBTFNFKTsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKIAkJ aWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfUk8pKQogCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwg UEdBX1dSSVRFQUJMRSk7CkBAIC0yMTYwLDcgKzIxNjcsNyBAQAogCSAqLwogCWlmIChvcmlncHRl ICE9IG5ld3B0ZSkgewogCQkqcHRlID0gbmV3cHRlOwotCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUs IFBURV9WKSkgeworCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkpIHsKIAkJCWlm IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpICYmIG9wYSAhPSBwYSkgewogCQkJCWlm IChvbS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0 KG9tLCBQR0FfUkVGRVJFTkNFRCk7CkBAIC0yMjY4LDcgKzIyNzUsNyBAQAogCX0KIAogCXB0ZSA9 IHBtYXBfcHRlKHBtYXAsIHZhKTsKLQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwlpZiAo cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCWlmIChtcHRlICE9IE5VTEwpIHsKIAkJCW1w dGUtPndpcmVfY291bnQtLTsKIAkJCW1wdGUgPSBOVUxMOwpAQCAtMjI5OCw3ICsyMzA1LDcgQEAK IAkvKgogCSAqIE5vdyB2YWxpZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlvbgogCSAqLwot CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1Y7CisJKnB0ZSA9IFBU RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQ7CiAJaWYgKChtLT5vZmxhZ3Mg JiBWUE9fVU5NQU5BR0VEKSA9PSAwKQogCQkqcHRlIHw9IFBURV9NQU5BR0VEOwogCkBAIC0yMzU2 LDcgKzIzNjMsNyBAQAogCQljcHUgPSBQQ1BVX0dFVChjcHVpZCk7CiAJCXN5c20gPSAmc3lzbWFw X2xtZW1bY3B1XTsKIAkJLyogU2luY2UgdGhpcyBpcyBmb3IgdGhlIGRlYnVnZ2VyLCBubyBsb2Nr cyBvciBhbnkgb3RoZXIgZnVuICovCi0JCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRF X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwKKwkJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkg fCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwKIAkJICAgIFBURV9HOwogCQlwdGUg PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CiAJCSpwdGUgPSBucHRlOwpAQCAt MjQ4NCw3ICsyNDkxLDcgQEAKIAkJCXZhX25leHQgPSBldmE7CiAJCWZvciAocHRlID0gcG1hcF9w ZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9 IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCWlmICghcHRl X3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFwdGVfdGVzdChw dGUsIFBURV9XKSkKIAkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1pc3Npbmcg UEdfVyIsCkBAIC0yNzE5LDcgKzI3MjYsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNfcXVp Y2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193bG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg cHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7 CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVhazsK QEAgLTI3MzMsNiArMjc0MCwxNiBAQAogfQogCiAvKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBn aXZlbiBwYWdlIGlzIG1hcHBlZC4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfaXNfbWFwcGVk KHZtX3BhZ2VfdCBtKQoreworCisJCXJldHVybiAoIVRBSUxRX0VNUFRZKCYobSktPm1kLnB2X2xp c3QpKTsKK30KKworLyoKICAqIFJlbW92ZSBhbGwgcGFnZXMgZnJvbSBzcGVjaWZpZWQgYWRkcmVz cyBzcGFjZQogICogdGhpcyBhaWRzIHByb2Nlc3MgZXhpdCBzcGVlZHMuICBBbHNvLCB0aGlzIGNv ZGUKICAqIGlzIHNwZWNpYWwgY2FzZWQgZm9yIGN1cnJlbnQgcHJvY2VzcyBvbmx5LCBidXQKQEAg LTI3NzIsNyArMjc4OSw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAs CiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBwbWFwX3Bk ZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikp CisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJwbWFwX3Jl bW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAyLDcgKzI4 MTksNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVsZF0gfD0g Yml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJCVRBSUxR X1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgm bS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQu cHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJ CQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3ICsyODUw LDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf V0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsK KwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlwbWFwID0g UFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUocG1hcCwg cHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg4MCw3IEBACiAJaWYgKChtLT5vZmxhZ3MgJiBWUE9f VU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgewor CVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQ Vl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBw di0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkxNCwxMSBAQAogCWlmICghdm1fcGFnZV94YnVzaWVk KG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJcndf d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4 dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVf dGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVzdChwdGUs IFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikpOwogCQlw Yml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAtMzA0MCw3 ICszMDU3LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0 ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQQUdFX1NJ WkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkgeworCQkJ aWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2 YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3Zh KTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTIzLDcgQEAKIAlpZiAoKG0tPmFm bGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2ds b2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkg eworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAg PSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFw LCBwdi0+cHZfdmEpOwpAQCAtMzE5NCw2ICszMjExLDMxIEBACiB9CiAKIC8qCisgKiBTZXRzIHRo ZSBtZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3Bt YXBfcGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCisJ CS8qCisJCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBh cmUgc2V0IGluIHRoZQorCQkgKiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJCSAqLwor CQltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0 IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCQkgKiBh cmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRoaXMgZnVuY3Rp b24gd2lsbAorCQkgKiBuZWVkIHRvIHdhbGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0 aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3 aXRoIG1pcHNfaWNhY2hlX3N5bmNfYWxsKCkgYW5kCisJCSAqIG1pcHNfZGNhY2hlX3diaW52X2Fs bCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkJICogYW55 IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0IG1vZGlmaWVzLgorCQkgKi8KKwkJaWYgKFRBSUxR X0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQkJCXBhbmljKCJDYW4ndCBjaGFuZ2Ug bWVtYXR0ciBvbiBwYWdlIHdpdGggZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKICAqIHBl cmZvcm0gdGhlIHBtYXAgd29yayBmb3IgbWluY29yZQogICovCiBpbnQKQEAgLTMyMDgsNyArMzI1 MCw3IEBACiByZXRyeToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0 ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsK KwlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBv dXQ7CiAJfQpAQCAtMzM0NSw3ICszMzg3LDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8 IE5QVEVQRzsgaysrKSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAh cHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0 ZSwgUFRFX1ZBTElEKSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKIAkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQp IHwgKGsgPDwgUEFHRV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDM1LDE1IEBACiAJcHRfZW50cnlf dCBydzsKIAogCWlmICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBU RV9STzsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAm IFZQT19VTk1BTkFHRUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAh PSAwKQotCQkJcncgPSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsK IAkJZWxzZQotCQkJcncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkv KiBOZWVkbid0IGVtdWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8K LQkJcncgPSBQVEVfViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVy biAocncpOwogfQogCkBAIC0zNDI0LDEzICszNDY2LDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxh dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9z c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVz dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3Qo cHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUo cG1hcCwgdmEsICpwdGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9 CiAjZWxzZQotCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpCisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpCiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5k aWYKIAlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0ODgsMTggQEAK IH0KIAogLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJp dCBlbXVsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24u CisgKi8KK2ludAorcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhKQoreworCisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tl eHRyYWN0CiAgKglGdW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJl c3MgYXNzb2NpYXRlZApAQCAtMzUyMiw3ICszNTc2LDcgQEAKIAogCWlmIChtICE9IE5VTEwpIHsK IAkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9 IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2 X25leHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBB R0VfU0laRSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21h Y2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBz L21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFj aGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVqeCBpcyBOVUxMIiwgKHVp bnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspIHsKLQkJCWlmIChw dGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNfdmFsaWQoJnB0ZVtpXSkp IHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJCWlmIChpc19kdW1wYWJs ZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBz L21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpAQCAtMjgzLDkgKzI4Myw5 IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFkMCk7CiAKLQlLQVNTRVJU KChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQg b24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3RhY2swKSk7CisJS0FTU0VS VCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkpID09IDAsCisJCSgia3N0 YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91bmRhcnk6IDB4JTBseCIs CisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtzdGFjazApKTsKIAl0aHJl YWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3RhY2tfcGFnZXMgPSBLU1RB Q0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBXZSB1c2UgYSB3aXJlZCB0 bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAqLwogCXBhID0gdnRvcGh5 cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKKwlw dGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOwog CXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZzZXRfdClwY3B1cCwKIAkJ CSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSArIFBB R0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jIGIv c3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwor KysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsxMDIsOSBAQAogQVNTWU0o VERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1BWENPTUxFTiwgTUFYQ09N TEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQpOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBLU1RBQ0tfVExCTUFTS19N QVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBNSVBTX0tTRUcwX1NUQVJU KTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RBUlQpOwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK LS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMvbWlwcy9taXBzL2V4Y2Vw dGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlOVFJDTlRfQ09VTlQJMjU2 CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNlcHRpb25zOgorICoKKyAq IEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCBm YXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgYnJhbmNo IGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBvaW50IHRvIHRoZSBicmFu Y2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUg Y2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gYW5k IHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgorICogVGhlIHN0YXR1cyBy ZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBDUFUg c3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1cHQgZW5hYmxlIGJpdC4K KyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhlIHZpcnR1YWwgYWRkcmVz cyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgorICogVGhlIENvbnRleHQg cmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhlIFZQTiAoc3RhcnRpbmcg YXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlvbiBleGNlcHQgYml0MCBh bmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRzIDIzIHRvIDMxIGZvciBN SVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAqIGtlcm5lbCBjb250cm9s IChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRleHQvWENvbnRleHQKKyAq IHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVCU0QuCisgKi8KIAogLyoK ICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcgQEAKIC8qCiAgKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisgKiBNaXBzRG9UTEJNaXNz IC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwgVExCIE1pc3MgSGFuZGxl ciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuICBBIG1p c3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRvIGt1c2VnIGFuZCB0aGVy ZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhlIFRMQi4KICAqICdzZWdi YXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFibGUgZm9yIHVzZXIgcHJv Y2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5nIGZvciBhbiBVVExCIG1p c3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgQ2F1c2UgcmVn aXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hpZnRzIEsvVSBhbmQgSUUg Yml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50IEtlcm5lbC9Vc2VyIGFu ZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IKKyAqICAgaXMgaW4ga2Vy bmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisgKiAtIFNldHMgQmFkVmFk ZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRleHQgcmVnaXN0ZXIocyku CisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNvbnRhaW4gVlBOIG9mIHRo ZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZvciBpbnZhbGlkIHB0ZSdz IGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRoZSBwcm9jZXNzb3IgdHJh cCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2UuCisgKgorICogWFhYIFRo aXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIgcGFnZSB0YWJsZSBhbmQg dXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJzLiAgVGhhdCBpcyByZWFs bHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8K ICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVmIF9fbWlwc19uNjQKIAlQ VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAs IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5Ci0J TUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQor CVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsx LCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywgMmYJCQkjID09MCAtLSBu byBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZv ciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5k ZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdlCQkjID09MCAtLSBub3Qg c3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5IChkZWxheSBzbG90 KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF VF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJw YWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRT KGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAor CUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVy IGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsx KQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBi aXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hX X1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJ CQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEg cmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVh cgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNP UDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJ azAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWsw LCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5D CisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJ emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNP UDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlvbgorCitub3Rfc3VwZXJw YWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCisJTUZDMAkJazAsIE1J UFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWsw LCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2YT4+MTApCiAJYW5kaQkJ azAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwg azEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwgMChrMSkJCQkjMGU6IGsw PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBrMT1sbzAgcHRlCisKKwlQ VEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNlZCBi aXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJlbmNl ZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBzYWZl IHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0aGUg cmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDIpCisKIAlD TEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMx MjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRF X01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCisKKwlQVEVf TAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0 aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDMpCisK KwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEJ CSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJCQkJIzFhOiB3cml0ZSB0 byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRVcm4gZnJvbSBleGNlcHRp b24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2VybmVsIGV4Y2VwdGlvbgog CW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNsb3dGYXVsdAkJCSMyMjog bm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAKICNlbmRpZgogCiAvKgot ICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNhdmUgQ1BVIGFuZCBDUDAg cmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlLgog ICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Igc2F2aW5nIHRoZSBleGNl cHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJhY2UgY29kZSBsb29rcyBm b3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcgQEAKIAlTQVZFX1JFRyhh MSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0aGUgcmV0dXJuIGFkZHJl c3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2VybkdlbkV4Y2VwdGlvbikK QEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ CSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhj ZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMg azA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy ZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGsw LCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1w ZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVyLiAgKi8KIAliZXF6CQlr MSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVy cGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9t IFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQ VFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkvKiBWYWxp ZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRFX1ZSCisJYmVxegkJazEs IDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3Rv cmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01U QzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisK KwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRF IGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQg UEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJ CWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGsw KQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBG TiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkj IENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMw CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJ IyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tf MU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8w X1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwliCQl0bGJf aW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQ ICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk cmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQ TgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FE RFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJazAsIDAoazEpCQkJIyBr MD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCi0JYW5kaQkJ azAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAzZgogCW5vcAogCkBAIC05 MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChrMSkKLQlQVEVfTAkJazEs IFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBT X0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9N VEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkKKwor CUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQog CUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAogCiBvZGRfcGFnZToKIAlQ VEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkKKwogCUNMRUFSX1BURV9T V0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lOQwot CUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQor CisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlr MCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9pbnNlcnRfZW50cnk6CkBA IC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2VydF9yYW5kb20KIAlub3AK IAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlDT1AwX1NZ TkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJdGxid3IKKwlQVEVfTVRD MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9w CiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJ azAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJN QVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50 cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBlbnRyeQorCVBUUl9BRERV CWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJ CSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZvciBz dXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5kZXgg ZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFn ZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMg WFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBz dXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9T V0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9h ZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVn aXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VW RU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBm bGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlH RVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsx LCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExC IExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJIyBObyBTVyBCaXRzIHRv IGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVk CisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJ ZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01U QzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1Aw X1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVf TVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVn CisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9r c3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZDMAkJazAsIE1JUFNfQ09Q XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJYmVxCQlrMSwgemVybywg TWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQogI2VuZGlmCiAJUFRS X1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwg UFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMg azE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxvMCBwdGUKLQlQVEVf TAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0 IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19D T1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRl ZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0ZQorCisJQ0xFQVJfUFRF X1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBs b2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVM QVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMvbWlwcy9taXBzL2NwdS5j Ci0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMvbWlwcy9jcHUuYwpAQCAt MzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBjcHVpbmZvLT5sMi5kY19s aW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1aW5mby0+bDIuZGNfbndh eXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVnaXN0ZXIgdG8gc2VlIHdo YXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdyaXRpbmcgYWxsIG9uZSdz IGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dyX3BhZ2VtYXNrKH4wKTsK KwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygpOworCW1pcHNfd3JfcGFn ZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJaWYg KChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykgPT0gMCkKKwkJcGFuaWMo IiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJ ICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLworI2lmZGVmIE1J UFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18x TSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBi eSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1B UCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlwcmludGYoIkZpeGVkIG1h cHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBjcHVpbmZvLnRsYl9uZW50 cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXByaW50ZigiKCIpOworCQkJ aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNLWCkKKwkJCQlwcmludGYo IjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBN SVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJaWYgKGNwdWluZm8udGxi X3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2NEsgIik7CisJCQlpZiAo Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJCQkJcHJpbnRmKCIyNTZL ICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xTSkKKwkJCQlw cmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS180 TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMz X1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdt YXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAiKTsKKwkJCWlmIChjcHVp bmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlwcmludGYoIjI1Nk0gIik7 CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50ZigiXG4iKTsKIAl9CiAKIAlp ZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3Zt cGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBhL3N5cy9taXBzL2luY2x1 ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCkBAIC0xMDAsMTUg KzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgodm1fb2Zmc2V0X3QpMHg4 MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAog LyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5vdCBzdXJlIGlmIHRoaXMg aXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5hYmxlIHN1cGVycGFnZSBy ZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxFVkVMIHNwZWNpZmllcyBh IG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBDdXJyZW50bHkgbWlwczY0 IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVMXzBfT1JERVIpIG9mCisg KiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VSVkxFVkVMCisjZGVmaW5l CVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2ZWwgMCByZXNlcnZhdGlv bnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8KKyNpZm5kZWYJVk1fTEVW RUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5CisjZW5kaWYKKworLyoKKyAq IFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZS RUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCisgKiBE aXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5kZWYJVk1fTlJFU0VSVkxF VkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAKIC8qCisgKiBUaGUgbGFy Z2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJ CTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCiAgKiBIb3cgbWFueSBw aHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2UuCiAgKi8KICNpZm5kZWYg Vk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAjZGVmaW5lCVZNX0xPV01F TV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRpZgogCi0vKgotICogVGhl IGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2RlZmluZQlWTV9ORlJFRU9S REVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAxMDI0KQkvKiA2NEtCICov CiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wdGUu aCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wdGUuaAor KysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwxMCBAQAogI2lmbmRlZglf TUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAKKyNpZiAhZGVmaW5lZChf S0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRpZgorCiAjaWZuZGVmIF9M T0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog IFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9lbnRyeV90OwpAQCAtNzIs MjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9yIDMyLWJpdCB1c2Ugb2Yg Q1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0IG9mIFBGTiB0byBhIG5v bi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRoaXMgcGh5c2ljYWwKICAq IG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5IGVuZm9yY2VkIGVsc2V3 aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5kIDYyIGFyZSB1c2VkIGZv ciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQgbG9hZGluZyBhbmQgc3Rv cmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0aGUgNTUtYml0CisgKiBz aGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVk KF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZpbmUJVExCTE9fU1dCSVRT X1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSg5KQotI2RlZmlu ZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCTE9fU1dCSVRTX1NI SUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRMQkxPX1JFRl9CSVRfU0hJ RlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJKDExKQkvKiBYWFhTUzog V2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZGRkMwVUxMCisjZGVmaW5l CVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmluZQlUTEJMT19TV0JJVFNf TUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZWxzZQogI2Rl ZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJf U0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKKyNkZWZpbmUJ VExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQp CiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNkZWZpbmUJVExCTE9fU1dC SVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCi0jZGVmaW5l CVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9TSElGVCkgPDwgVExCTE9f UEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QRk5fVE9fUEEocGZu KQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJ RlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkgJiBUTEJMT19QRk5fTUFT SykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BGTl9UT19QQShUTEJMT19Q VEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21tZW50IGlzIG5vdCBjb3Jy ZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAgLTEyMSwyNSArMTI4LDgz IEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAvKgorICogUFRFIEhhcmR3 YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoKKyAqIExvd2VyIGJpdHMg b2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBQRk4gICAgICAg IHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogTG93ZXIgYml0 cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDM0ICAz MyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAorICogIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAgICAgIFBGTiAgICAgICAg ICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCiAgKiBUTEIgZmxh Z3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBGcmFtZSBOdW1iZXIuCiAg KiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4gIFRoaXMgbWVhbnMgYSBw YWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBmaXJzdCwgYW5kIGEgd3Jp dGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMgc2V0LiAgU2VlIGFsc28g UFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0IGl0PworICogCVZSOglW YWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJRzoJR2xvYmFsIGJpdC4g IFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAogICogCQlpbiBFVkVSWSBh ZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4KICAqIAkJaXQgaXMgbWF0 Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYgMHgwNykgPDwgMykKICNk ZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNBQ0hFRCkpCiAjZGVmaW5l CVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0QJCQkw eDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJCQkweDAyCiAjZGVmaW5l CVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICogQ0hFUkkgRW50cnlMbyBl eHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBzdG9yaW5nIHRhZ2dlZAor ICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwgPDwgNjMpCisjZGVmaW5l CVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAqIFBURSBTb2Z0d2FyZSBC aXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICogICAgIDMxICAg MzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8IFcgIHwgUk8gfAorICog ICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAq CisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUgICA1NCAgIDUzCisgKiAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHwgIFJH ICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8CisgKiAgIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFZNIGZsYWdzIG1h bmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2VydmVkLiBDdXJyZW50bHkg bm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcgU1ogSURYOiBQYWdlIFNp emUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5hcnkpCUhXIFBhZ2UgU2l6 ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tCisgKgkJMAkwMDAw IDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAwIDAwMTEJIDE2SworICoJ CTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAwMDAgMDAxMSAxMTExCTI1 NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJMDAwMCAwMDExIDExMTEg MTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0KKyAqIChNSVBTIDM6KQor ICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTExIDExMTEgMTExMSAxMTEx CTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlSTzoJUmVhZCBvbmx5LiAg TmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAgKiAJCWxpc3RlbiB0byBy ZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/PwpAQCAtMTUxLDEzICsy MTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkweDAxIDw8IFRMQkxPX1NX QklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3QpMHgwMiA8PCBUTEJMT19T V0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2VudHJ5X3QpMHgwNCA8PCBU TEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f bWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJUFRFX1BTXzE2SwkJKChw dF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRL CQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9Q U18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5l CVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl ZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxPX1NXQklUU19TSElGVCkK KyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwgVExCTE9fU1dCSVRTX1NI SUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJ VFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9lbnRyeV90KTB4MzggPDwg VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVAkJNQor I2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZpbmUJUFRFX1BGTl9OQklU U19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJR0hUCQk2CisjZGVmaW5l CVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1dfVkFMSUQJCTB4NDAKKyNk ZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRMQkxPX1NXQklUU19TSElG VCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2RlZmluZQlQVEVfU1YJCQkw CisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERFKSBwYWdlIG1hcHBpbmcg cmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQVEUpIHBhZ2UgbWFwcGlu Z3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICov CisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFMSUQgfCBQVEVfRCB8IFBU RV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8gfCBQVEVfVyB8IFBURV9N QU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2RlZmlu ZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19JRFhfTUFTSykgPj4gNTYp CisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8ICgoaWR4KSA8PCAxKSkg LSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCVRM Qk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQorI2RlZmluZQlUTEJNQVNL XzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJVExCTUFTS18xNktfUEFH RQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tfNjRLX1BBR0UJVExCTUFT S19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFHRQlUTEJNQVNLX0lEWF9U T19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFTS19JRFhfVE9fTUFTSyg0 KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soNSkKKyNkZWZp bmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYpCisjZGVmaW5lCVRMQk1B U0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2UgLyogISBNSVBTNjRfTkVX X1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkwCisjZGVmaW5lCVRMQkxP X1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAKIC8q CiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVmaW5lZCBhYm92ZS4KICAq LwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0gfihiaXQpKQotI2RlZmlu ZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2RlZmluZQlwdGVfdGVzdChw dGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZuZGVmIF9MT0NPUkUKK3N0 YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90 IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAor cHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSB8PSBi aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0X2VudHJ5X3QgKnB0ZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0KSA9PSBiaXQpOworfQor CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50 cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5iaXQpOworfQorCitzdGF0 aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0 KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l IGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl dHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9f aW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRkcl90IHBhKQoreworCisJ cmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExC TE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUEZO X1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJfdCkocGZuID4+ IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgX19pbmxp bmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl dHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9WQUxJRCAJUFRFX1NWCisK KyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSksIFBURV9SRUYpCisjZGVm aW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQVEVfUkVGKQorI2RlZmlu ZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVf cmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChwdGUpLCBQVEVfUkVGKQor I2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3NldF9sb25nKChwdGUpLCBQ VEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCVBURV9S RUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRl KQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0 ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0 b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisj ZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwgUFRFX1ZBTElEKQorCisj aWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQURE Ul82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNf Y2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0 b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRl KQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3Jl KHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfNjQoXAorCQkJCQkJKHB0 X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBw dGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRl cCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9sb25nKShwdGUpOwlcCit9 IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAs IHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0ZV9h dG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRlKSwgYml0KQorI2RlZmlu ZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigocHRlKSwgYml0KQorI2Rl ZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzMyKHB0ZXAs IHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClhdG9t aWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKworI2Rl ZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF8zMihwdGVw LCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfaW50ICop KHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUo cGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlmIC8qICEgUEhZU0FERFJf NjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lmIGRlZmluZWQoX19taXBz X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNp Zm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBERSBpcyBhY3R1YWxseSBh IHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9uIF9fbWlwc19uNjQgdGhl IGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJhbmdlIGZyb20KKyAqIFZN X01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0byBWTV9NQVhfS0VSTkVM X0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZvcmUsIGEgdmFsaWQgdmly dHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8gYSBwYWdlIHRhYmxlKSB3 aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICogc3VwZXJwYWdlIHdpbGwg aGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMgNTggdG8gNTYpCisgKiBz ZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0 YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhfTUFTSykgIT0gMCk7Cit9 CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19p bmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVy biAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUERFIGFu IDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfMW1fc3VwZXJw YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ VEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQVEUgYW4gMU1CIHN1cGVy cGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9zdXBlcnBhZ2UocHRfZW50 cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFN KTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUg TnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1NQRk4o dm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfMU1fU1VQRVJQQUdFX1NI SUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZOX01BU0spOworfQorCisv KiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNpY2FsIEFkZHJlc3MuICov CitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9UT19QQShwdF9lbnRyeV90 IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+IFRMQkxPX1BGTl9TSElG VCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisKKy8qIFN1cGVycGFnZSBQ YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg dm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKwlyZXR1cm4g KFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQorewor CXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk ZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9l bnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUERFX1RP X1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19QRk5fVE9fUEEoVExCTE9f UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYgLyogISBfTE9DT1JFICov CisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2lzX3JlZmVy ZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0KHB0ZSkKKyNkZWZpbmUJ cHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1cGVycGFnZShwZGUpCQkw CisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZSBwZGVfaXNfMW1fc3Vw ZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorCisjaWZu ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QVEVfVE9fUEEo cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVf VE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKyNlbmRpZiAvKiAhIFBI WVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZvciBQVEUgYWNjZXNzKi8K ICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2RlZmluZQlQVEVNQVNLCQkJ MHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJCQlsZAorI2RlZmluZQlQ VEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmluZQlDTEVBUl9QVEVfU1dC SVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhyKQorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNlZCBiaXQgZW11bGF0aW9u IEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lEWChyKQorICoKKyAqIEdl dCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlmdGluZyBpdCBsZWZ0IGJ5 CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhlIHVwcGVyIHNvZnRiaXRz KSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9QU0lEWF9OQklUU19UT19S SUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcKKyAqIGFsbCB0aGUgbG93 ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRfU1VQRVJQQUdFX0lEWChy KQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwzMgly LCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgLSAz MikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBHZXQgdGhlIGxvd2VyIGhh cmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJpZ2h0LgorICovCisjZGVm aW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAoUFRFX0hXRkxBR1NfTkJJ VFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG VCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCisgKgorICogR2V0 IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFNIFBURS4gIEZpcnN0LCBt YXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhlbiBhZGQgMU0gd29ydGgg b2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0CisgKiBiYWNrIHRvIGl0cyBw b3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERfMU1fUEZOX0ZST01fRVZF TihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwJciwg KFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9fUklHSFQpOyBcCisJZGFk ZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlkc2xsCXIsIChQVEVfUEZO X05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9m ZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRoZW4gc2V0IHRoZSByZWZl cmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisgKiBkb2VzIGl0IGF0b21p Y2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUKKyNpZmRlZiBBVE9NSUNf UkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZz ZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMgly MCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQ7 CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAorCVBURV9MCXIwLCBvZmZz ZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs IHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJYmVxegly MCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJ CQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyogISBBVE9NSUNfUkVGQklU X1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQs IHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMglyMCwg KFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEIDsJ CQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNl dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJUFRFX1MJcjAsIG9m ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKyNlbmRpZiAvKiAh IEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICov CisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFH UyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUp CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxzZSAvKiAhIExPQ09SRSAq LwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJMHhmZjgJLyogZm9yIHRo ZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhmZmMKICNkZWZpbmUJUFRF U0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVfUwkJCXN3CiAjZGVmaW5l CVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocikJTE9OR19TTEwgciwg VExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJf U0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BURV9WQUxJRChyMCwgcjEs IG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCByMSwgb2Zmc2V0KQorCiAj ZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpICovCiAK ICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3IEBACiAjZGVmaW5lCU1J UFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19QR01BU0tfMjU2TQkweDFm ZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdpc3RlciA1LCBTZWxlY3Qg MCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkweDAwMDAxODAwCisjZGVm aW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZL CTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAwMDFlMDAwCisjZGVmaW5l CU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzFNCQkw eDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdmZTAwMAorI2RlZmluZQlN SVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3 ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKKwogI2VuZGlmIC8q ICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5o IGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgK KysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTYyLDE1ICs2MiwyNCBAQAogI2luY2x1 ZGUgPHN5cy9fbG9jay5oPgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2 NF9ORVdfUE1BUAorI2luY2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9O RVdfUE1BUCAqLworCiAvKgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBz dHJ1Y3QgcHZfY2h1bms7CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJ TFFfSEVBRCgsIHB2X2VudHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOwor I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCWludCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAq LwogfTsKIAogI2RlZmluZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAt ODEsMTUgKzkwLDE4IEBACiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklU UykgLSAxKQogCiBzdHJ1Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlf dCAqcG1fc2VndGFiOwkvKiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBw dl9jaHVuaykJcG1fcHZjaHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1 c2V0X3QJcG1fYWN0aXZlOwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2lu dDMyX3QgYXNpZDpBU0lEX0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2lu dDMyX3QgZ2VuOkFTSURHRU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAg ICAgIHBtX2FzaWRbTUFYU01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRz OwkvKiBwbWFwIHN0YXRpc3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBT NjRfTkVXX1BNQVAKKwlzdHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFi bGUgcGFnZXMgKi8KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYg c3RydWN0IHBtYXAgKnBtYXBfdDsKQEAgLTEyMSw3ICsxMzMsNyBAQAogICovCiB0eXBlZGVmIHN0 cnVjdCBwdl9lbnRyeSB7CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBm b3IgbWFwcGluZyAqLwotCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VO VFJZKHB2X2VudHJ5KSBwdl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2 OSw2ICsxODEsOCBAQAogCiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9t YXBkZXYodm1fcGFkZHJfdCwgdm1fc2l6ZV90KTsKK2Jvb2xlYW5fdCBwbWFwX3BhZ2VfaXNfbWFw cGVkKHZtX3BhZ2VfdCBtKTsKK3ZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCBt LCB2bV9tZW1hdHRyX3QgbWEpOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9z aXplX3QpOwogdm1fb2Zmc2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwog dm9pZCBwbWFwX2tlbnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgs NiArMTkyLDcgQEAKIHZvaWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBw YSk7CiB2b2lkIHBtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVs YXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVs YXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9w YWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8q IF9LRVJORUwgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9t aXBzL2luY2x1ZGUvcGFyYW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIv c3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5l CU1BWERVTVBQR1MJCTEJCS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRl ZiBLU1RBQ0tfTEFSR0VfUEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdl IHRoZSBLU1RBQ0tfU0laRSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5 IHRoZSBoYXJkd2FyZSAoZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8 PCAxNCkJLyogU2luZ2xlIDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NU QUNLX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEp CisjZGVmaW5lCUtTVEFDS19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmlu ZQlLU1RBQ0tfVExCTUFTS19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElG VCAtIDEpKSBcCisJCQkJCTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9Q QUdFUwkoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBL U1RBQ0tfTEFSR0VfUEFHRSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBi ZSBhbGlnbmVkIG9uIGEgKFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtT VEFDS19QQUdFUwkJMgkvKiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShL U1RBQ0tfUEFHRVMgKiBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9T SVpFCisjZGVmaW5lCUtTVEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtT VEFDS19HVUFSRF9QQUdFUwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAq LworI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZl ZCBjb252ZXJzaW9uIG1hY3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsg UEFHRV9NQVNLKSAmIH5QQUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+ UEFHRV9NQVNLKQorI2RlZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+ UERSTUFTSykKKyNkZWZpbmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNk ZWZpbmUJYXRvcCh4KQkJCSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgo eCkgPDwgUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5 cy9jb25mL29wdGlvbnMubWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lz L2NvbmYvb3B0aW9ucy5taXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJ b3B0X2dsb2JhbC5oCiAKICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5j bHVkZXMgcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0Lgor IworTUlQUzY0X05FV19QTUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNv bnRyb2wgdGhlIE5ldEZQR0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYx MEJNQUNfNjRCSVQJCQlvcHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUg d2l0aCBQYWdlTWFzayByZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdl IChjdXJyZW50bHkgMTZLKSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJH RV9QQUdFICAgCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUg QXRoZXJvcyBTb0MgcGVyaXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYg LS1naXQgYS9zeXMvY29uZi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9z eXMvY29uZi9maWxlcy5taXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMx LDggQEAKIG1pcHMvbWlwcy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRl cC5jCQkJb3B0aW9uYWwJZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1p cHMvbWlwcy9wbWFwLmMJCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFt aXBzNjRfbmV3X3BtYXAKK21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0 X25ld19wbWFwCiBtaXBzL21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlw cy9zY19tYWNoZGVwLmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0 aW9uYWwJZGRiIHwgc3RhY2sKCg== --b1_8a01977bc2405e827dd78c8dca1d7216--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8a01977bc2405e827dd78c8dca1d7216>