ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggZTA2MmIwOS4uMDZkM2IxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTEzNyw1ICsxMzcsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90aS1zdC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZyIKKwogZW5kaWYgIyAhU1RBR0lOR19FWENMVURFX0JVSUxECiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCAwOTdjMTU4Li41NTI2ODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC00OSwzICs0OSw0IEBACiBvYmotJChDT05GSUdfQ1JZU1RBTEhEKQkJKz0gY3J5c3RhbGhkLwogb2JqLSQoQ09ORklHX0NYVDFFMSkJCSs9IGN4dDFlMS8KIG9iai0kKENPTkZJR19USV9TVCkJCSs9IHRpLXN0Lworb2JqLSQoQ09ORklHX0FESVMxNjI1NSkpCQkrPSBhZGlzMTYyNTUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L0tjb25maWcKaW5kZXggMzk1MmNmOS4uYTY0MmJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZwpAQCAtMiw4ICsyLDEwIEBACiAJdHJpc3RhdGUgIkFuYW5sb2cgRGV2aWNlcyBBRElTMTYyNTAvMTYyNTUiCiAJZGVwZW5kcyBvbiBTUEkgJiYgU1lTRlMKIAktLS1oZWxwLS0tCi0gICAgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCi0gICAgICBBRElTMTYyNTAvMTYyNTUgTG93IFBvd2VyIEd5cm9zY29wZS4KKwlJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCisJQURJUzE2MjUwLzE2MjU1IExvdyBQb3dlciBHeXJvc2NvcGUuIFRoZSBkcml2ZXIgZXhwb3NlcworCW9yaWVudGF0aW9uIGFuZCBneXJvc2NvcGUgdmFsdWUsIGFzIHdlbGwgYXMgc2FtcGxlIHJhdGUKKwl0byB0aGUgc3lzZnMuCiAKLSAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotICAgICAgd2lsbCBiZSBjYWxsZWQgYWRpczE2MjU1LgorCVRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCXdpbGwgYmUgY2FsbGVkIGFkaXMxNjI1NS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L01ha2VmaWxlCmluZGV4IDgwNTczNzIuLjhjMzkwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9NYWtlZmlsZQpAQCAtMSArMSBAQAotb2JqLSQoQ09ORklHX0FESVMxNjI1NSkgKz0gYWRpczE2MjUubworb2JqLSQoQ09ORklHX0FESVMxNjI1NSkJCSs9IGFkaXMxNjI1NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTRhYzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0qIHNhbXBsZSByYXRlIGNoYW5nZWFibGUgb3IgYXQgbGVhc3QgcmVhZGFibGUgZnJvbSBzeXNmcwotKiByZXNldCBneXJvc2NvcGUKLSogZW5jYXBzdWxhdGUgYWRpc19pbml0IGFuZCBhZGlzX3R1cm5fb2ZmCi0qIEFEX0NISyBkZWxldGlvbgotKiBjaGlwIHNlbGZ0ZXN0IGluIGFkaXNfaW5pdAotKiByZWR1Y2Uga2VybmVsIG1lc3NhZ2VzIHRvIHJlYXNvbmFibGUgYW1vdW50Ci0KLUNvbnRhY3Q6IE1hdHRoaWFzIEJydWdnZXIgPG1lbnNjaDA4MTVAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmMKaW5kZXggOGQxMTA2OS4uMWJhMTFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5jCkBAIC0yMSw2ICsyMSwxNCBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorLyoKKyAqIFRoZSBkcml2ZXIganVzdCBoYXMgYSBiYXJlIGludGVyZmFjZSB0byB0aGUgc3lzZnMgKHNhbXBsZSByYXRlIGluIEh6LAorICogb3JpZW50YXRpb24gKHgsIHksIHopIGFuZCBneXJvc2NvcGUgZGF0YSBpbiDCsC9zZWMuCisgKgorICogSXQgc2hvdWxkIGJlIGFkZGVkIHRvIGlpbyBzdWJzeXN0ZW0gd2hlbiB0aGlzIGhhcyBsZWZ0IHN0YWdpbmcuCisgKgorICovCisKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC02MiwxNCArNzAsMTMgQEAKICAqIEBkYXRhOiAgICAgIExhc3QgcmVhZCBkYXRhIGZyb20gZGV2aWNlLgogICogQGlycV9hZGlzOiAgR1BJTyBOdW1iZXIgb2YgSVJRIHNpZ25hbAogICogQGlycTogICAgICAgaXJxIGxpbmUgbWFuYWdlIGJ5IGtlcm5lbAotICogQG5lZ2F0aXZlOiAgaW5kaWNhdGVzIGlmIHNlbnNvciBpcyB1cHNpZGUgZG93biAobmVnYXRpdmUg/zEpCisgKiBAbmVnYXRpdmU6ICBpbmRpY2F0ZXMgaWYgc2Vuc29yIGlzIHVwc2lkZSBkb3duIChuZWdhdGl2ZSA9PSAxKQogICogQGRpcmVjdGlvbjogaW5kaWNhdGVzIGF4aXMgKHgsIHksIHopIHRoZSBzZW5zb3IgaXMgbWVhc3N1cmluZwogICovCiBzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOwogCXMxNiBkYXRhOwotCWludCBpcnFfYWRpczsKIAlpbnQgaXJxOwogCXU4IG5lZ2F0aXZlOwogCWNoYXIgZGlyZWN0aW9uOwpAQCAtODEsNDcgKzg4LDQ0IEBACiAJCQkJCXU4IGFkciwKIAkJCQkJdTggKnJidWYpCiB7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSD/cGlhZGlzLT5zcGk7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHNwaWFkaXMtPnNwaTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjEsIHhmZXIyOwogCXU4ICpidWYsICpyeDsKIAlpbnQgcmV0OwogCi0JYnVmIP9tYWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiD/TlVMTCkKKwlidWYgPSBremFsbG9jKDQsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyeCD/emFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChyeCD/TlVMTCkgewotCQlyZXQg/0VOT01FTTsKKwlyeCA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfYnVmOwogCX0KIAotCWJ1ZlswXSD6ZHI7Ci0JYnVmWzFdIPB4MDA7Ci0JYnVmWzJdIPB4MDA7Ci0JYnVmWzNdIPB4MDA7CisJYnVmWzBdID0gYWRyOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKIAltZW1zZXQoJnhmZXIxLCAwLCBzaXplb2YoeGZlcjEpKTsKIAltZW1zZXQoJnhmZXIyLCAwLCBzaXplb2YoeGZlcjIpKTsKIAotCXhmZXIxLnR4X2J1ZiD7dWY7Ci0JeGZlcjEucnhfYnVmIPt1ZiArIDI7Ci0JeGZlcjEubGVuIPI7Ci0JeGZlcjEuZGVsYXlfdXNlY3Mg+TsKKwl4ZmVyMS50eF9idWYgPSBidWY7CisJeGZlcjEucnhfYnVmID0gYnVmICsgMjsKKwl4ZmVyMS5sZW4gPSAyOworCXhmZXIxLmRlbGF5X3VzZWNzID0gOTsKIAotCXhmZXIyLnR4X2J1ZiD/eCArIDI7Ci0JeGZlcjIucnhfYnVmIP94OwotCXhmZXIyLmxlbiDyOworCXhmZXIyLnR4X2J1ZiA9IHJ4ICsgMjsKKwl4ZmVyMi5yeF9idWYgPSByeDsKKwl4ZmVyMi5sZW4gPSAyOwogCiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIxLCAmbXNnKTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjIsICZtc2cpOwogCi0JcmV0IP9waV9zeW5jKHNwaSwgJm1zZyk7Ci0JaWYgKHJldCD/MCkgewotCQlyYnVmWzBdIP94WzBdOwotCQlyYnVmWzFdIP94WzFdOworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJidWZbMF0gPSByeFswXTsKKwkJcmJ1ZlsxXSA9IHJ4WzFdOwogCX0KIAogCWtmcmVlKHJ4KTsKQEAgLTEzNiwxOSArMTQwLDE5IEBACiAJCQkJCXU4IGFkcjIsCiAJCQkJCXU4ICp3YnVmKQogewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkg/3BpYWRpcy0+c3BpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBzcGlhZGlzLT5zcGk7CiAJc3RydWN0IHNwaV9tZXNzYWdlICAgbXNnOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgIHhmZXIxLCB4ZmVyMjsKIAl1OCAgICAgICAqYnVmLCAqcng7CiAJaW50ICAgICAgICAgcmV0OwogCi0JYnVmIP9tYWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiD/TlVMTCkKKwlidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyeCD/emFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChyeCD/TlVMTCkgewotCQlyZXQg/0VOT01FTTsKKwlyeCA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfYnVmOwogCX0KIApAQCAtMTU2LDI3ICsxNjAsMjcgQEAKIAltZW1zZXQoJnhmZXIxLCAwLCBzaXplb2YoeGZlcjEpKTsKIAltZW1zZXQoJnhmZXIyLCAwLCBzaXplb2YoeGZlcjIpKTsKIAotCWJ1ZlswXSD6ZHIxIHwgMHg4MDsKLQlidWZbMV0g/3didWY7CisJYnVmWzBdID0gYWRyMSB8IDB4ODA7CisJYnVmWzFdID0gKndidWY7CiAKLQlidWZbMl0g+mRyMiB8IDB4ODA7Ci0JYnVmWzNdIP8od2J1ZiArIDEpOworCWJ1ZlsyXSA9IGFkcjIgfCAweDgwOworCWJ1ZlszXSA9ICood2J1ZiArIDEpOwogCi0JeGZlcjEudHhfYnVmIPt1ZjsKLQl4ZmVyMS5yeF9idWYg/3g7Ci0JeGZlcjEubGVuIPI7Ci0JeGZlcjEuZGVsYXlfdXNlY3Mg+TsKKwl4ZmVyMS50eF9idWYgPSBidWY7CisJeGZlcjEucnhfYnVmID0gcng7CisJeGZlcjEubGVuID0gMjsKKwl4ZmVyMS5kZWxheV91c2VjcyA9IDk7CiAKLQl4ZmVyMi50eF9idWYg+3VmKzI7Ci0JeGZlcjIucnhfYnVmIP94KzI7Ci0JeGZlcjIubGVuIPI7CisJeGZlcjIudHhfYnVmID0gYnVmKzI7CisJeGZlcjIucnhfYnVmID0gcngrMjsKKwl4ZmVyMi5sZW4gPSAyOwogCiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIxLCAmbXNnKTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjIsICZtc2cpOwogCi0JcmV0IP9waV9zeW5jKHNwaSwgJm1zZyk7Ci0JaWYgKHJldCAh8CkKLQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAid2lydGUgZGF0YSB0byAlI3ggJSN4IGZhaWxlZFxuIiwKKwlyZXQgPSBzcGlfc3luYyhzcGksICZtc2cpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAid3JpdGUgZGF0YSB0byAlI3ggJSN4IGZhaWxlZFxuIiwKIAkJCQlidWZbMF0sIGJ1ZlsyXSk7CiAKIAlrZnJlZShyeCk7CkBAIC0xODksMjkgKzE5MywzMSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYWRpc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzIP1ldl9pZDsKKwlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2lkOwogCWludCBzdGF0dXM7Ci0JdTE2IHZhbHVlOworCXUxNiB2YWx1ZSA9IDA7CiAKLQlzdGF0dXMg/3NwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfR1lST19PVVQsICh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyD/MCkgewotCQkvKiBwZXJmb3JtIG9uIG5ldyBkYXRhIG9ubHkuLi4gKi8KLQkJaWYgKHZhbHVlICYgMHg4MDAwKSB7Ci0JCQkvKiBkZWxldGUgZXJyb3IgYW5kIG5ldyBkYXRhIGJpdCAqLwotCQkJdmFsdWUg/2FsdWUgJiAweDNmZmY7Ci0JCQkvKiBzZXQgbmVnYXRpdmUgdmFsdWUgKi8KLQkJCWlmICh2YWx1ZSAmIDB4MjAwMCkKLQkJCQl2YWx1ZSD/YWx1ZSB8IDB4ZTAwMDsKLQotCQkJaWYgKGxpa2VseShzcGlhZGlzLT5uZWdhdGl2ZSkpCi0JCQkJdmFsdWUg/3ZhbHVlOwotCi0JCQlzcGlhZGlzLT5kYXRhIP9zMTYpIHZhbHVlOwotCQl9Ci0JfSBlbHNlIHsKKwlzdGF0dXMgPSAgc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19HWVJPX09VVCwgKHU4ICopJnZhbHVlKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKIAkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU1BJIEZBSUxFRFxuIik7CisJCWdvdG8gZXhpdDsKIAl9CiAKKwkvKiBwZXJmb3JtIG9uIG5ldyBkYXRhIG9ubHkuLi4gKi8KKwlpZiAodmFsdWUgJiAweDgwMDApIHsKKwkJLyogZGVsZXRlIGVycm9yIGFuZCBuZXcgZGF0YSBiaXQgKi8KKwkJdmFsdWUgPSB2YWx1ZSAmIDB4M2ZmZjsKKwkJLyogc2V0IG5lZ2F0aXZlIHZhbHVlICovCisJCWlmICh2YWx1ZSAmIDB4MjAwMCkKKwkJCXZhbHVlID0gdmFsdWUgfCAweGUwMDA7CisKKwkJaWYgKGxpa2VseShzcGlhZGlzLT5uZWdhdGl2ZSkpCisJCQl2YWx1ZSA9IC12YWx1ZTsKKworCQlzcGlhZGlzLT5kYXRhID0gKHMxNikgdmFsdWU7CisJfQorCitleGl0OgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMjIxLDcgKzIyNyw3IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKIAkJY2hhciAqYnVmKQogewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMg/WV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzcGlhZGlzLT5kYXRhKTsKIH0KIERFVklDRV9BVFRSKGRhdGEsIFNfSVJVR08gLCBhZGlzMTYyNTVfc2hvd19kYXRhLCBOVUxMKTsKQEAgLTIzMCwxMjIgKzIzNiw1MyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCiAJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzIP1ldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlY1xuIiwgc3BpYWRpcy0+ZGlyZWN0aW9uKTsKIH0KIERFVklDRV9BVFRSKGRpcmVjdGlvbiwgU19JUlVHTyAsIGFkaXMxNjI1NV9zaG93X2RpcmVjdGlvbiwgTlVMTCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNTVfYXR0cmlidXRlc1tdIP8KK3NzaXplX3QgYWRpczE2MjU1X3Nob3dfc2FtcGxlX3JhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJaW50IHN0YXR1cyA9IDA7CisJdTE2IHZhbHVlID0gMDsKKwlpbnQgdHMgPSAwOworCisJc3RhdHVzID0gc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19TTVBMX1BSRF9NU0IsCisJCQkJKHU4ICopJnZhbHVlKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbHVlICYgMHg4MCkgeworCQkvKiB0aW1lYmFzZSA9IDYwLjU0IG1zICovCisJCXRzID0gNjA1NDAgKiAoKDB4N2YgJiB2YWx1ZSkgKyAxKTsKKwl9IGVsc2UgeworCQkvKiB0aW1lYmFzZSA9IDEuOTUzIG1zICovCisJCXRzID0gMTk1MyAqICgoMHg3ZiAmIHZhbHVlKSArIDEpOworCX0KKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAoMTAwMCoxMDAwKS90cyk7Cit9CitERVZJQ0VfQVRUUihzYW1wbGVfcmF0ZSwgU19JUlVHTyAsIGFkaXMxNjI1NV9zaG93X3NhbXBsZV9yYXRlLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI1NV9hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2RhdGEuYXR0ciwKIAkmZGV2X2F0dHJfZGlyZWN0aW9uLmF0dHIsCisJJmRldl9hdHRyX3NhbXBsZV9yYXRlLmF0dHIsCiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjU1X2F0dHJfZ3JvdXAg/wotCS5hdHRycyD6ZGlzMTYyNTVfYXR0cmlidXRlcywKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI1NV9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjI1NV9hdHRyaWJ1dGVzLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBzcGlfYWRpczE2MjU1X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcykKIHsKLQotI2RlZmluZSBBRF9DSEsoX3NzKVwKLQlkbyB7XAotCQlzdGF0dXMg/3NzO1wKLQkJaWYgKHN0YXR1cyAh8ClcCi0JCQlnb3RvIGlycV9lcnI7XAotCX0gd2hpbGUgKDApOwotCi0Jc3RydWN0IGFkaXMxNjI1NV9pbml0X2RhdGEgKmluaXRfZGF0YSD/cGktPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgICpzcGlhZGlzOwotCWludCBzdGF0dXMg8DsKLQl1MTYgdmFsdWU7Ci0KLQlzcGlhZGlzIP96YWxsb2Moc2l6ZW9mKCpzcGlhZGlzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcGlhZGlzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaWFkaXMtPnNwaSD/cGk7Ci0Jc3BpYWRpcy0+aXJxX2FkaXMg/25pdF9kYXRhLT5pcnE7Ci0Jc3BpYWRpcy0+ZGlyZWN0aW9uIP9uaXRfZGF0YS0+ZGlyZWN0aW9uOwotCi0JaWYgKGluaXRfZGF0YS0+bmVnYXRpdmUpCi0JCXNwaWFkaXMtPm5lZ2F0aXZlIPE7Ci0KLQlzdGF0dXMg/3Bpb19yZXF1ZXN0KHNwaWFkaXMtPmlycV9hZGlzLCAiYWRpczE2MjU1Iik7Ci0JaWYgKHN0YXR1cyAh8CkKLQkJZ290byBlcnI7Ci0KLQlzdGF0dXMg/3Bpb19kaXJlY3Rpb25faW5wdXQoc3BpYWRpcy0+aXJxX2FkaXMpOwotCWlmIChzdGF0dXMgIfApCi0JCWdvdG8gZ3Bpb19lcnI7Ci0KLQlzcGlhZGlzLT5pcnEg/3Bpb190b19pcnEoc3BpYWRpcy0+aXJxX2FkaXMpOwotCi0Jc3RhdHVzIP9lcXVlc3RfdGhyZWFkZWRfaXJxKHNwaWFkaXMtPmlycSwKLQkJCU5VTEwsIGFkaXNfaXJxX3RocmVhZCwKLQkJCUlSUUZfRElTQUJMRUQsICJhZGlzLWRyaXZlciIsIHNwaWFkaXMpOwotCi0JaWYgKHN0YXR1cyAh8CkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIklSUSByZXF1ZXN0IGZhaWxlZFxuIik7Ci0JCWdvdG8gZ3Bpb19lcnI7Ci0JfQotCi0JZGV2X2RiZygmc3BpLT5kZXYsICJHUElPICVkIElSUSAlZFxuIiwgc3BpYWRpcy0+aXJxX2FkaXMsIHNwaWFkaXMtPmlycSk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBzcGlhZGlzKTsKLQlBRF9DSEsoc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmYWRpczE2MjU1X2F0dHJfZ3JvdXApKTsKLQotCWRldl9pbmZvKCZzcGktPmRldiwgInNwaV9hZGlzMTYyNTUgZHJpdmVyIGFkZGVkIVxuIik7Ci0KLQlBRF9DSEsoc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19TVVBQTFlfT1VULCAodTggKikmdmFsdWUpKTsKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJzZW5zb3Igd29ya3Mgd2l0aCAlZCBtViAoJS40eCkhXG4iLAotCQkJKCh2YWx1ZSAmIDB4MGZmZikqMTgzMTUpLzEwMDAwLAotCQkJKHZhbHVlICYgMHgwZmZmKSk7Ci0KLQlBRF9DSEsoc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19HWVJPX1NDQUxFLCAodTggKikmdmFsdWUpKTsKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJhZGlzIEdZUk9fU0NBTEUgaXMgJS40eFxuIiwgdmFsdWUpOwotCi0JQURfQ0hLKHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfU1RBVFVTLCAodTggKikmdmFsdWUpKTsKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJhZGlzIFNUQVRVUyBpcyAlLjR4XG4iLCB2YWx1ZSk7Ci0KLQkvKiB0aW1lYmFzZSDxLjk1MyBtcywgTnMg8CAtPiA1MTIgSHogc2FtcGxlIHJhdGUgKi8KLQl2YWx1ZSD/MHgwMDAxOwotCUFEX0NISyhzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCQlBRElTX1NNUExfUFJEX01TQiwgQURJU19TTVBMX1BSRF9MU0IsCi0JCQkJKHU4ICopJnZhbHVlKSk7Ci0JdmFsdWUg8HgwMDAwOwotCUFEX0NISyhzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX1NNUExfUFJEX01TQiwKLQkJCQkodTggKikmdmFsdWUpKTsKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJhZGlzIFNNUF9QUkQgaXMgJS40eFxuIiwgdmFsdWUpOwotCi0JLyogc2V0IGludGVycnVwdCBvbiBuZXcgZGF0YS4uLiAqLwotCXZhbHVlIPB4MDAwNjsKLQlBRF9DSEsoc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQkJQURJU19NU0NfQ1RSTF9NU0IsIEFESVNfTVNDX0NUUkxfTFNCLAotCQkJCSh1OCAqKSZ2YWx1ZSkpOwotCXZhbHVlIPB4MDAwMDsKLQlBRF9DSEsoc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19NU0NfQ1RSTF9NU0IsCi0JCQkJKHU4ICopJnZhbHVlKSk7Ci0JZGV2X2luZm8oJnNwaS0+ZGV2LCAiYWRpcyBNU0NfQ09OVFJPTCBpcyAlLjR4XG4iLCB2YWx1ZSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotCi1pcnFfZXJyOgotCWZyZWVfaXJxKHNwaWFkaXMtPmlycSwgc3BpYWRpcyk7Ci1ncGlvX2VycjoKLQlncGlvX2ZyZWUoc3BpYWRpcy0+aXJxX2FkaXMpOwotZXJyOgotCWtmcmVlKHNwaWFkaXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX2FkaXMxNjI1NV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQl1MTYgdmFsdWUg8DsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICAqc3BpYWRpcyAgICD9ZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKLQorCXUxNiB2YWx1ZSA9IDA7CiAJLyogdHVybiBzZW5zb3Igb2ZmICovCiAJc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCiAJCQlBRElTX1NNUExfUFJEX01TQiwgQURJU19TTVBMX1BSRF9MU0IsCkBAIC0zNTMsMTIgKzI5MCwxNDUgQEAKIAlzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKIAkJCUFESVNfTVNDX0NUUkxfTVNCLCBBRElTX01TQ19DVFJMX0xTQiwKIAkJCSh1OCAqKSZ2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CiAKLQlkZXZfaW5mbygmc3BpLT5kZXYsICJ1bnJlZ2lzdGVyOiBHUElPICVkIElSUSAlZFxuIiwKLQkJc3BpYWRpcy0+aXJxX2FkaXMsIHNwaWFkaXMtPmlycSk7CitzdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfYnJpbmd1cChzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzKQoreworCWludCBzdGF0dXMgPSAwOworCXUxNiB2YWx1ZSA9IDA7CisKKwlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX0dZUk9fU0NBTEUsCisJCQkJKHU4ICopJnZhbHVlKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZXJyOworCWlmICh2YWx1ZSAhPSAweDA4MDApIHsKKwkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2NhbGUgZmFjdG9yIGlzIG5vbmUgZGVmYXVsdCIKKwkJCQkidmFsdWUgKCUuNHgpXG4iLCB2YWx1ZSk7CisJfQorCisJLyogdGltZWJhc2UgPSAxLjk1MyBtcywgTnMgPSAwIC0+IDUxMiBIeiBzYW1wbGUgcmF0ZSAqLworCXZhbHVlID0gIDB4MDAwMTsKKwlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKKwkJCQlBRElTX1NNUExfUFJEX01TQiwgQURJU19TTVBMX1BSRF9MU0IsCisJCQkJKHU4ICopJnZhbHVlKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZXJyOworCisJLyogc3RhcnQgaW50ZXJuYWwgc2VsZi10ZXN0ICovCisJdmFsdWUgPSAweDA0MDA7CisJc3RhdHVzID0gc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCisJCQkJQURJU19NU0NfQ1RSTF9NU0IsIEFESVNfTVNDX0NUUkxfTFNCLAorCQkJCSh1OCAqKSZ2YWx1ZSk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGVycjsKKworCS8qIHdhaXQgMzUgbXMgdG8gZmluaXNoIHNlbGYtdGVzdCAqLworCW1zbGVlcCgzNSk7CisKKwl2YWx1ZSA9IDB4MDAwMDsKKwlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX1NUQVRVUywKKwkJCQkodTggKikmdmFsdWUpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBlcnI7CisKKwlpZiAodmFsdWUgJiAweDIzKSB7CisJCWlmICh2YWx1ZSAmIDB4MjApIHsKKwkJCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgInNlbGYtdGVzdCBlcnJvclxuIik7CisJCQlzdGF0dXMgPSAtRU5PREVWOworCQkJZ290byBlcnI7CisJCX0gZWxzZSBpZiAodmFsdWUgJiAweDMpCXsKKwkJCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgIlNlbnNvciB2b2x0YWdlIgorCQkJCQkJIm91dCBvZiByYW5nZS5cbiIpOworCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogc2V0IGludGVycnVwdCB0byBhY3RpdmUgaGlnaCBvbiBESU8wIHdoZW4gZGF0YSByZWFkeSAqLworCXZhbHVlID0gMHgwMDA2OworCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAorCQkJCUFESVNfTVNDX0NUUkxfTVNCLCBBRElTX01TQ19DVFJMX0xTQiwKKwkJCQkodTggKikmdmFsdWUpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBlcnI7CisJcmV0dXJuIHN0YXR1czsKKworZXJyOgorCXNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3BpYWRpcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzcGlfYWRpczE2MjU1X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisKKwlzdHJ1Y3QgYWRpczE2MjU1X2luaXRfZGF0YSAqaW5pdF9kYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICAqc3BpYWRpczsKKwlpbnQgc3RhdHVzID0gMDsKKworCXNwaWFkaXMgPSBremFsbG9jKHNpemVvZigqc3BpYWRpcyksIEdGUF9LRVJORUwpOworCWlmICghc3BpYWRpcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGlhZGlzLT5zcGkgPSBzcGk7CisJc3BpYWRpcy0+ZGlyZWN0aW9uID0gaW5pdF9kYXRhLT5kaXJlY3Rpb247CisKKwlpZiAoaW5pdF9kYXRhLT5uZWdhdGl2ZSkKKwkJc3BpYWRpcy0+bmVnYXRpdmUgPSAxOworCisJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGluaXRfZGF0YS0+aXJxLCAiYWRpczE2MjU1Iik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGVycjsKKworCXN0YXR1cyA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGluaXRfZGF0YS0+aXJxKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZ3Bpb19lcnI7CisKKwlzcGlhZGlzLT5pcnEgPSBncGlvX3RvX2lycShpbml0X2RhdGEtPmlycSk7CisKKwlzdGF0dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzcGlhZGlzLT5pcnEsCisJCQlOVUxMLCBhZGlzX2lycV90aHJlYWQsCisJCQlJUlFGX0RJU0FCTEVELCAiYWRpcy1kcml2ZXIiLCBzcGlhZGlzKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIklSUSByZXF1ZXN0IGZhaWxlZFxuIik7CisJCWdvdG8gZ3Bpb19lcnI7CisJfQorCisJZGV2X2RiZygmc3BpLT5kZXYsICJHUElPICVkIElSUSAlZFxuIiwgaW5pdF9kYXRhLT5pcnEsIHNwaWFkaXMtPmlycSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBzcGlhZGlzKTsKKwlzdGF0dXMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNwaS0+ZGV2LmtvYmosICZhZGlzMTYyNTVfYXR0cl9ncm91cCk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGlycV9lcnI7CisKKwlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X2JyaW5ndXAoc3BpYWRpcyk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGlycV9lcnI7CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJzcGlfYWRpczE2MjU1IGRyaXZlciBhZGRlZCFcbiIpOworCisJcmV0dXJuIHN0YXR1czsKKworaXJxX2VycjoKKwlmcmVlX2lycShzcGlhZGlzLT5pcnEsIHNwaWFkaXMpOworZ3Bpb19lcnI6CisJZ3Bpb19mcmVlKGluaXRfZGF0YS0+aXJxKTsKK2VycjoKKwlrZnJlZShzcGlhZGlzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAgKnNwaWFkaXMgICAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCXNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3BpYWRpcyk7CiAKIAlmcmVlX2lycShzcGlhZGlzLT5pcnEsIHNwaWFkaXMpOwotCWdwaW9fZnJlZShzcGlhZGlzLT5pcnFfYWRpcyk7CisJZ3Bpb19mcmVlKGlycV90b19ncGlvKHNwaWFkaXMtPmlycSkpOwogCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGlhZGlzLT5zcGktPmRldi5rb2JqLCAmYWRpczE2MjU1X2F0dHJfZ3JvdXApOwogCkBAIC0zNjgsMTMgKzQzOCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3BpX2FkaXMxNjI1NV9kcnYg/wotCS5kcml2ZXIg/wotCQkubmFtZSD/InNwaV9hZGlzMTYyNTUiLAotCQkub3duZXIg/0hJU19NT0RVTEUsCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3BpX2FkaXMxNjI1NV9kcnYgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAgInNwaV9hZGlzMTYyNTUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAotCS5wcm9iZSD/cGlfYWRpczE2MjU1X3Byb2JlLAotCS5yZW1vdmUg/yBfX2RldmV4aXRfcChzcGlfYWRpczE2MjU1X3JlbW92ZSksCisJLnByb2JlID0gc3BpX2FkaXMxNjI1NV9wcm9iZSwKKwkucmVtb3ZlID0gICBfX2RldmV4aXRfcChzcGlfYWRpczE2MjU1X3JlbW92ZSksCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwo=