ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2lycS5jCisgKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGFsbCBPTUFQIGJvYXJkcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICogTWFqb3IgY2xlYW51cHMgYnkgSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBDb21wbGV0ZWx5IHJlLXdyaXR0ZW4gdG8gc3VwcG9ydCB2YXJpb3VzIE9NQVAgY2hpcHMgd2l0aCBiYW5rIHNwZWNpZmljCisgKiBpbnRlcnJ1cHQgaGFuZGxlcnMuCisgKgorICogU29tZSBzbmlwcGV0cyBvZiB0aGUgY29kZSB0YWtlbiBmcm9tIHRoZSBvbGRlciBPTUFQIGludGVycnVwdCBoYW5kbGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4gR3JlZyBMb25ub24gPGdsb25ub25AcmlkZ2VydW4uY29tPgorICoKKyAqIEdQSU8gaW50ZXJydXB0IGhhbmRsZXIgbW92ZWQgdG8gZ3Bpby5jIGJ5IEp1aGEgWXJqb2xhCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgSVJRX0JBTksoaXJxKSAoKGlycSkgPj4gNSkKKyNkZWZpbmUgSVJRX0JJVChpcnEpICAoKGlycSkgJiAweDFmKQorCitzdHJ1Y3Qgb21hcF9pcnFfYmFuayB7CisJdW5zaWduZWQgbG9uZyBiYXNlX3JlZzsKKwl1bnNpZ25lZCBsb25nIHRyaWdnZXJfbWFwOworCXVuc2lnbmVkIGxvbmcgd2FrZV9lbmFibGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGlycV9iYW5rX2NvdW50ID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayAqaXJxX2JhbmtzOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnFfYmFua19yZWFkbChpbnQgYmFuaywgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX2Jhbmtfd3JpdGVsKHVuc2lnbmVkIGxvbmcgdmFsdWUsIGludCBiYW5rLCBpbnQgb2Zmc2V0KQoreworCW9tYXBfd3JpdGVsKHZhbHVlLCBpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxID4gMzEpCisJCW9tYXBfd3JpdGVsKDB4MSwgT01BUF9JSDJfQkFTRSArIElSUV9DT05UUk9MX1JFR19PRkZTRVQpOworCisJb21hcF93cml0ZWwoMHgxLCBPTUFQX0lIMV9CQVNFICsgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOworCWwgfD0gMSA8PCBJUlFfQklUKGlycSk7CisJb21hcF93cml0ZWwobCwgaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgb21hcF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGJhbmsgPSBJUlFfQkFOSyhpcnEpOworCXUzMiBsOworCisJbCA9IG9tYXBfcmVhZGwoaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKKwlsICY9IH4oMSA8PCBJUlFfQklUKGlycSkpOworCW9tYXBfd3JpdGVsKGwsIGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIElSUV9NSVJfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJb21hcF9tYXNrX2lycShpcnEpOworCW9tYXBfYWNrX2lycShpcnEpOworfQorCitzdGF0aWMgaW50IG9tYXBfd2FrZV9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFfYmFua3NbYmFua10ud2FrZV9lbmFibGUgfD0gSVJRX0JJVChpcnEpOworCWVsc2UKKwkJaXJxX2JhbmtzW2JhbmtdLndha2VfZW5hYmxlICY9IH5JUlFfQklUKGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQWxsb3dzIHR1bmluZyB0aGUgSVJRIHR5cGUgYW5kIHByaW9yaXR5CisgKgorICogTk9URTogVGhlcmUgaXMgY3VycmVudGx5IG5vIE9NQVAgZmlxIGhhbmRsZXIgZm9yIExpbnV4LiBSZWFkIHRoZQorICoJIG1haWxpbmcgbGlzdCB0aHJlYWRzIG9uIEZJUSBoYW5kbGVycyBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvCisgKgkgYWRkIGEgRklRIGhhbmRsZXIgZm9yIE9NQVAuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBfaXJxX3NldF9jZmcoaW50IGlycSwgaW50IGZpcSwgaW50IHByaW9yaXR5LCBpbnQgdHJpZ2dlcikKK3sKKwlzaWduZWQgaW50IGJhbms7CisJdW5zaWduZWQgbG9uZyB2YWwsIG9mZnNldDsKKworCWJhbmsgPSBJUlFfQkFOSyhpcnEpOworCS8qIEZJUSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBiYW5rIDAgaW50ZXJydXB0cyAqLworCWZpcSA9IGJhbmsgPyAwIDogKGZpcSAmIDB4MSk7CisJdmFsID0gZmlxIHwgKChwcmlvcml0eSAmIDB4MWYpIDw8IDIpIHwgKCh0cmlnZ2VyICYgMHgxKSA8PCAxKTsKKwlvZmZzZXQgPSBJUlFfSUxSMF9SRUdfT0ZGU0VUICsgSVJRX0JJVChpcnEpICogMHg0OworCWlycV9iYW5rX3dyaXRlbCh2YWwsIGJhbmssIG9mZnNldCk7Cit9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCitzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDczMF9pcnFfYmFua3NbXSA9IHsKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgxX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhiM2Y4ZTIyZiB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGZkYjljMWYyIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgxMDAsCS50cmlnZ2VyX21hcCA9IDB4ODAwMDQwZjMgfSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDE1MTBfaXJxX2JhbmtzW10gPSB7CisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMV9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4YjNmZWJmZmYgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhmZmJmZmZlZCB9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKworc3RhdGljIHN0cnVjdCBvbWFwX2lycV9iYW5rIG9tYXAxNjEwX2lycV9iYW5rc1tdID0geworCXsgLmJhc2VfcmVnID0gT01BUF9JSDFfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGIzZmVmZThmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4ZmRiN2MxZmQgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDEwMCwJLnRyaWdnZXJfbWFwID0gMHhmZmZmYjdmZiB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MjAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZmZmZmIH0sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBvbWFwX2lycV9jaGlwID0geworCS5hY2sgICAgPSBvbWFwX21hc2tfYWNrX2lycSwKKwkubWFzayAgID0gb21hcF9tYXNrX2lycSwKKwkudW5tYXNrID0gb21hcF91bm1hc2tfaXJxLAorCS53YWtlCT0gb21hcF93YWtlX2lycSwKK307CisKK3ZvaWQgX19pbml0IG9tYXBfaW5pdF9pcnEodm9pZCkKK3sKKwlpbnQgaSwgajsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlpcnFfYmFua3MgPSBvbWFwNzMwX2lycV9iYW5rczsKKwkJaXJxX2JhbmtfY291bnQgPSBBUlJBWV9TSVpFKG9tYXA3MzBfaXJxX2JhbmtzKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlpcnFfYmFua3MgPSBvbWFwMTUxMF9pcnFfYmFua3M7CisJCWlycV9iYW5rX2NvdW50ID0gQVJSQVlfU0laRShvbWFwMTUxMF9pcnFfYmFua3MpOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWlycV9iYW5rcyA9IG9tYXAxNjEwX2lycV9iYW5rczsKKwkJaXJxX2JhbmtfY291bnQgPSBBUlJBWV9TSVpFKG9tYXAxNjEwX2lycV9iYW5rcyk7CisJfQorI2VuZGlmCisJcHJpbnRrKCJUb3RhbCBvZiAlaSBpbnRlcnJ1cHRzIGluICVpIGludGVycnVwdCBiYW5rc1xuIiwKKwkgICAgICAgaXJxX2JhbmtfY291bnQgKiAzMiwgaXJxX2JhbmtfY291bnQpOworCisJLyogTWFzayBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXJxX2JhbmtfY291bnQ7IGkrKykgeworCQlpcnFfYmFua193cml0ZWwofjB4MCwgaSwgSVJRX01JUl9SRUdfT0ZGU0VUKTsKKwkJaXJxX2Jhbmtfd3JpdGVsKDB4MCwgaSwgSVJRX0lUUl9SRUdfT0ZGU0VUKTsKKwl9CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaXJxX2Jhbmtfd3JpdGVsKDB4MDMsIDAsIElSUV9DT05UUk9MX1JFR19PRkZTRVQpOworCWlycV9iYW5rX3dyaXRlbCgweDAzLCAxLCBJUlFfQ09OVFJPTF9SRUdfT0ZGU0VUKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGluIGdsb2JhbCBtYXNrICovCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJaXJxX2Jhbmtfd3JpdGVsKDB4MCwgMCwgSVJRX0dNUl9SRUdfT0ZGU0VUKTsKKwl9CisKKwkvKiBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIGVhY2ggYmFuayAqLworCWZvciAoaSA9IDA7IGkgPCBpcnFfYmFua19jb3VudDsgaSsrKSB7CisJCWZvciAoaiA9IGkgKiAzMjsgaiA8IChpICsgMSkgKiAzMjsgaisrKSB7CisJCQlpbnQgaXJxX3RyaWdnZXI7CisKKwkJCWlycV90cmlnZ2VyID0gaXJxX2JhbmtzW2ldLnRyaWdnZXJfbWFwID4+IElSUV9CSVQoaik7CisJCQlvbWFwX2lycV9zZXRfY2ZnKGosIDAsIDAsIGlycV90cmlnZ2VyKTsKKworCQkJc2V0X2lycV9jaGlwKGosICZvbWFwX2lycV9jaGlwKTsKKwkJCXNldF9pcnFfaGFuZGxlcihqLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKKwkJfQorCX0KKworCS8qIFVubWFzayBsZXZlbCAyIGhhbmRsZXIgKi8KKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlvbWFwX3VubWFza19pcnEoSU5UXzczMF9JSDJfSVJRKTsKKwl9IGVsc2UgeworCQlvbWFwX3VubWFza19pcnEoSU5UX0lIMl9JUlEpOworCX0KK30K