ZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwppbmRleCA1Mjk5YzViLi42YzUyMTgyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFg4Nl9FX1BPV0VSU0FWRVIKKwl0cmlzdGF0ZSAiVklBIEM3IEVuaGFuY2VkIFBvd2VyU2F2ZXIgKEVYUEVSSU1FTlRBTCkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBWSUEgQzcgcHJvY2Vzc29ycy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCiBjb21tZW50ICJzaGFyZWQgb3B0aW9ucyIKIAogY29uZmlnIFg4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA4ZGUzYWJlLi41NjBmNzc2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubwogb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KIG9iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfWDg2X0VfUE9XRVJTQVZFUikJCSs9IGVfcG93ZXJzYXZlci5vCiBvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubwogb2JqLSQoQ09ORklHX1NDNTIwX0NQVUZSRVEpCQkrPSBzYzUyMF9mcmVxLm8KIG9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQzNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IERhdmUgSm9uZXMuIFRoYW5rcyEKKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjZGVmaW5lIEVQU19CUkFORF9DN00JMAorI2RlZmluZSBFUFNfQlJBTkRfQzcJMQorI2RlZmluZSBFUFNfQlJBTkRfRURFTgkyCisjZGVmaW5lIEVQU19CUkFORF9DMwkzCisKK3N0cnVjdCBlcHNfY3B1X2RhdGEgeworCXUzMiBmc2I7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGZyZXFfdGFibGVbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXBzX2NwdV9kYXRhICplcHNfY3B1W05SX0NQVVNdOworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBzX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7CisJdTMyIGxvLCBoaTsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCWNlbnRhdXIgPSBlcHNfY3B1W2NwdV07CisJaWYgKGNlbnRhdXIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwlyZXR1cm4gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGVwc19zZXRfc3RhdGUoc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1ciwKKwkJCSB1bnNpZ25lZCBpbnQgY3B1LAorCQkJIHUzMiBkZXN0X3N0YXRlKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXUzMiBsbywgaGk7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlmcmVxcy5vbGQgPSBlcHNfZ2V0KGNwdSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChkZXN0X3N0YXRlID4+IDgpICYgMHhmZik7CisJZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBXYWl0IHdoaWxlIENQVSBpcyBidXN5ICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJaSA9IDA7CisJd2hpbGUgKGxvICYgKCgxIDw8IDE2KSB8ICgxIDw8IDE3KSkpIHsKKwkJdWRlbGF5KDE2KTsKKwkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJCWkrKzsKKwkJaWYgKHVubGlrZWx5KGkgPiA2NCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHBvc3RjaGFuZ2U7CisJCX0KKwl9CisJLyogU2V0IG5ldyBtdWx0aXBsaWVyIGFuZCB2b2x0YWdlICovCisJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIGRlc3Rfc3RhdGUgJiAweGZmZmYsIDApOworCS8qIFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCQlpKys7CisJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwb3N0Y2hhbmdlOworCQl9CisJfSB3aGlsZSAobG8gJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KK3Bvc3RjaGFuZ2U6CisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlcHNfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwl1bnNpZ25lZCBpbnQgZGVzdF9zdGF0ZTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGVwc19jcHVbY3B1XSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKKworCWlmICh1bmxpa2VseShjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJJmVwc19jcHVbY3B1XS0+ZnJlcV90YWJsZVswXSwKKwkJCXRhcmdldF9mcmVxLAorCQkJcmVsYXRpb24sCisJCQkmbmV3c3RhdGUpKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYWtlIGZyZXF1ZW5jeSB0cmFuc2l0aW9uICovCisJZGVzdF9zdGF0ZSA9IGNlbnRhdXItPmZyZXFfdGFibGVbbmV3c3RhdGVdLmluZGV4ICYgMHhmZmZmOworCXJldCA9IGVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBkZXN0X3N0YXRlKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgImVwczogVGltZW91dCFcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBzX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwKKwkJCSZlcHNfY3B1W3BvbGljeS0+Y3B1XS0+ZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZXBzX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBsbywgaGk7CisJdTY0IHZhbDsKKwl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKKwl1OCBtYXhfbXVsdGlwbGllciwgbWF4X3ZvbHRhZ2U7CisJdTggbWluX211bHRpcGxpZXIsIG1pbl92b2x0YWdlOworCXU4IGJyYW5kOworCXUzMiBmc2I7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZfdGFibGU7CisJaW50IGssIHN0ZXAsIHZvbHRhZ2U7CisJaW50IHJldDsKKwlpbnQgc3RhdGVzOworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgYnJhbmQgKi8KKwlwcmludGsoImVwczogRGV0ZWN0ZWQgVklBICIpOworCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKKwlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CisJc3dpdGNoKGJyYW5kKSB7CisJY2FzZSBFUFNfQlJBTkRfQzdNOgorCQlwcmludGsoIkM3LU1cbiIpOworCQlicmVhazsKKwljYXNlIEVQU19CUkFORF9DNzoKKwkJcHJpbnRrKCJDN1xuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0VERU46CisJCXByaW50aygiRWRlblxuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0MzOgorCQlwcmludGsoIkMzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwkvKiBFbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlciAqLworCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgdmFsKTsKKwlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQl2YWwgfD0gMSA8PCAxNjsKKwkJd3Jtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQkvKiBDYW4gYmUgbG9ja2VkIGF0IDAgKi8KKwkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQkJcHJpbnRrKCJlcHM6IENhbid0IGVuYWJsZSBFbmhhbmNlZCBQb3dlclNhdmVyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogUHJpbnQgdm9sdGFnZSBhbmQgbXVsdGlwbGllciAqLworCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCWN1cnJlbnRfdm9sdGFnZSA9IGxvICYgMHhmZjsKKwlwcmludGsoImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwgY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEN1cnJlbnQgbXVsdGlwbGllciA9ICVkXG4iLCBjdXJyZW50X211bHRpcGxpZXIpOworCisJLyogUHJpbnQgbGltaXRzICovCisJbWF4X3ZvbHRhZ2UgPSBoaSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOworCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKKwlwcmludGsoImVwczogSGlnaGVzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1heF9tdWx0aXBsaWVyKTsKKwltaW5fdm9sdGFnZSA9IChoaSA+PiAxNikgJiAweGZmOworCXByaW50aygiZXBzOiBMb3dlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1pbl92b2x0YWdlICogMTYgKyA3MDApOworCW1pbl9tdWx0aXBsaWVyID0gKGhpID4+IDI0KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IExvd2VzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1pbl9tdWx0aXBsaWVyKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID09IDAgfHwgbWF4X211bHRpcGxpZXIgPT0gMAorCSAgICB8fCBtaW5fbXVsdGlwbGllciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKKwkgICAgfHwgbWF4X211bHRpcGxpZXIgPD0gbWluX211bHRpcGxpZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFjIHx8IG1heF92b2x0YWdlID4gMHgxYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsYyBGU0Igc3BlZWQgKi8KKwlmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOworCS8qIENhbGMgbnVtYmVyIG9mIHAtc3RhdGVzIHN1cHBvcnRlZCAqLworCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfQzdNKQorCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKKwllbHNlCisJCXN0YXRlcyA9IDI7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIGRhdGEgYW5kIGZyZXF1ZW5jeSB0YWJsZSBmb3IgY3VycmVudCBjcHUgKi8KKwljZW50YXVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVwc19jcHVfZGF0YSkKKwkJICAgICsgKHN0YXRlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbnRhdXIpCisJCXJldHVybiAtRU5PTUVNOworCWVwc19jcHVbMF0gPSBjZW50YXVyOworCisJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KKwljZW50YXVyLT5mc2IgPSBmc2I7CisKKwkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCisJZl90YWJsZSA9ICZjZW50YXVyLT5mcmVxX3RhYmxlWzBdOworCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfRURFTikgeworCQlmX3RhYmxlWzBdLmZyZXF1ZW5jeSA9IGZzYiAqIG1pbl9tdWx0aXBsaWVyOworCQlmX3RhYmxlWzBdLmluZGV4ID0gKG1pbl9tdWx0aXBsaWVyIDw8IDgpIHwgbWluX3ZvbHRhZ2U7CisJCWZfdGFibGVbMV0uZnJlcXVlbmN5ID0gZnNiICogbWF4X211bHRpcGxpZXI7CisJCWZfdGFibGVbMV0uaW5kZXggPSAobWF4X211bHRpcGxpZXIgPDwgOCkgfCBtYXhfdm9sdGFnZTsKKwkJZl90YWJsZVsyXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwl9IGVsc2UgeworCQlrID0gMDsKKwkJc3RlcCA9ICgobWF4X3ZvbHRhZ2UgLSBtaW5fdm9sdGFnZSkgKiAyNTYpCisJCQkvIChtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyKTsKKwkJZm9yIChpID0gbWluX211bHRpcGxpZXI7IGkgPD0gbWF4X211bHRpcGxpZXI7IGkrKykgeworCQkJdm9sdGFnZSA9IChrICogc3RlcCkgLyAyNTYgKyBtaW5fdm9sdGFnZTsKKwkJCWZfdGFibGVba10uZnJlcXVlbmN5ID0gZnNiICogaTsKKwkJCWZfdGFibGVba10uaW5kZXggPSAoaSA8PCA4KSB8IHZvbHRhZ2U7CisJCQlrKys7CisJCX0KKwkJZl90YWJsZVtrXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwl9CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxNDAwMDA7IC8qIDg0NG1WIC0+IDcwMG1WIGluIG5zICovCisJcG9saWN5LT5jdXIgPSBmc2IgKiBjdXJyZW50X211bHRpcGxpZXI7CisKKwlyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgJmNlbnRhdXItPmZyZXFfdGFibGVbMF0pOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoY2VudGF1cik7CisJCXJldHVybiByZXQ7CisJfQorCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoJmNlbnRhdXItPmZyZXFfdGFibGVbMF0sIHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcHNfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7CisJdTMyIGxvLCBoaTsKKworCWlmIChlcHNfY3B1W2NwdV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKKworCS8qIEdldCBtYXggZnJlcXVlbmN5ICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJLyogU2V0IG1heCBmcmVxdWVuY3kgKi8KKwllcHNfc2V0X3N0YXRlKGNlbnRhdXIsIGNwdSwgaGkgJiAweGZmZmYpOworCS8qIEJ5ZSAqLworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlrZnJlZShlcHNfY3B1W2NwdV0pOworCWVwc19jcHVbY3B1XSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBlcHNfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBlcHNfZHJpdmVyID0geworCS52ZXJpZnkJCT0gZXBzX3ZlcmlmeSwKKwkudGFyZ2V0CQk9IGVwc190YXJnZXQsCisJLmluaXQJCT0gZXBzX2NwdV9pbml0LAorCS5leGl0CQk9IGVwc19jcHVfZXhpdCwKKwkuZ2V0CQk9IGVwc19nZXQsCisJLm5hbWUJCT0gImVfcG93ZXJzYXZlciIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IGVwc19hdHRyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXBzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCS8qIFRoaXMgZHJpdmVyIHdpbGwgd29yayBvbmx5IG9uIENlbnRhdXIgQzcgcHJvY2Vzc29ycyB3aXRoCisJICogRW5oYW5jZWQgU3BlZWRTdGVwL1Bvd2VyU2F2ZXIgcmVnaXN0ZXJzICovCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9DRU5UQVVSCisJICAgIHx8IGMtPng4NiAhPSA2IHx8IGMtPng4Nl9tb2RlbCAhPSAxMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZlcHNfZHJpdmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcHNfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJSYWZhsyBCaWxza2kgPHJhZmFsYmlsc2tpQGludGVyaWEucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVuaGFuY2VkIFBvd2VyU2F2ZXIgZHJpdmVyIGZvciBWSUEgQzcgQ1BVJ3MuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGVwc19pbml0KTsKK21vZHVsZV9leGl0KGVwc19leGl0KTsK